From 0be5304de8b476b22af966fc435643c9db4db26c Mon Sep 17 00:00:00 2001 From: rk18venom Date: Thu, 28 Oct 2021 10:59:58 -0700 Subject: [PATCH] task3 --- Rahul/task3/Crawler/crawler.py | 107 + Rahul/task3/Templates/base.html | 37 + Rahul/task3/Templates/home.html | 22 + Rahul/task3/Templates/search_result.html | 40 + Rahul/task3/app.py | 56 + Rahul/task3/images/logo.png | Bin 0 -> 195981 bytes .../Flask-2.0.2.dist-info/INSTALLER | 1 + .../Flask-2.0.2.dist-info/LICENSE.rst | 28 + .../Flask-2.0.2.dist-info/METADATA | 125 + .../Flask-2.0.2.dist-info/RECORD | 52 + .../Flask-2.0.2.dist-info/REQUESTED | 0 .../site-packages/Flask-2.0.2.dist-info/WHEEL | 5 + .../Flask-2.0.2.dist-info/entry_points.txt | 3 + .../Flask-2.0.2.dist-info/top_level.txt | 1 + .../Jinja2-3.0.2.dist-info/INSTALLER | 1 + .../Jinja2-3.0.2.dist-info/LICENSE.rst | 28 + .../Jinja2-3.0.2.dist-info/METADATA | 113 + .../Jinja2-3.0.2.dist-info/RECORD | 58 + .../Jinja2-3.0.2.dist-info/WHEEL | 5 + .../Jinja2-3.0.2.dist-info/entry_points.txt | 3 + .../Jinja2-3.0.2.dist-info/top_level.txt | 1 + .../MarkupSafe-2.0.1.dist-info/INSTALLER | 1 + .../MarkupSafe-2.0.1.dist-info/LICENSE.rst | 28 + .../MarkupSafe-2.0.1.dist-info/METADATA | 100 + .../MarkupSafe-2.0.1.dist-info/RECORD | 13 + .../MarkupSafe-2.0.1.dist-info/WHEEL | 5 + .../MarkupSafe-2.0.1.dist-info/top_level.txt | 1 + .../Werkzeug-2.0.2.dist-info/INSTALLER | 1 + .../Werkzeug-2.0.2.dist-info/LICENSE.rst | 28 + .../Werkzeug-2.0.2.dist-info/METADATA | 129 + .../Werkzeug-2.0.2.dist-info/RECORD | 111 + .../Werkzeug-2.0.2.dist-info/WHEEL | 5 + .../Werkzeug-2.0.2.dist-info/top_level.txt | 1 + .../site-packages/_distutils_hack/__init__.py | 128 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5103 bytes .../__pycache__/override.cpython-39.pyc | Bin 0 -> 235 bytes .../site-packages/_distutils_hack/override.py | 1 + .../beautifulsoup4-4.10.0.dist-info/AUTHORS | 49 + .../COPYING.txt | 27 + .../beautifulsoup4-4.10.0.dist-info/INSTALLER | 1 + .../beautifulsoup4-4.10.0.dist-info/LICENSE | 30 + .../beautifulsoup4-4.10.0.dist-info/METADATA | 120 + .../beautifulsoup4-4.10.0.dist-info/RECORD | 29 + .../beautifulsoup4-4.10.0.dist-info/REQUESTED | 0 .../beautifulsoup4-4.10.0.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../Lib/site-packages/bs4/__init__.py | 804 ++ .../bs4/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 23186 bytes .../bs4/__pycache__/dammit.cpython-39.pyc | Bin 0 -> 71372 bytes .../bs4/__pycache__/diagnose.cpython-39.pyc | Bin 0 -> 8463 bytes .../bs4/__pycache__/element.cpython-39.pyc | Bin 0 -> 65434 bytes .../bs4/__pycache__/formatter.cpython-39.pyc | Bin 0 -> 6176 bytes .../bs4/__pycache__/testing.cpython-39.pyc | Bin 0 -> 44341 bytes .../Lib/site-packages/bs4/builder/__init__.py | 520 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 15408 bytes .../__pycache__/_html5lib.cpython-39.pyc | Bin 0 -> 12498 bytes .../__pycache__/_htmlparser.cpython-39.pyc | Bin 0 -> 13071 bytes .../builder/__pycache__/_lxml.cpython-39.pyc | Bin 0 -> 9503 bytes .../site-packages/bs4/builder/_html5lib.py | 467 + .../site-packages/bs4/builder/_htmlparser.py | 492 + .../Lib/site-packages/bs4/builder/_lxml.py | 342 + .../pyvenv3.9/Lib/site-packages/bs4/dammit.py | 3338 +++++++ .../Lib/site-packages/bs4/diagnose.py | 242 + .../Lib/site-packages/bs4/element.py | 2255 +++++ .../Lib/site-packages/bs4/formatter.py | 165 + .../Lib/site-packages/bs4/testing.py | 1136 +++ .../Lib/site-packages/bson/__init__.py | 1274 +++ .../bson/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 36394 bytes .../bson/__pycache__/binary.cpython-39.pyc | Bin 0 -> 10017 bytes .../bson/__pycache__/code.cpython-39.pyc | Bin 0 -> 2919 bytes .../__pycache__/codec_options.cpython-39.pyc | Bin 0 -> 12422 bytes .../bson/__pycache__/dbref.cpython-39.pyc | Bin 0 -> 4507 bytes .../__pycache__/decimal128.cpython-39.pyc | Bin 0 -> 9750 bytes .../bson/__pycache__/errors.cpython-39.pyc | Bin 0 -> 1252 bytes .../bson/__pycache__/int64.cpython-39.pyc | Bin 0 -> 804 bytes .../bson/__pycache__/json_util.cpython-39.pyc | Bin 0 -> 23811 bytes .../bson/__pycache__/max_key.cpython-39.pyc | Bin 0 -> 1545 bytes .../bson/__pycache__/min_key.cpython-39.pyc | Bin 0 -> 1545 bytes .../bson/__pycache__/objectid.cpython-39.pyc | Bin 0 -> 9058 bytes .../bson/__pycache__/py3compat.cpython-39.pyc | Bin 0 -> 2648 bytes .../bson/__pycache__/raw_bson.cpython-39.pyc | Bin 0 -> 6013 bytes .../bson/__pycache__/regex.cpython-39.pyc | Bin 0 -> 4091 bytes .../bson/__pycache__/son.cpython-39.pyc | Bin 0 -> 6421 bytes .../bson/__pycache__/timestamp.cpython-39.pyc | Bin 0 -> 3902 bytes .../bson/__pycache__/tz_util.cpython-39.pyc | Bin 0 -> 1515 bytes .../bson/_cbson.cp39-win_amd64.pyd | Bin 0 -> 49152 bytes .../Lib/site-packages/bson/binary.py | 430 + .../pyvenv3.9/Lib/site-packages/bson/code.py | 99 + .../Lib/site-packages/bson/codec_options.py | 346 + .../pyvenv3.9/Lib/site-packages/bson/dbref.py | 135 + .../Lib/site-packages/bson/decimal128.py | 335 + .../Lib/site-packages/bson/errors.py | 40 + .../pyvenv3.9/Lib/site-packages/bson/int64.py | 34 + .../Lib/site-packages/bson/json_util.py | 863 ++ .../Lib/site-packages/bson/max_key.py | 50 + .../Lib/site-packages/bson/min_key.py | 50 + .../Lib/site-packages/bson/objectid.py | 299 + .../Lib/site-packages/bson/py3compat.py | 107 + .../Lib/site-packages/bson/raw_bson.py | 176 + .../pyvenv3.9/Lib/site-packages/bson/regex.py | 128 + .../pyvenv3.9/Lib/site-packages/bson/son.py | 200 + .../Lib/site-packages/bson/timestamp.py | 120 + .../Lib/site-packages/bson/tz_util.py | 52 + .../certifi-2021.10.8.dist-info/INSTALLER | 1 + .../certifi-2021.10.8.dist-info/LICENSE | 21 + .../certifi-2021.10.8.dist-info/METADATA | 83 + .../certifi-2021.10.8.dist-info/RECORD | 13 + .../certifi-2021.10.8.dist-info/WHEEL | 6 + .../certifi-2021.10.8.dist-info/top_level.txt | 1 + .../Lib/site-packages/certifi/__init__.py | 3 + .../Lib/site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 260 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 0 -> 425 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 0 -> 1151 bytes .../Lib/site-packages/certifi/cacert.pem | 4362 +++++++++ .../Lib/site-packages/certifi/core.py | 60 + .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 267 + .../charset_normalizer-2.0.7.dist-info/RECORD | 33 + .../charset_normalizer-2.0.7.dist-info/WHEEL | 5 + .../entry_points.txt | 3 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 47 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1567 bytes .../__pycache__/api.cpython-39.pyc | Bin 0 -> 9895 bytes .../__pycache__/cd.cpython-39.pyc | Bin 0 -> 8246 bytes .../__pycache__/constant.cpython-39.pyc | Bin 0 -> 13711 bytes .../__pycache__/legacy.cpython-39.pyc | Bin 0 -> 3037 bytes .../__pycache__/md.cpython-39.pyc | Bin 0 -> 14423 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 13185 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 7426 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 271 bytes .../site-packages/charset_normalizer/api.py | 528 + .../charset_normalizer/assets/__init__.py | 1244 +++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 7356 bytes .../site-packages/charset_normalizer/cd.py | 341 + .../charset_normalizer/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 191 bytes .../cli/__pycache__/normalizer.cpython-39.pyc | Bin 0 -> 6139 bytes .../charset_normalizer/cli/normalizer.py | 291 + .../charset_normalizer/constant.py | 496 + .../charset_normalizer/legacy.py | 95 + .../site-packages/charset_normalizer/md.py | 540 ++ .../charset_normalizer/models.py | 393 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 333 + .../charset_normalizer/version.py | 6 + .../click-8.0.3.dist-info/INSTALLER | 1 + .../click-8.0.3.dist-info/LICENSE.rst | 28 + .../click-8.0.3.dist-info/METADATA | 111 + .../click-8.0.3.dist-info/RECORD | 41 + .../site-packages/click-8.0.3.dist-info/WHEEL | 5 + .../click-8.0.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/click/__init__.py | 75 + .../click/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2692 bytes .../click/__pycache__/_compat.cpython-39.pyc | Bin 0 -> 16041 bytes .../__pycache__/_termui_impl.cpython-39.pyc | Bin 0 -> 16004 bytes .../__pycache__/_textwrap.cpython-39.pyc | Bin 0 -> 1534 bytes .../__pycache__/_unicodefun.cpython-39.pyc | Bin 0 -> 2329 bytes .../__pycache__/_winconsole.cpython-39.pyc | Bin 0 -> 7785 bytes .../click/__pycache__/core.cpython-39.pyc | Bin 0 -> 88513 bytes .../__pycache__/decorators.cpython-39.pyc | Bin 0 -> 14295 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 10133 bytes .../__pycache__/formatting.cpython-39.pyc | Bin 0 -> 9413 bytes .../click/__pycache__/globals.cpython-39.pyc | Bin 0 -> 2435 bytes .../click/__pycache__/parser.cpython-39.pyc | Bin 0 -> 13568 bytes .../shell_completion.cpython-39.pyc | Bin 0 -> 16687 bytes .../click/__pycache__/termui.cpython-39.pyc | Bin 0 -> 26569 bytes .../click/__pycache__/testing.cpython-39.pyc | Bin 0 -> 15117 bytes .../click/__pycache__/types.cpython-39.pyc | Bin 0 -> 32899 bytes .../click/__pycache__/utils.cpython-39.pyc | Bin 0 -> 17773 bytes .../Lib/site-packages/click/_compat.py | 627 ++ .../Lib/site-packages/click/_termui_impl.py | 718 ++ .../Lib/site-packages/click/_textwrap.py | 49 + .../Lib/site-packages/click/_unicodefun.py | 100 + .../Lib/site-packages/click/_winconsole.py | 279 + .../pyvenv3.9/Lib/site-packages/click/core.py | 2953 ++++++ .../Lib/site-packages/click/decorators.py | 436 + .../Lib/site-packages/click/exceptions.py | 287 + .../Lib/site-packages/click/formatting.py | 301 + .../Lib/site-packages/click/globals.py | 69 + .../Lib/site-packages/click/parser.py | 529 + .../Lib/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 581 ++ .../Lib/site-packages/click/termui.py | 809 ++ .../Lib/site-packages/click/testing.py | 479 + .../Lib/site-packages/click/types.py | 1052 ++ .../Lib/site-packages/click/utils.py | 579 ++ .../colorama-0.4.4.dist-info/INSTALLER | 1 + .../colorama-0.4.4.dist-info/LICENSE.txt | 27 + .../colorama-0.4.4.dist-info/METADATA | 415 + .../colorama-0.4.4.dist-info/RECORD | 18 + .../colorama-0.4.4.dist-info/WHEEL | 6 + .../colorama-0.4.4.dist-info/top_level.txt | 1 + .../Lib/site-packages/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 428 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 0 -> 3213 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 0 -> 7679 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 0 -> 1695 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 0 -> 3927 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 0 -> 4649 bytes .../Lib/site-packages/colorama/ansi.py | 102 + .../Lib/site-packages/colorama/ansitowin32.py | 258 + .../Lib/site-packages/colorama/initialise.py | 80 + .../Lib/site-packages/colorama/win32.py | 152 + .../Lib/site-packages/colorama/winterm.py | 169 + .../site-packages/distutils-precedence.pth | 1 + .../Lib/site-packages/flask/__init__.py | 46 + .../Lib/site-packages/flask/__main__.py | 3 + .../flask/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1883 bytes .../flask/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 214 bytes .../flask/__pycache__/app.cpython-39.pyc | Bin 0 -> 63234 bytes .../__pycache__/blueprints.cpython-39.pyc | Bin 0 -> 21933 bytes .../flask/__pycache__/cli.cpython-39.pyc | Bin 0 -> 27231 bytes .../flask/__pycache__/config.cpython-39.pyc | Bin 0 -> 11712 bytes .../flask/__pycache__/ctx.cpython-39.pyc | Bin 0 -> 15541 bytes .../__pycache__/debughelpers.cpython-39.pyc | Bin 0 -> 6482 bytes .../flask/__pycache__/globals.cpython-39.pyc | Bin 0 -> 1833 bytes .../flask/__pycache__/helpers.cpython-39.pyc | Bin 0 -> 27315 bytes .../flask/__pycache__/logging.cpython-39.pyc | Bin 0 -> 2450 bytes .../flask/__pycache__/scaffold.cpython-39.pyc | Bin 0 -> 24874 bytes .../flask/__pycache__/sessions.cpython-39.pyc | Bin 0 -> 13097 bytes .../flask/__pycache__/signals.cpython-39.pyc | Bin 0 -> 2370 bytes .../__pycache__/templating.cpython-39.pyc | Bin 0 -> 5551 bytes .../flask/__pycache__/testing.cpython-39.pyc | Bin 0 -> 9018 bytes .../flask/__pycache__/typing.cpython-39.pyc | Bin 0 -> 1775 bytes .../flask/__pycache__/views.cpython-39.pyc | Bin 0 -> 4982 bytes .../flask/__pycache__/wrappers.cpython-39.pyc | Bin 0 -> 5023 bytes .../pyvenv3.9/Lib/site-packages/flask/app.py | 2091 ++++ .../Lib/site-packages/flask/blueprints.py | 609 ++ .../pyvenv3.9/Lib/site-packages/flask/cli.py | 998 ++ .../Lib/site-packages/flask/config.py | 295 + .../pyvenv3.9/Lib/site-packages/flask/ctx.py | 480 + .../Lib/site-packages/flask/debughelpers.py | 172 + .../Lib/site-packages/flask/globals.py | 59 + .../Lib/site-packages/flask/helpers.py | 836 ++ .../Lib/site-packages/flask/json/__init__.py | 357 + .../json/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 11583 bytes .../flask/json/__pycache__/tag.cpython-39.pyc | Bin 0 -> 11465 bytes .../Lib/site-packages/flask/json/tag.py | 312 + .../Lib/site-packages/flask/logging.py | 74 + .../Lib/site-packages/flask/py.typed | 0 .../Lib/site-packages/flask/scaffold.py | 875 ++ .../Lib/site-packages/flask/sessions.py | 404 + .../Lib/site-packages/flask/signals.py | 56 + .../Lib/site-packages/flask/templating.py | 165 + .../Lib/site-packages/flask/testing.py | 280 + .../Lib/site-packages/flask/typing.py | 56 + .../Lib/site-packages/flask/views.py | 158 + .../Lib/site-packages/flask/wrappers.py | 167 + .../INSTALLER | 1 + .../LICENSE | 31 + .../METADATA | 33 + .../RECORD | 9 + .../REQUESTED | 0 .../flask_paginate-2021.10.26.dist-info/WHEEL | 6 + .../top_level.txt | 1 + .../site-packages/flask_paginate/__init__.py | 660 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 15400 bytes .../Lib/site-packages/gridfs/__init__.py | 941 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 34997 bytes .../gridfs/__pycache__/errors.cpython-39.pyc | Bin 0 -> 1059 bytes .../__pycache__/grid_file.cpython-39.pyc | Bin 0 -> 26673 bytes .../Lib/site-packages/gridfs/errors.py | 33 + .../Lib/site-packages/gridfs/grid_file.py | 856 ++ .../idna-3.3.dist-info/INSTALLER | 1 + .../idna-3.3.dist-info/LICENSE.md | 29 + .../site-packages/idna-3.3.dist-info/METADATA | 236 + .../site-packages/idna-3.3.dist-info/RECORD | 23 + .../site-packages/idna-3.3.dist-info/WHEEL | 5 + .../idna-3.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 832 bytes .../idna/__pycache__/codec.cpython-39.pyc | Bin 0 -> 3069 bytes .../idna/__pycache__/compat.cpython-39.pyc | Bin 0 -> 751 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 0 -> 9747 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 0 -> 23028 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 0 -> 1982 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 0 -> 196 bytes .../idna/__pycache__/uts46data.cpython-39.pyc | Bin 0 -> 151729 bytes .../pyvenv3.9/Lib/site-packages/idna/codec.py | 112 + .../Lib/site-packages/idna/compat.py | 13 + .../pyvenv3.9/Lib/site-packages/idna/core.py | 397 + .../Lib/site-packages/idna/idnadata.py | 2137 +++++ .../Lib/site-packages/idna/intranges.py | 54 + .../Lib/site-packages/idna/package_data.py | 2 + .../pyvenv3.9/Lib/site-packages/idna/py.typed | 0 .../Lib/site-packages/idna/uts46data.py | 8512 +++++++++++++++++ .../itsdangerous-2.0.1.dist-info/INSTALLER | 1 + .../itsdangerous-2.0.1.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.0.1.dist-info/METADATA | 96 + .../itsdangerous-2.0.1.dist-info/RECORD | 25 + .../itsdangerous-2.0.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1009 bytes .../__pycache__/_json.cpython-39.pyc | Bin 0 -> 1543 bytes .../__pycache__/encoding.cpython-39.pyc | Bin 0 -> 1855 bytes .../__pycache__/exc.cpython-39.pyc | Bin 0 -> 3436 bytes .../__pycache__/jws.cpython-39.pyc | Bin 0 -> 7583 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 0 -> 9738 bytes .../__pycache__/signer.cpython-39.pyc | Bin 0 -> 8435 bytes .../__pycache__/timed.cpython-39.pyc | Bin 0 -> 6356 bytes .../__pycache__/url_safe.cpython-39.pyc | Bin 0 -> 2704 bytes .../Lib/site-packages/itsdangerous/_json.py | 34 + .../site-packages/itsdangerous/encoding.py | 54 + .../Lib/site-packages/itsdangerous/exc.py | 107 + .../Lib/site-packages/itsdangerous/jws.py | 259 + .../Lib/site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../Lib/site-packages/itsdangerous/signer.py | 257 + .../Lib/site-packages/itsdangerous/timed.py | 227 + .../site-packages/itsdangerous/url_safe.py | 80 + .../Lib/site-packages/jinja2/__init__.py | 45 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1908 bytes .../__pycache__/_identifier.cpython-39.pyc | Bin 0 -> 1895 bytes .../__pycache__/async_utils.cpython-39.pyc | Bin 0 -> 2308 bytes .../jinja2/__pycache__/bccache.cpython-39.pyc | Bin 0 -> 13287 bytes .../__pycache__/compiler.cpython-39.pyc | Bin 0 -> 54216 bytes .../__pycache__/constants.cpython-39.pyc | Bin 0 -> 1539 bytes .../jinja2/__pycache__/debug.cpython-39.pyc | Bin 0 -> 5532 bytes .../__pycache__/defaults.cpython-39.pyc | Bin 0 -> 1339 bytes .../__pycache__/environment.cpython-39.pyc | Bin 0 -> 53445 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5580 bytes .../jinja2/__pycache__/ext.cpython-39.pyc | Bin 0 -> 26346 bytes .../jinja2/__pycache__/filters.cpython-39.pyc | Bin 0 -> 50012 bytes .../__pycache__/idtracking.cpython-39.pyc | Bin 0 -> 11113 bytes .../jinja2/__pycache__/lexer.cpython-39.pyc | Bin 0 -> 20310 bytes .../jinja2/__pycache__/loaders.cpython-39.pyc | Bin 0 -> 20273 bytes .../jinja2/__pycache__/meta.cpython-39.pyc | Bin 0 -> 3797 bytes .../__pycache__/nativetypes.cpython-39.pyc | Bin 0 -> 4786 bytes .../jinja2/__pycache__/nodes.cpython-39.pyc | Bin 0 -> 41005 bytes .../__pycache__/optimizer.cpython-39.pyc | Bin 0 -> 1928 bytes .../jinja2/__pycache__/parser.cpython-39.pyc | Bin 0 -> 27588 bytes .../jinja2/__pycache__/runtime.cpython-39.pyc | Bin 0 -> 33113 bytes .../jinja2/__pycache__/sandbox.cpython-39.pyc | Bin 0 -> 11919 bytes .../jinja2/__pycache__/tests.cpython-39.pyc | Bin 0 -> 6571 bytes .../jinja2/__pycache__/utils.cpython-39.pyc | Bin 0 -> 27445 bytes .../jinja2/__pycache__/visitor.cpython-39.pyc | Bin 0 -> 3893 bytes .../Lib/site-packages/jinja2/_identifier.py | 6 + .../Lib/site-packages/jinja2/async_utils.py | 68 + .../Lib/site-packages/jinja2/bccache.py | 364 + .../Lib/site-packages/jinja2/compiler.py | 1957 ++++ .../Lib/site-packages/jinja2/constants.py | 20 + .../Lib/site-packages/jinja2/debug.py | 279 + .../Lib/site-packages/jinja2/defaults.py | 48 + .../Lib/site-packages/jinja2/environment.py | 1674 ++++ .../Lib/site-packages/jinja2/exceptions.py | 166 + .../pyvenv3.9/Lib/site-packages/jinja2/ext.py | 879 ++ .../Lib/site-packages/jinja2/filters.py | 1824 ++++ .../Lib/site-packages/jinja2/idtracking.py | 318 + .../Lib/site-packages/jinja2/lexer.py | 869 ++ .../Lib/site-packages/jinja2/loaders.py | 644 ++ .../Lib/site-packages/jinja2/meta.py | 111 + .../Lib/site-packages/jinja2/nativetypes.py | 118 + .../Lib/site-packages/jinja2/nodes.py | 1205 +++ .../Lib/site-packages/jinja2/optimizer.py | 47 + .../Lib/site-packages/jinja2/parser.py | 1040 ++ .../Lib/site-packages/jinja2/py.typed | 0 .../Lib/site-packages/jinja2/runtime.py | 1104 +++ .../Lib/site-packages/jinja2/sandbox.py | 428 + .../Lib/site-packages/jinja2/tests.py | 255 + .../Lib/site-packages/jinja2/utils.py | 854 ++ .../Lib/site-packages/jinja2/visitor.py | 92 + .../lxml-4.6.3.dist-info/INSTALLER | 1 + .../lxml-4.6.3.dist-info/LICENSE.txt | 29 + .../lxml-4.6.3.dist-info/LICENSES.txt | 29 + .../lxml-4.6.3.dist-info/METADATA | 82 + .../site-packages/lxml-4.6.3.dist-info/RECORD | 169 + .../lxml-4.6.3.dist-info/REQUESTED | 0 .../site-packages/lxml-4.6.3.dist-info/WHEEL | 5 + .../lxml-4.6.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/lxml/ElementInclude.py | 244 + .../Lib/site-packages/lxml/__init__.py | 23 + .../__pycache__/ElementInclude.cpython-39.pyc | Bin 0 -> 3842 bytes .../lxml/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 696 bytes .../__pycache__/_elementpath.cpython-39.pyc | Bin 0 -> 6414 bytes .../lxml/__pycache__/builder.cpython-39.pyc | Bin 0 -> 5854 bytes .../lxml/__pycache__/cssselect.cpython-39.pyc | Bin 0 -> 3637 bytes .../__pycache__/doctestcompare.cpython-39.pyc | Bin 0 -> 13946 bytes .../__pycache__/pyclasslookup.cpython-39.pyc | Bin 0 -> 237 bytes .../lxml/__pycache__/sax.cpython-39.pyc | Bin 0 -> 8147 bytes .../__pycache__/usedoctest.cpython-39.pyc | Bin 0 -> 427 bytes .../lxml/_elementpath.cp39-win_amd64.pyd | Bin 0 -> 144896 bytes .../Lib/site-packages/lxml/_elementpath.py | 345 + .../lxml/builder.cp39-win_amd64.pyd | Bin 0 -> 81920 bytes .../Lib/site-packages/lxml/builder.py | 239 + .../Lib/site-packages/lxml/cssselect.py | 102 + .../Lib/site-packages/lxml/doctestcompare.py | 507 + .../lxml/etree.cp39-win_amd64.pyd | Bin 0 -> 3859968 bytes .../pyvenv3.9/Lib/site-packages/lxml/etree.h | 224 + .../Lib/site-packages/lxml/etree_api.h | 219 + .../site-packages/lxml/html/ElementSoup.py | 10 + .../Lib/site-packages/lxml/html/__init__.py | 1948 ++++ .../__pycache__/ElementSoup.cpython-39.pyc | Bin 0 -> 523 bytes .../html/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 56894 bytes .../__pycache__/_diffcommand.cpython-39.pyc | Bin 0 -> 2293 bytes .../__pycache__/_html5builder.cpython-39.pyc | Bin 0 -> 3605 bytes .../html/__pycache__/_setmixin.cpython-39.pyc | Bin 0 -> 2106 bytes .../html/__pycache__/builder.cpython-39.pyc | Bin 0 -> 2956 bytes .../html/__pycache__/clean.cpython-39.pyc | Bin 0 -> 17442 bytes .../lxml/html/__pycache__/defs.cpython-39.pyc | Bin 0 -> 2824 bytes .../lxml/html/__pycache__/diff.cpython-39.pyc | Bin 0 -> 24051 bytes .../html/__pycache__/formfill.cpython-39.pyc | Bin 0 -> 7400 bytes .../__pycache__/html5parser.cpython-39.pyc | Bin 0 -> 6481 bytes .../__pycache__/soupparser.cpython-39.pyc | Bin 0 -> 8006 bytes .../__pycache__/usedoctest.cpython-39.pyc | Bin 0 -> 449 bytes .../site-packages/lxml/html/_diffcommand.py | 88 + .../site-packages/lxml/html/_html5builder.py | 100 + .../Lib/site-packages/lxml/html/_setmixin.py | 56 + .../Lib/site-packages/lxml/html/builder.py | 133 + .../lxml/html/clean.cp39-win_amd64.pyd | Bin 0 -> 189952 bytes .../Lib/site-packages/lxml/html/clean.py | 779 ++ .../Lib/site-packages/lxml/html/defs.py | 135 + .../lxml/html/diff.cp39-win_amd64.pyd | Bin 0 -> 254464 bytes .../Lib/site-packages/lxml/html/diff.py | 884 ++ .../Lib/site-packages/lxml/html/formfill.py | 299 + .../site-packages/lxml/html/html5parser.py | 260 + .../Lib/site-packages/lxml/html/soupparser.py | 314 + .../Lib/site-packages/lxml/html/usedoctest.py | 13 + .../site-packages/lxml/includes/__init__.pxd | 0 .../site-packages/lxml/includes/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 182 bytes .../Lib/site-packages/lxml/includes/c14n.pxd | 26 + .../site-packages/lxml/includes/config.pxd | 3 + .../site-packages/lxml/includes/dtdvalid.pxd | 18 + .../site-packages/lxml/includes/etree_defs.h | 418 + .../lxml/includes/etreepublic.pxd | 237 + .../lxml/includes/htmlparser.pxd | 56 + .../lxml/includes/libexslt/exslt.h | 102 + .../lxml/includes/libexslt/exsltconfig.h | 73 + .../lxml/includes/libexslt/exsltexports.h | 140 + .../lxml/includes/libexslt/libexslt.h | 29 + .../lxml/includes/libxml/DOCBparser.h | 96 + .../lxml/includes/libxml/HTMLparser.h | 306 + .../lxml/includes/libxml/HTMLtree.h | 147 + .../site-packages/lxml/includes/libxml/SAX.h | 173 + .../site-packages/lxml/includes/libxml/SAX2.h | 178 + .../site-packages/lxml/includes/libxml/c14n.h | 126 + .../lxml/includes/libxml/catalog.h | 182 + .../lxml/includes/libxml/chvalid.h | 230 + .../lxml/includes/libxml/debugXML.h | 217 + .../site-packages/lxml/includes/libxml/dict.h | 86 + .../lxml/includes/libxml/encoding.h | 240 + .../lxml/includes/libxml/entities.h | 151 + .../lxml/includes/libxml/globals.h | 509 + .../site-packages/lxml/includes/libxml/hash.h | 233 + .../site-packages/lxml/includes/libxml/list.h | 137 + .../lxml/includes/libxml/nanoftp.h | 163 + .../lxml/includes/libxml/nanohttp.h | 81 + .../lxml/includes/libxml/parser.h | 1241 +++ .../lxml/includes/libxml/parserInternals.h | 644 ++ .../lxml/includes/libxml/pattern.h | 100 + .../lxml/includes/libxml/relaxng.h | 217 + .../lxml/includes/libxml/schemasInternals.h | 958 ++ .../lxml/includes/libxml/schematron.h | 142 + .../lxml/includes/libxml/threads.h | 84 + .../site-packages/lxml/includes/libxml/tree.h | 1311 +++ .../site-packages/lxml/includes/libxml/uri.h | 94 + .../lxml/includes/libxml/valid.h | 458 + .../lxml/includes/libxml/xinclude.h | 129 + .../lxml/includes/libxml/xlink.h | 189 + .../lxml/includes/libxml/xmlIO.h | 366 + .../lxml/includes/libxml/xmlautomata.h | 146 + .../lxml/includes/libxml/xmlerror.h | 945 ++ .../lxml/includes/libxml/xmlexports.h | 162 + .../lxml/includes/libxml/xmlmemory.h | 224 + .../lxml/includes/libxml/xmlmodule.h | 57 + .../lxml/includes/libxml/xmlreader.h | 428 + .../lxml/includes/libxml/xmlregexp.h | 222 + .../lxml/includes/libxml/xmlsave.h | 88 + .../lxml/includes/libxml/xmlschemas.h | 246 + .../lxml/includes/libxml/xmlschemastypes.h | 151 + .../lxml/includes/libxml/xmlstring.h | 140 + .../lxml/includes/libxml/xmlunicode.h | 202 + .../lxml/includes/libxml/xmlversion.h | 489 + .../lxml/includes/libxml/xmlwriter.h | 488 + .../lxml/includes/libxml/xpath.h | 557 ++ .../lxml/includes/libxml/xpathInternals.h | 632 ++ .../lxml/includes/libxml/xpointer.h | 114 + .../lxml/includes/libxslt/attributes.h | 38 + .../lxml/includes/libxslt/documents.h | 93 + .../lxml/includes/libxslt/extensions.h | 262 + .../lxml/includes/libxslt/extra.h | 72 + .../lxml/includes/libxslt/functions.h | 78 + .../lxml/includes/libxslt/imports.h | 75 + .../lxml/includes/libxslt/keys.h | 53 + .../lxml/includes/libxslt/libxslt.h | 36 + .../lxml/includes/libxslt/namespaces.h | 68 + .../lxml/includes/libxslt/numbersInternals.h | 73 + .../lxml/includes/libxslt/preproc.h | 43 + .../lxml/includes/libxslt/security.h | 104 + .../lxml/includes/libxslt/templates.h | 77 + .../lxml/includes/libxslt/transform.h | 207 + .../lxml/includes/libxslt/trio.h | 216 + .../lxml/includes/libxslt/triodef.h | 220 + .../lxml/includes/libxslt/variables.h | 126 + .../lxml/includes/libxslt/win32config.h | 129 + .../lxml/includes/libxslt/xslt.h | 110 + .../lxml/includes/libxslt/xsltInternals.h | 1982 ++++ .../lxml/includes/libxslt/xsltconfig.h | 183 + .../lxml/includes/libxslt/xsltexports.h | 142 + .../lxml/includes/libxslt/xsltlocale.h | 67 + .../lxml/includes/libxslt/xsltutils.h | 313 + .../lxml/includes/lxml-version.h | 3 + .../site-packages/lxml/includes/relaxng.pxd | 64 + .../lxml/includes/schematron.pxd | 34 + .../Lib/site-packages/lxml/includes/tree.pxd | 480 + .../Lib/site-packages/lxml/includes/uri.pxd | 5 + .../site-packages/lxml/includes/xinclude.pxd | 22 + .../site-packages/lxml/includes/xmlerror.pxd | 851 ++ .../site-packages/lxml/includes/xmlparser.pxd | 249 + .../site-packages/lxml/includes/xmlschema.pxd | 35 + .../Lib/site-packages/lxml/includes/xpath.pxd | 135 + .../Lib/site-packages/lxml/includes/xslt.pxd | 191 + .../lxml/isoschematron/__init__.py | 334 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9671 bytes .../resources/rng/iso-schematron.rng | 709 ++ .../resources/xsl/RNG2Schtrn.xsl | 75 + .../resources/xsl/XSD2Schtrn.xsl | 77 + .../iso_abstract_expand.xsl | 313 + .../iso-schematron-xslt1/iso_dsdl_include.xsl | 1160 +++ .../iso_schematron_message.xsl | 55 + .../iso_schematron_skeleton_for_xslt1.xsl | 1796 ++++ .../iso_svrl_for_xslt1.xsl | 588 ++ .../xsl/iso-schematron-xslt1/readme.txt | 84 + .../Lib/site-packages/lxml/lxml.etree.h | 224 + .../Lib/site-packages/lxml/lxml.etree_api.h | 219 + .../lxml/objectify.cp39-win_amd64.pyd | Bin 0 -> 1676800 bytes .../Lib/site-packages/lxml/pyclasslookup.py | 3 + .../site-packages/lxml/sax.cp39-win_amd64.pyd | Bin 0 -> 125440 bytes .../pyvenv3.9/Lib/site-packages/lxml/sax.py | 278 + .../Lib/site-packages/lxml/usedoctest.py | 13 + .../Lib/site-packages/markupsafe/__init__.py | 288 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 10684 bytes .../__pycache__/_native.cpython-39.pyc | Bin 0 -> 2331 bytes .../Lib/site-packages/markupsafe/_native.py | 75 + .../markupsafe/_speedups.cp39-win_amd64.pyd | Bin 0 -> 16384 bytes .../site-packages/markupsafe/_speedups.pyi | 9 + .../Lib/site-packages/markupsafe/py.typed | 0 .../pip-21.1.3.dist-info/INSTALLER | 1 + .../pip-21.1.3.dist-info/LICENSE.txt | 20 + .../pip-21.1.3.dist-info/METADATA | 91 + .../site-packages/pip-21.1.3.dist-info/RECORD | 797 ++ .../pip-21.1.3.dist-info/REQUESTED | 0 .../site-packages/pip-21.1.3.dist-info/WHEEL | 5 + .../pip-21.1.3.dist-info/entry_points.txt | 5 + .../pip-21.1.3.dist-info/top_level.txt | 1 + .../Lib/site-packages/pip/__init__.py | 14 + .../Lib/site-packages/pip/__main__.py | 31 + .../pip/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 587 bytes .../pip/__pycache__/__main__.cpython-39.pyc | Bin 0 -> 584 bytes .../site-packages/pip/_internal/__init__.py | 15 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 636 bytes .../__pycache__/build_env.cpython-39.pyc | Bin 0 -> 8949 bytes .../__pycache__/cache.cpython-39.pyc | Bin 0 -> 7839 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 0 -> 10691 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 15640 bytes .../_internal/__pycache__/main.cpython-39.pyc | Bin 0 -> 573 bytes .../__pycache__/pyproject.cpython-39.pyc | Bin 0 -> 3451 bytes .../self_outdated_check.cpython-39.pyc | Bin 0 -> 4336 bytes .../__pycache__/wheel_builder.cpython-39.pyc | Bin 0 -> 8274 bytes .../site-packages/pip/_internal/build_env.py | 286 + .../Lib/site-packages/pip/_internal/cache.py | 287 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 269 bytes .../__pycache__/autocompletion.cpython-39.pyc | Bin 0 -> 4967 bytes .../__pycache__/base_command.cpython-39.pyc | Bin 0 -> 5790 bytes .../cli/__pycache__/cmdoptions.cpython-39.pyc | Bin 0 -> 21024 bytes .../command_context.cpython-39.pyc | Bin 0 -> 1218 bytes .../cli/__pycache__/main.cpython-39.pyc | Bin 0 -> 1318 bytes .../__pycache__/main_parser.cpython-39.pyc | Bin 0 -> 2099 bytes .../cli/__pycache__/parser.cpython-39.pyc | Bin 0 -> 9363 bytes .../__pycache__/progress_bars.cpython-39.pyc | Bin 0 -> 7435 bytes .../__pycache__/req_command.cpython-39.pyc | Bin 0 -> 11278 bytes .../cli/__pycache__/spinners.cpython-39.pyc | Bin 0 -> 4606 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 348 bytes .../pip/_internal/cli/autocompletion.py | 162 + .../pip/_internal/cli/base_command.py | 221 + .../pip/_internal/cli/cmdoptions.py | 1024 ++ .../pip/_internal/cli/command_context.py | 30 + .../site-packages/pip/_internal/cli/main.py | 71 + .../pip/_internal/cli/main_parser.py | 89 + .../site-packages/pip/_internal/cli/parser.py | 305 + .../pip/_internal/cli/progress_bars.py | 261 + .../pip/_internal/cli/req_command.py | 462 + .../pip/_internal/cli/spinners.py | 172 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 110 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2862 bytes .../commands/__pycache__/cache.cpython-39.pyc | Bin 0 -> 5744 bytes .../commands/__pycache__/check.cpython-39.pyc | Bin 0 -> 1510 bytes .../__pycache__/completion.cpython-39.pyc | Bin 0 -> 3066 bytes .../__pycache__/configuration.cpython-39.pyc | Bin 0 -> 8047 bytes .../commands/__pycache__/debug.cpython-39.pyc | Bin 0 -> 6431 bytes .../__pycache__/download.cpython-39.pyc | Bin 0 -> 3917 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 0 -> 2915 bytes .../commands/__pycache__/hash.cpython-39.pyc | Bin 0 -> 2027 bytes .../commands/__pycache__/help.cpython-39.pyc | Bin 0 -> 1246 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 16693 bytes .../commands/__pycache__/list.cpython-39.pyc | Bin 0 -> 8804 bytes .../__pycache__/search.cpython-39.pyc | Bin 0 -> 4903 bytes .../commands/__pycache__/show.cpython-39.pyc | Bin 0 -> 6302 bytes .../__pycache__/uninstall.cpython-39.pyc | Bin 0 -> 2851 bytes .../commands/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 4790 bytes .../pip/_internal/commands/cache.py | 228 + .../pip/_internal/commands/check.py | 48 + .../pip/_internal/commands/completion.py | 93 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 215 + .../pip/_internal/commands/download.py | 141 + .../pip/_internal/commands/freeze.py | 104 + .../pip/_internal/commands/hash.py | 58 + .../pip/_internal/commands/help.py | 42 + .../pip/_internal/commands/install.py | 740 ++ .../pip/_internal/commands/list.py | 319 + .../pip/_internal/commands/search.py | 162 + .../pip/_internal/commands/show.py | 181 + .../pip/_internal/commands/uninstall.py | 92 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 403 + .../pip/_internal/distributions/__init__.py | 20 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 765 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 1821 bytes .../__pycache__/installed.cpython-39.pyc | Bin 0 -> 1166 bytes .../__pycache__/sdist.cpython-39.pyc | Bin 0 -> 3429 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 0 -> 1510 bytes .../pip/_internal/distributions/base.py | 39 + .../pip/_internal/distributions/installed.py | 22 + .../pip/_internal/distributions/sdist.py | 95 + .../pip/_internal/distributions/wheel.py | 34 + .../site-packages/pip/_internal/exceptions.py | 397 + .../pip/_internal/index/__init__.py | 2 + .../index/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 223 bytes .../__pycache__/collector.cpython-39.pyc | Bin 0 -> 15079 bytes .../__pycache__/package_finder.cpython-39.pyc | Bin 0 -> 26606 bytes .../index/__pycache__/sources.cpython-39.pyc | Bin 0 -> 7188 bytes .../pip/_internal/index/collector.py | 556 ++ .../pip/_internal/index/package_finder.py | 1012 ++ .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 184 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3679 bytes .../__pycache__/_distutils.cpython-39.pyc | Bin 0 -> 3876 bytes .../__pycache__/_sysconfig.cpython-39.pyc | Bin 0 -> 4494 bytes .../locations/__pycache__/base.cpython-39.pyc | Bin 0 -> 1207 bytes .../pip/_internal/locations/_distutils.py | 150 + .../pip/_internal/locations/_sysconfig.py | 180 + .../pip/_internal/locations/base.py | 48 + .../Lib/site-packages/pip/_internal/main.py | 13 + .../pip/_internal/metadata/__init__.py | 43 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1722 bytes .../metadata/__pycache__/base.cpython-39.pyc | Bin 0 -> 5296 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 0 -> 4250 bytes .../pip/_internal/metadata/base.py | 142 + .../pip/_internal/metadata/pkg_resources.py | 126 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 257 bytes .../__pycache__/candidate.cpython-39.pyc | Bin 0 -> 1370 bytes .../__pycache__/direct_url.cpython-39.pyc | Bin 0 -> 6283 bytes .../__pycache__/format_control.cpython-39.pyc | Bin 0 -> 2527 bytes .../models/__pycache__/index.cpython-39.pyc | Bin 0 -> 1180 bytes .../models/__pycache__/link.cpython-39.pyc | Bin 0 -> 7184 bytes .../models/__pycache__/scheme.cpython-39.pyc | Bin 0 -> 935 bytes .../__pycache__/search_scope.cpython-39.pyc | Bin 0 -> 3336 bytes .../selection_prefs.cpython-39.pyc | Bin 0 -> 1570 bytes .../__pycache__/target_python.cpython-39.pyc | Bin 0 -> 3267 bytes .../models/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 4182 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 233 + .../pip/_internal/models/format_control.py | 86 + .../pip/_internal/models/index.py | 34 + .../pip/_internal/models/link.py | 248 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 131 + .../pip/_internal/models/selection_prefs.py | 47 + .../pip/_internal/models/target_python.py | 114 + .../pip/_internal/models/wheel.py | 95 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 245 bytes .../network/__pycache__/auth.cpython-39.pyc | Bin 0 -> 7042 bytes .../network/__pycache__/cache.cpython-39.pyc | Bin 0 -> 2724 bytes .../__pycache__/download.cpython-39.pyc | Bin 0 -> 5084 bytes .../__pycache__/lazy_wheel.cpython-39.pyc | Bin 0 -> 7909 bytes .../__pycache__/session.cpython-39.pyc | Bin 0 -> 9492 bytes .../network/__pycache__/utils.cpython-39.pyc | Bin 0 -> 1311 bytes .../network/__pycache__/xmlrpc.cpython-39.pyc | Bin 0 -> 1890 bytes .../pip/_internal/network/auth.py | 312 + .../pip/_internal/network/cache.py | 76 + .../pip/_internal/network/download.py | 196 + .../pip/_internal/network/lazy_wheel.py | 224 + .../pip/_internal/network/session.py | 449 + .../pip/_internal/network/utils.py | 95 + .../pip/_internal/network/xmlrpc.py | 49 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 193 bytes .../__pycache__/check.cpython-39.pyc | Bin 0 -> 3689 bytes .../__pycache__/freeze.cpython-39.pyc | Bin 0 -> 5642 bytes .../__pycache__/prepare.cpython-39.pyc | Bin 0 -> 14229 bytes .../_internal/operations/build/__init__.py | 0 .../build/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 199 bytes .../build/__pycache__/metadata.cpython-39.pyc | Bin 0 -> 1145 bytes .../metadata_legacy.cpython-39.pyc | Bin 0 -> 1919 bytes .../build/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 1124 bytes .../__pycache__/wheel_legacy.cpython-39.pyc | Bin 0 -> 2518 bytes .../_internal/operations/build/metadata.py | 35 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 38 + .../operations/build/wheel_legacy.py | 110 + .../pip/_internal/operations/check.py | 153 + .../pip/_internal/operations/freeze.py | 264 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 257 bytes .../editable_legacy.cpython-39.pyc | Bin 0 -> 1300 bytes .../install/__pycache__/legacy.cpython-39.pyc | Bin 0 -> 3188 bytes .../install/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 20810 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 125 + .../pip/_internal/operations/install/wheel.py | 819 ++ .../pip/_internal/operations/prepare.py | 655 ++ .../site-packages/pip/_internal/pyproject.py | 183 + .../pip/_internal/req/__init__.py | 98 + .../req/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2340 bytes .../__pycache__/constructors.cpython-39.pyc | Bin 0 -> 11000 bytes .../req/__pycache__/req_file.cpython-39.pyc | Bin 0 -> 12433 bytes .../__pycache__/req_install.cpython-39.pyc | Bin 0 -> 20511 bytes .../req/__pycache__/req_set.cpython-39.pyc | Bin 0 -> 5677 bytes .../__pycache__/req_tracker.cpython-39.pyc | Bin 0 -> 4022 bytes .../__pycache__/req_uninstall.cpython-39.pyc | Bin 0 -> 17458 bytes .../pip/_internal/req/constructors.py | 486 + .../pip/_internal/req/req_file.py | 551 ++ .../pip/_internal/req/req_install.py | 878 ++ .../pip/_internal/req/req_set.py | 199 + .../pip/_internal/req/req_tracker.py | 140 + .../pip/_internal/req/req_uninstall.py | 640 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 193 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 936 bytes .../pip/_internal/resolution/base.py | 16 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 200 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 0 -> 11473 bytes .../_internal/resolution/legacy/resolver.py | 462 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 204 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 6306 bytes .../__pycache__/candidates.cpython-39.pyc | Bin 0 -> 17886 bytes .../__pycache__/factory.cpython-39.pyc | Bin 0 -> 16353 bytes .../found_candidates.cpython-39.pyc | Bin 0 -> 4652 bytes .../__pycache__/provider.cpython-39.pyc | Bin 0 -> 6572 bytes .../__pycache__/reporter.cpython-39.pyc | Bin 0 -> 3136 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 7041 bytes .../__pycache__/resolver.cpython-39.pyc | Bin 0 -> 8048 bytes .../_internal/resolution/resolvelib/base.py | 165 + .../resolution/resolvelib/candidates.py | 604 ++ .../resolution/resolvelib/factory.py | 661 ++ .../resolution/resolvelib/found_candidates.py | 145 + .../resolution/resolvelib/provider.py | 175 + .../resolution/resolvelib/reporter.py | 78 + .../resolution/resolvelib/requirements.py | 198 + .../resolution/resolvelib/resolver.py | 305 + .../pip/_internal/self_outdated_check.py | 187 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 188 bytes .../utils/__pycache__/appdirs.cpython-39.pyc | Bin 0 -> 1253 bytes .../utils/__pycache__/compat.cpython-39.pyc | Bin 0 -> 1455 bytes .../compatibility_tags.cpython-39.pyc | Bin 0 -> 3831 bytes .../utils/__pycache__/datetime.cpython-39.pyc | Bin 0 -> 459 bytes .../__pycache__/deprecation.cpython-39.pyc | Bin 0 -> 2754 bytes .../direct_url_helpers.cpython-39.pyc | Bin 0 -> 2508 bytes .../__pycache__/distutils_args.cpython-39.pyc | Bin 0 -> 1053 bytes .../utils/__pycache__/encoding.cpython-39.pyc | Bin 0 -> 1218 bytes .../__pycache__/entrypoints.cpython-39.pyc | Bin 0 -> 1257 bytes .../__pycache__/filesystem.cpython-39.pyc | Bin 0 -> 4927 bytes .../__pycache__/filetypes.cpython-39.pyc | Bin 0 -> 800 bytes .../utils/__pycache__/glibc.cpython-39.pyc | Bin 0 -> 1610 bytes .../utils/__pycache__/hashes.cpython-39.pyc | Bin 0 -> 4992 bytes .../inject_securetransport.cpython-39.pyc | Bin 0 -> 961 bytes .../utils/__pycache__/logging.cpython-39.pyc | Bin 0 -> 8912 bytes .../utils/__pycache__/misc.cpython-39.pyc | Bin 0 -> 21516 bytes .../utils/__pycache__/models.cpython-39.pyc | Bin 0 -> 1892 bytes .../__pycache__/packaging.cpython-39.pyc | Bin 0 -> 2516 bytes .../utils/__pycache__/parallel.cpython-39.pyc | Bin 0 -> 3033 bytes .../__pycache__/pkg_resources.cpython-39.pyc | Bin 0 -> 1714 bytes .../setuptools_build.cpython-39.pyc | Bin 0 -> 2958 bytes .../__pycache__/subprocess.cpython-39.pyc | Bin 0 -> 5681 bytes .../utils/__pycache__/temp_dir.cpython-39.pyc | Bin 0 -> 6832 bytes .../__pycache__/unpacking.cpython-39.pyc | Bin 0 -> 6453 bytes .../utils/__pycache__/urls.cpython-39.pyc | Bin 0 -> 1344 bytes .../__pycache__/virtualenv.cpython-39.pyc | Bin 0 -> 3211 bytes .../utils/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 5962 bytes .../pip/_internal/utils/appdirs.py | 38 + .../pip/_internal/utils/compat.py | 65 + .../pip/_internal/utils/compatibility_tags.py | 174 + .../pip/_internal/utils/datetime.py | 12 + .../pip/_internal/utils/deprecation.py | 102 + .../pip/_internal/utils/direct_url_helpers.py | 117 + .../pip/_internal/utils/distutils_args.py | 43 + .../pip/_internal/utils/encoding.py | 37 + .../pip/_internal/utils/entrypoints.py | 28 + .../pip/_internal/utils/filesystem.py | 193 + .../pip/_internal/utils/filetypes.py | 28 + .../pip/_internal/utils/glibc.py | 92 + .../pip/_internal/utils/hashes.py | 165 + .../_internal/utils/inject_securetransport.py | 36 + .../pip/_internal/utils/logging.py | 387 + .../site-packages/pip/_internal/utils/misc.py | 821 ++ .../pip/_internal/utils/models.py | 47 + .../pip/_internal/utils/packaging.py | 89 + .../pip/_internal/utils/parallel.py | 101 + .../pip/_internal/utils/pkg_resources.py | 40 + .../pip/_internal/utils/setuptools_build.py | 173 + .../pip/_internal/utils/subprocess.py | 281 + .../pip/_internal/utils/temp_dir.py | 260 + .../pip/_internal/utils/unpacking.py | 267 + .../site-packages/pip/_internal/utils/urls.py | 49 + .../pip/_internal/utils/virtualenv.py | 111 + .../pip/_internal/utils/wheel.py | 189 + .../pip/_internal/vcs/__init__.py | 14 + .../vcs/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 481 bytes .../vcs/__pycache__/bazaar.cpython-39.pyc | Bin 0 -> 2997 bytes .../vcs/__pycache__/git.cpython-39.pyc | Bin 0 -> 9973 bytes .../vcs/__pycache__/mercurial.cpython-39.pyc | Bin 0 -> 4618 bytes .../vcs/__pycache__/subversion.cpython-39.pyc | Bin 0 -> 7952 bytes .../__pycache__/versioncontrol.cpython-39.pyc | Bin 0 -> 19097 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 96 + .../site-packages/pip/_internal/vcs/git.py | 450 + .../pip/_internal/vcs/mercurial.py | 158 + .../pip/_internal/vcs/subversion.py | 329 + .../pip/_internal/vcs/versioncontrol.py | 715 ++ .../pip/_internal/wheel_builder.py | 360 + .../Lib/site-packages/pip/_vendor/__init__.py | 113 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2943 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 0 -> 21396 bytes .../_vendor/__pycache__/distro.cpython-39.pyc | Bin 0 -> 36875 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 0 -> 240432 bytes .../_vendor/__pycache__/six.cpython-39.pyc | Bin 0 -> 26942 bytes .../Lib/site-packages/pip/_vendor/appdirs.py | 633 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 546 bytes .../__pycache__/_cmd.cpython-39.pyc | Bin 0 -> 1567 bytes .../__pycache__/adapter.cpython-39.pyc | Bin 0 -> 3072 bytes .../__pycache__/cache.cpython-39.pyc | Bin 0 -> 1819 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 743 bytes .../__pycache__/controller.cpython-39.pyc | Bin 0 -> 7760 bytes .../__pycache__/filewrapper.cpython-39.pyc | Bin 0 -> 2168 bytes .../__pycache__/heuristics.cpython-39.pyc | Bin 0 -> 4700 bytes .../__pycache__/serialize.cpython-39.pyc | Bin 0 -> 4219 bytes .../__pycache__/wrapper.cpython-39.pyc | Bin 0 -> 670 bytes .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 290 bytes .../__pycache__/file_cache.cpython-39.pyc | Bin 0 -> 3306 bytes .../__pycache__/redis_cache.cpython-39.pyc | Bin 0 -> 1562 bytes .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 376 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 188 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 272 bytes .../__pycache__/__main__.cpython-39.pyc | Bin 0 -> 449 bytes .../certifi/__pycache__/core.cpython-39.pyc | Bin 0 -> 1540 bytes .../pip/_vendor/certifi/cacert.pem | 4325 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 76 + .../pip/_vendor/chardet/__init__.py | 83 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1896 bytes .../__pycache__/big5freq.cpython-39.pyc | Bin 0 -> 27175 bytes .../__pycache__/big5prober.cpython-39.pyc | Bin 0 -> 1130 bytes .../chardistribution.cpython-39.pyc | Bin 0 -> 6216 bytes .../charsetgroupprober.cpython-39.pyc | Bin 0 -> 2257 bytes .../__pycache__/charsetprober.cpython-39.pyc | Bin 0 -> 3479 bytes .../codingstatemachine.cpython-39.pyc | Bin 0 -> 2906 bytes .../chardet/__pycache__/compat.cpython-39.pyc | Bin 0 -> 395 bytes .../__pycache__/cp949prober.cpython-39.pyc | Bin 0 -> 1137 bytes .../chardet/__pycache__/enums.cpython-39.pyc | Bin 0 -> 2644 bytes .../__pycache__/escprober.cpython-39.pyc | Bin 0 -> 2629 bytes .../chardet/__pycache__/escsm.cpython-39.pyc | Bin 0 -> 7078 bytes .../__pycache__/eucjpprober.cpython-39.pyc | Bin 0 -> 2443 bytes .../__pycache__/euckrfreq.cpython-39.pyc | Bin 0 -> 12059 bytes .../__pycache__/euckrprober.cpython-39.pyc | Bin 0 -> 1138 bytes .../__pycache__/euctwfreq.cpython-39.pyc | Bin 0 -> 27179 bytes .../__pycache__/euctwprober.cpython-39.pyc | Bin 0 -> 1138 bytes .../__pycache__/gb2312freq.cpython-39.pyc | Bin 0 -> 19103 bytes .../__pycache__/gb2312prober.cpython-39.pyc | Bin 0 -> 1146 bytes .../__pycache__/hebrewprober.cpython-39.pyc | Bin 0 -> 3015 bytes .../__pycache__/jisfreq.cpython-39.pyc | Bin 0 -> 22131 bytes .../chardet/__pycache__/jpcntx.cpython-39.pyc | Bin 0 -> 37604 bytes .../langbulgarianmodel.cpython-39.pyc | Bin 0 -> 21806 bytes .../__pycache__/langgreekmodel.cpython-39.pyc | Bin 0 -> 20482 bytes .../langhebrewmodel.cpython-39.pyc | Bin 0 -> 20550 bytes .../langhungarianmodel.cpython-39.pyc | Bin 0 -> 21751 bytes .../langrussianmodel.cpython-39.pyc | Bin 0 -> 26354 bytes .../__pycache__/langthaimodel.cpython-39.pyc | Bin 0 -> 20726 bytes .../langturkishmodel.cpython-39.pyc | Bin 0 -> 20566 bytes .../__pycache__/latin1prober.cpython-39.pyc | Bin 0 -> 2951 bytes .../mbcharsetprober.cpython-39.pyc | Bin 0 -> 2258 bytes .../mbcsgroupprober.cpython-39.pyc | Bin 0 -> 1127 bytes .../chardet/__pycache__/mbcssm.cpython-39.pyc | Bin 0 -> 15714 bytes .../sbcharsetprober.cpython-39.pyc | Bin 0 -> 3111 bytes .../sbcsgroupprober.cpython-39.pyc | Bin 0 -> 1696 bytes .../__pycache__/sjisprober.cpython-39.pyc | Bin 0 -> 2479 bytes .../universaldetector.cpython-39.pyc | Bin 0 -> 5827 bytes .../__pycache__/utf8prober.cpython-39.pyc | Bin 0 -> 1988 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 435 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 107 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 192 bytes .../cli/__pycache__/chardetect.cpython-39.pyc | Bin 0 -> 2686 bytes .../pip/_vendor/chardet/cli/chardetect.py | 84 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 36 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4398 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4383 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4650 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5718 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4383 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4383 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 197 bytes .../__pycache__/languages.cpython-39.pyc | Bin 0 -> 7928 bytes .../pip/_vendor/chardet/metadata/languages.py | 310 + .../pip/_vendor/chardet/sbcharsetprober.py | 145 + .../pip/_vendor/chardet/sbcsgroupprober.py | 83 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 440 bytes .../colorama/__pycache__/ansi.cpython-39.pyc | Bin 0 -> 3225 bytes .../__pycache__/ansitowin32.cpython-39.pyc | Bin 0 -> 7691 bytes .../__pycache__/initialise.cpython-39.pyc | Bin 0 -> 1707 bytes .../colorama/__pycache__/win32.cpython-39.pyc | Bin 0 -> 3939 bytes .../__pycache__/winterm.cpython-39.pyc | Bin 0 -> 4661 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 258 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1053 bytes .../distlib/__pycache__/compat.cpython-39.pyc | Bin 0 -> 32155 bytes .../__pycache__/database.cpython-39.pyc | Bin 0 -> 42477 bytes .../distlib/__pycache__/index.cpython-39.pyc | Bin 0 -> 17498 bytes .../__pycache__/locators.cpython-39.pyc | Bin 0 -> 38486 bytes .../__pycache__/manifest.cpython-39.pyc | Bin 0 -> 10189 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 4480 bytes .../__pycache__/metadata.cpython-39.pyc | Bin 0 -> 26406 bytes .../__pycache__/resources.cpython-39.pyc | Bin 0 -> 11019 bytes .../__pycache__/scripts.cpython-39.pyc | Bin 0 -> 10927 bytes .../distlib/__pycache__/util.cpython-39.pyc | Bin 0 -> 48199 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 20304 bytes .../distlib/__pycache__/wheel.cpython-39.pyc | Bin 0 -> 26388 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 480 bytes .../_backport/__pycache__/misc.cpython-39.pyc | Bin 0 -> 1100 bytes .../__pycache__/shutil.cpython-39.pyc | Bin 0 -> 21674 bytes .../__pycache__/sysconfig.cpython-39.pyc | Bin 0 -> 15964 bytes .../__pycache__/tarfile.cpython-39.pyc | Bin 0 -> 62728 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 764 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 +++++ .../pip/_vendor/distlib/compat.py | 1120 +++ .../pip/_vendor/distlib/database.py | 1339 +++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1302 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1056 ++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 419 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1761 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1018 ++ .../Lib/site-packages/pip/_vendor/distro.py | 1230 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1299 bytes .../__pycache__/_ihatexml.cpython-39.pyc | Bin 0 -> 13768 bytes .../__pycache__/_inputstream.cpython-39.pyc | Bin 0 -> 21627 bytes .../__pycache__/_tokenizer.cpython-39.pyc | Bin 0 -> 39722 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 0 -> 4799 bytes .../__pycache__/constants.cpython-39.pyc | Bin 0 -> 66337 bytes .../__pycache__/html5parser.cpython-39.pyc | Bin 0 -> 91008 bytes .../__pycache__/serializer.cpython-39.pyc | Bin 0 -> 10810 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_inputstream.py | 918 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++++ .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../_trie/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 349 bytes .../_trie/__pycache__/_base.cpython-39.pyc | Bin 0 -> 1593 bytes .../_trie/__pycache__/py.cpython-39.pyc | Bin 0 -> 2254 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/constants.py | 2946 ++++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 197 bytes .../alphabeticalattributes.cpython-39.pyc | Bin 0 -> 1319 bytes .../filters/__pycache__/base.cpython-39.pyc | Bin 0 -> 867 bytes .../inject_meta_charset.cpython-39.pyc | Bin 0 -> 1873 bytes .../filters/__pycache__/lint.cpython-39.pyc | Bin 0 -> 2615 bytes .../__pycache__/optionaltags.cpython-39.pyc | Bin 0 -> 2760 bytes .../__pycache__/sanitizer.cpython-39.pyc | Bin 0 -> 16883 bytes .../__pycache__/whitespace.cpython-39.pyc | Bin 0 -> 1365 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 916 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2795 ++++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 934 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 0 -> 1542 bytes .../__pycache__/sax.cpython-39.pyc | Bin 0 -> 1461 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3329 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 11313 bytes .../__pycache__/dom.cpython-39.pyc | Bin 0 -> 9450 bytes .../__pycache__/etree.cpython-39.pyc | Bin 0 -> 11818 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 0 -> 13001 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 343 + .../html5lib/treebuilders/etree_lxml.py | 392 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3995 bytes .../__pycache__/base.cpython-39.pyc | Bin 0 -> 6994 bytes .../__pycache__/dom.cpython-39.pyc | Bin 0 -> 1729 bytes .../__pycache__/etree.cpython-39.pyc | Bin 0 -> 3491 bytes .../__pycache__/etree_lxml.cpython-39.pyc | Bin 0 -> 6628 bytes .../__pycache__/genshi.cpython-39.pyc | Bin 0 -> 1885 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../html5lib/treewalkers/etree_lxml.py | 215 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 254 bytes .../idna/__pycache__/codec.cpython-39.pyc | Bin 0 -> 2788 bytes .../idna/__pycache__/compat.cpython-39.pyc | Bin 0 -> 626 bytes .../idna/__pycache__/core.cpython-39.pyc | Bin 0 -> 9082 bytes .../idna/__pycache__/idnadata.cpython-39.pyc | Bin 0 -> 22135 bytes .../idna/__pycache__/intranges.cpython-39.pyc | Bin 0 -> 1806 bytes .../__pycache__/package_data.cpython-39.pyc | Bin 0 -> 208 bytes .../idna/__pycache__/uts46data.cpython-39.pyc | Bin 0 -> 146143 bytes .../site-packages/pip/_vendor/idna/codec.py | 110 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 2050 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8356 ++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1411 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 215 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 1849 bytes .../msgpack/__pycache__/ext.cpython-39.pyc | Bin 0 -> 6277 bytes .../__pycache__/fallback.cpython-39.pyc | Bin 0 -> 26723 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1087 +++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 686 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 542 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 1140 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2894 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 1497 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9268 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 4141 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 20923 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 18540 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 3608 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 12672 bytes .../pip/_vendor/packaging/_compat.py | 38 + .../pip/_vendor/packaging/_structures.py | 86 + .../pip/_vendor/packaging/_typing.py | 48 + .../pip/_vendor/packaging/markers.py | 336 + .../pip/_vendor/packaging/requirements.py | 160 + .../pip/_vendor/packaging/specifiers.py | 864 ++ .../pip/_vendor/packaging/tags.py | 866 ++ .../pip/_vendor/packaging/utils.py | 138 + .../pip/_vendor/packaging/version.py | 556 ++ .../pip/_vendor/pep517/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 310 bytes .../pep517/__pycache__/build.cpython-39.pyc | Bin 0 -> 3559 bytes .../pep517/__pycache__/check.cpython-39.pyc | Bin 0 -> 5094 bytes .../__pycache__/colorlog.cpython-39.pyc | Bin 0 -> 2935 bytes .../pep517/__pycache__/compat.cpython-39.pyc | Bin 0 -> 1112 bytes .../__pycache__/dirtools.cpython-39.pyc | Bin 0 -> 1344 bytes .../__pycache__/envbuild.cpython-39.pyc | Bin 0 -> 4477 bytes .../pep517/__pycache__/meta.cpython-39.pyc | Bin 0 -> 2917 bytes .../__pycache__/wrappers.cpython-39.pyc | Bin 0 -> 10477 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 206 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 34 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 167 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 912 bytes .../__pycache__/_in_process.cpython-39.pyc | Bin 0 -> 8274 bytes .../_vendor/pep517/in_process/_in_process.py | 280 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 318 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++++++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 100328 bytes .../__pycache__/py31compat.cpython-39.pyc | Bin 0 -> 647 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 177 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 5654 bytes .../progress/__pycache__/bar.cpython-39.pyc | Bin 0 -> 2636 bytes .../__pycache__/counter.cpython-39.pyc | Bin 0 -> 1470 bytes .../__pycache__/spinner.cpython-39.pyc | Bin 0 -> 1387 bytes .../site-packages/pip/_vendor/progress/bar.py | 91 + .../pip/_vendor/progress/counter.py | 41 + .../pip/_vendor/progress/spinner.py | 43 + .../site-packages/pip/_vendor/pyparsing.py | 7107 ++++++++++++++ .../pip/_vendor/requests/__init__.py | 142 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3666 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 0 -> 552 bytes .../_internal_utils.cpython-39.pyc | Bin 0 -> 1299 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 0 -> 16970 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 0 -> 6756 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 0 -> 8328 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 0 -> 630 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 1609 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 0 -> 18819 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5242 bytes .../requests/__pycache__/help.cpython-39.pyc | Bin 0 -> 2713 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 0 -> 987 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 23936 bytes .../__pycache__/packages.cpython-39.pyc | Bin 0 -> 499 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 0 -> 19841 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 4236 bytes .../__pycache__/structures.cpython-39.pyc | Bin 0 -> 4457 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 0 -> 22614 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../site-packages/pip/_vendor/requests/api.py | 161 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 76 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 123 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 956 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 781 ++ .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 992 ++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 603 bytes .../__pycache__/providers.cpython-39.pyc | Bin 0 -> 6523 bytes .../__pycache__/reporters.cpython-39.pyc | Bin 0 -> 2299 bytes .../__pycache__/resolvers.cpython-39.pyc | Bin 0 -> 15194 bytes .../__pycache__/structs.cpython-39.pyc | Bin 0 -> 6917 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 198 bytes .../collections_abc.cpython-39.pyc | Bin 0 -> 372 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 124 + .../pip/_vendor/resolvelib/reporters.py | 37 + .../pip/_vendor/resolvelib/resolvers.py | 474 + .../pip/_vendor/resolvelib/structs.py | 153 + .../Lib/site-packages/pip/_vendor/six.py | 982 ++ .../pip/_vendor/tenacity/__init__.py | 525 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 14675 bytes .../__pycache__/_asyncio.cpython-39.pyc | Bin 0 -> 2200 bytes .../__pycache__/_utils.cpython-39.pyc | Bin 0 -> 3948 bytes .../tenacity/__pycache__/after.cpython-39.pyc | Bin 0 -> 975 bytes .../__pycache__/before.cpython-39.pyc | Bin 0 -> 871 bytes .../__pycache__/before_sleep.cpython-39.pyc | Bin 0 -> 1219 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 955 bytes .../tenacity/__pycache__/nap.cpython-39.pyc | Bin 0 -> 1024 bytes .../tenacity/__pycache__/retry.cpython-39.pyc | Bin 0 -> 7409 bytes .../tenacity/__pycache__/stop.cpython-39.pyc | Bin 0 -> 3785 bytes .../__pycache__/tornadoweb.cpython-39.pyc | Bin 0 -> 1339 bytes .../tenacity/__pycache__/wait.cpython-39.pyc | Bin 0 -> 7342 bytes .../pip/_vendor/tenacity/_asyncio.py | 81 + .../pip/_vendor/tenacity/_utils.py | 159 + .../pip/_vendor/tenacity/after.py | 40 + .../pip/_vendor/tenacity/before.py | 35 + .../pip/_vendor/tenacity/before_sleep.py | 51 + .../pip/_vendor/tenacity/compat.py | 23 + .../site-packages/pip/_vendor/tenacity/nap.py | 40 + .../pip/_vendor/tenacity/retry.py | 192 + .../pip/_vendor/tenacity/stop.py | 95 + .../pip/_vendor/tenacity/tornadoweb.py | 49 + .../pip/_vendor/tenacity/wait.py | 183 + .../pip/_vendor/toml/__init__.py | 25 + .../toml/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 729 bytes .../toml/__pycache__/decoder.cpython-39.pyc | Bin 0 -> 23221 bytes .../toml/__pycache__/encoder.cpython-39.pyc | Bin 0 -> 9404 bytes .../toml/__pycache__/ordered.cpython-39.pyc | Bin 0 -> 968 bytes .../toml/__pycache__/tz.cpython-39.pyc | Bin 0 -> 1270 bytes .../site-packages/pip/_vendor/toml/decoder.py | 1057 ++ .../site-packages/pip/_vendor/toml/encoder.py | 304 + .../site-packages/pip/_vendor/toml/ordered.py | 15 + .../Lib/site-packages/pip/_vendor/toml/tz.py | 24 + .../pip/_vendor/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2186 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 10781 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 210 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 13366 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 0 -> 24465 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 11643 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 0 -> 8158 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 0 -> 2759 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 0 -> 15161 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 5622 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 20833 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 539 ++ .../pip/_vendor/urllib3/connectionpool.py | 1067 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 196 bytes .../_appengine_environ.cpython-39.pyc | Bin 0 -> 1416 bytes .../__pycache__/appengine.cpython-39.pyc | Bin 0 -> 8269 bytes .../__pycache__/ntlmpool.cpython-39.pyc | Bin 0 -> 3261 bytes .../__pycache__/pyopenssl.cpython-39.pyc | Bin 0 -> 15528 bytes .../securetransport.cpython-39.pyc | Bin 0 -> 21840 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 0 -> 5632 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 213 bytes .../__pycache__/bindings.cpython-39.pyc | Bin 0 -> 10720 bytes .../__pycache__/low_level.cpython-39.pyc | Bin 0 -> 9169 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 396 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 121 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 509 + .../urllib3/contrib/securetransport.py | 920 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 310 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 0 -> 26514 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 207 bytes .../__pycache__/makefile.cpython-39.pyc | Bin 0 -> 1305 bytes .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1021 ++ .../packages/ssl_match_hostname/__init__.py | 22 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 547 bytes .../_implementation.cpython-39.pyc | Bin 0 -> 3300 bytes .../ssl_match_hostname/_implementation.py | 160 + .../pip/_vendor/urllib3/poolmanager.py | 536 ++ .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 821 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1106 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 3460 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 0 -> 1342 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 0 -> 1061 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 0 -> 3449 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 0 -> 2346 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 0 -> 15963 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 0 -> 11024 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 0 -> 7512 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 0 -> 8944 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 0 -> 10620 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 0 -> 3129 bytes .../pip/_vendor/urllib3/util/connection.py | 150 + .../pip/_vendor/urllib3/util/proxy.py | 56 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 143 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 602 ++ .../pip/_vendor/urllib3/util/ssl_.py | 474 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 430 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../Lib/site-packages/pip/_vendor/vendor.txt | 22 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 9720 bytes .../__pycache__/labels.cpython-39.pyc | Bin 0 -> 3834 bytes .../__pycache__/mklabels.cpython-39.pyc | Bin 0 -> 1904 bytes .../__pycache__/tests.cpython-39.pyc | Bin 0 -> 5068 bytes .../__pycache__/x_user_defined.cpython-39.pyc | Bin 0 -> 2664 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../pyvenv3.9/Lib/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3288 +++++++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 100436 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 190 bytes .../__pycache__/appdirs.cpython-39.pyc | Bin 0 -> 20507 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 0 -> 201343 bytes .../pkg_resources/_vendor/appdirs.py | 608 ++ .../_vendor/packaging/__about__.py | 27 + .../_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 706 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 552 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 1150 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2904 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 1495 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9311 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 4088 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 20587 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 17266 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1657 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 13324 bytes .../_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../_vendor/packaging/_typing.py | 48 + .../_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 ++ .../pkg_resources/_vendor/packaging/tags.py | 751 ++ .../pkg_resources/_vendor/packaging/utils.py | 65 + .../_vendor/packaging/version.py | 535 ++ .../pkg_resources/_vendor/pyparsing.py | 5742 +++++++++++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2879 bytes .../__pycache__/setup.cpython-39.pyc | Bin 0 -> 318 bytes .../data/my-test-package-source/setup.py | 6 + .../pymongo-3.12.1.dist-info/INSTALLER | 1 + .../pymongo-3.12.1.dist-info/LICENSE | 201 + .../pymongo-3.12.1.dist-info/METADATA | 285 + .../pymongo-3.12.1.dist-info/RECORD | 177 + .../pymongo-3.12.1.dist-info/REQUESTED | 0 .../pymongo-3.12.1.dist-info/WHEEL | 5 + .../pymongo-3.12.1.dist-info/top_level.txt | 3 + .../Lib/site-packages/pymongo/__init__.py | 134 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1571 bytes .../__pycache__/_ipaddress.cpython-39.pyc | Bin 0 -> 1027 bytes .../__pycache__/aggregation.cpython-39.pyc | Bin 0 -> 7050 bytes .../pymongo/__pycache__/auth.cpython-39.pyc | Bin 0 -> 16326 bytes .../__pycache__/auth_aws.cpython-39.pyc | Bin 0 -> 2569 bytes .../pymongo/__pycache__/bulk.cpython-39.pyc | Bin 0 -> 19351 bytes .../__pycache__/change_stream.cpython-39.pyc | Bin 0 -> 13139 bytes .../__pycache__/client_options.cpython-39.pyc | Bin 0 -> 9208 bytes .../__pycache__/client_session.cpython-39.pyc | Bin 0 -> 34693 bytes .../__pycache__/collation.cpython-39.pyc | Bin 0 -> 6546 bytes .../__pycache__/collection.cpython-39.pyc | Bin 0 -> 127222 bytes .../__pycache__/command_cursor.cpython-39.pyc | Bin 0 -> 10148 bytes .../pymongo/__pycache__/common.cpython-39.pyc | Bin 0 -> 26583 bytes .../compression_support.cpython-39.pyc | Bin 0 -> 4153 bytes .../pymongo/__pycache__/cursor.cpython-39.pyc | Bin 0 -> 38795 bytes .../__pycache__/cursor_manager.cpython-39.pyc | Bin 0 -> 1952 bytes .../pymongo/__pycache__/daemon.cpython-39.pyc | Bin 0 -> 3196 bytes .../__pycache__/database.cpython-39.pyc | Bin 0 -> 64692 bytes .../__pycache__/driver_info.cpython-39.pyc | Bin 0 -> 1370 bytes .../__pycache__/encryption.cpython-39.pyc | Bin 0 -> 20328 bytes .../encryption_options.cpython-39.pyc | Bin 0 -> 7157 bytes .../pymongo/__pycache__/errors.cpython-39.pyc | Bin 0 -> 12507 bytes .../__pycache__/event_loggers.cpython-39.pyc | Bin 0 -> 9027 bytes .../pymongo/__pycache__/hello.cpython-39.pyc | Bin 0 -> 6415 bytes .../__pycache__/hello_compat.cpython-39.pyc | Bin 0 -> 539 bytes .../__pycache__/helpers.cpython-39.pyc | Bin 0 -> 6293 bytes .../__pycache__/ismaster.cpython-39.pyc | Bin 0 -> 733 bytes .../max_staleness_selectors.cpython-39.pyc | Bin 0 -> 2484 bytes .../__pycache__/message.cpython-39.pyc | Bin 0 -> 42723 bytes .../__pycache__/mongo_client.cpython-39.pyc | Bin 0 -> 90723 bytes .../mongo_replica_set_client.cpython-39.pyc | Bin 0 -> 1876 bytes .../__pycache__/monitor.cpython-39.pyc | Bin 0 -> 11597 bytes .../__pycache__/monitoring.cpython-39.pyc | Bin 0 -> 59228 bytes .../__pycache__/monotonic.cpython-39.pyc | Bin 0 -> 487 bytes .../__pycache__/network.cpython-39.pyc | Bin 0 -> 7453 bytes .../__pycache__/ocsp_cache.cpython-39.pyc | Bin 0 -> 2226 bytes .../__pycache__/ocsp_support.cpython-39.pyc | Bin 0 -> 8867 bytes .../__pycache__/operations.cpython-39.pyc | Bin 0 -> 16824 bytes .../periodic_executor.cpython-39.pyc | Bin 0 -> 4313 bytes .../pymongo/__pycache__/pool.cpython-39.pyc | Bin 0 -> 40460 bytes .../pyopenssl_context.cpython-39.pyc | Bin 0 -> 10100 bytes .../__pycache__/read_concern.cpython-39.pyc | Bin 0 -> 2317 bytes .../read_preferences.cpython-39.pyc | Bin 0 -> 18359 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 3743 bytes .../__pycache__/results.cpython-39.pyc | Bin 0 -> 8401 bytes .../__pycache__/saslprep.cpython-39.pyc | Bin 0 -> 2448 bytes .../pymongo/__pycache__/server.cpython-39.pyc | Bin 0 -> 5902 bytes .../__pycache__/server_api.cpython-39.pyc | Bin 0 -> 5581 bytes .../server_description.cpython-39.pyc | Bin 0 -> 8268 bytes .../server_selectors.cpython-39.pyc | Bin 0 -> 5763 bytes .../__pycache__/server_type.cpython-39.pyc | Bin 0 -> 440 bytes .../__pycache__/settings.cpython-39.pyc | Bin 0 -> 4812 bytes .../__pycache__/socket_checker.cpython-39.pyc | Bin 0 -> 2097 bytes .../son_manipulator.cpython-39.pyc | Bin 0 -> 7427 bytes .../__pycache__/srv_resolver.cpython-39.pyc | Bin 0 -> 3697 bytes .../__pycache__/ssl_context.cpython-39.pyc | Bin 0 -> 4138 bytes .../ssl_match_hostname.cpython-39.pyc | Bin 0 -> 2908 bytes .../__pycache__/ssl_support.cpython-39.pyc | Bin 0 -> 4442 bytes .../__pycache__/thread_util.cpython-39.pyc | Bin 0 -> 4266 bytes .../__pycache__/topology.cpython-39.pyc | Bin 0 -> 21894 bytes .../topology_description.cpython-39.pyc | Bin 0 -> 15295 bytes .../__pycache__/uri_parser.cpython-39.pyc | Bin 0 -> 14910 bytes .../__pycache__/write_concern.cpython-39.pyc | Bin 0 -> 4577 bytes .../pymongo/_cmessage.cp39-win_amd64.pyd | Bin 0 -> 31744 bytes .../Lib/site-packages/pymongo/_ipaddress.py | 56 + .../Lib/site-packages/pymongo/aggregation.py | 238 + .../Lib/site-packages/pymongo/auth.py | 677 ++ .../Lib/site-packages/pymongo/auth_aws.py | 85 + .../Lib/site-packages/pymongo/bulk.py | 713 ++ .../site-packages/pymongo/change_stream.py | 410 + .../site-packages/pymongo/client_options.py | 267 + .../site-packages/pymongo/client_session.py | 1045 ++ .../Lib/site-packages/pymongo/collation.py | 225 + .../Lib/site-packages/pymongo/collection.py | 3494 +++++++ .../site-packages/pymongo/command_cursor.py | 329 + .../Lib/site-packages/pymongo/common.py | 982 ++ .../pymongo/compression_support.py | 158 + .../Lib/site-packages/pymongo/cursor.py | 1346 +++ .../site-packages/pymongo/cursor_manager.py | 65 + .../Lib/site-packages/pymongo/daemon.py | 158 + .../Lib/site-packages/pymongo/database.py | 1700 ++++ .../Lib/site-packages/pymongo/driver_info.py | 39 + .../Lib/site-packages/pymongo/encryption.py | 584 ++ .../pymongo/encryption_options.py | 155 + .../Lib/site-packages/pymongo/errors.py | 317 + .../site-packages/pymongo/event_loggers.py | 207 + .../Lib/site-packages/pymongo/hello.py | 199 + .../Lib/site-packages/pymongo/hello_compat.py | 23 + .../Lib/site-packages/pymongo/helpers.py | 287 + .../Lib/site-packages/pymongo/ismaster.py | 30 + .../pymongo/max_staleness_selectors.py | 116 + .../Lib/site-packages/pymongo/message.py | 1778 ++++ .../Lib/site-packages/pymongo/mongo_client.py | 2434 +++++ .../pymongo/mongo_replica_set_client.py | 48 + .../Lib/site-packages/pymongo/monitor.py | 440 + .../Lib/site-packages/pymongo/monitoring.py | 1653 ++++ .../Lib/site-packages/pymongo/monotonic.py | 38 + .../Lib/site-packages/pymongo/network.py | 301 + .../Lib/site-packages/pymongo/ocsp_cache.py | 87 + .../Lib/site-packages/pymongo/ocsp_support.py | 366 + .../Lib/site-packages/pymongo/operations.py | 452 + .../pymongo/periodic_executor.py | 184 + .../Lib/site-packages/pymongo/pool.py | 1524 +++ .../pymongo/pyopenssl_context.py | 324 + .../Lib/site-packages/pymongo/read_concern.py | 76 + .../site-packages/pymongo/read_preferences.py | 537 ++ .../Lib/site-packages/pymongo/response.py | 112 + .../Lib/site-packages/pymongo/results.py | 226 + .../Lib/site-packages/pymongo/saslprep.py | 108 + .../Lib/site-packages/pymongo/server.py | 234 + .../Lib/site-packages/pymongo/server_api.py | 168 + .../pymongo/server_description.py | 258 + .../site-packages/pymongo/server_selectors.py | 156 + .../Lib/site-packages/pymongo/server_type.py | 23 + .../Lib/site-packages/pymongo/settings.py | 148 + .../site-packages/pymongo/socket_checker.py | 101 + .../site-packages/pymongo/son_manipulator.py | 191 + .../Lib/site-packages/pymongo/srv_resolver.py | 123 + .../Lib/site-packages/pymongo/ssl_context.py | 132 + .../pymongo/ssl_match_hostname.py | 132 + .../Lib/site-packages/pymongo/ssl_support.py | 184 + .../Lib/site-packages/pymongo/thread_util.py | 129 + .../Lib/site-packages/pymongo/topology.py | 819 ++ .../pymongo/topology_description.py | 608 ++ .../Lib/site-packages/pymongo/uri_parser.py | 561 ++ .../site-packages/pymongo/write_concern.py | 126 + .../requests-2.26.0.dist-info/INSTALLER | 1 + .../requests-2.26.0.dist-info/LICENSE | 175 + .../requests-2.26.0.dist-info/METADATA | 120 + .../requests-2.26.0.dist-info/RECORD | 43 + .../requests-2.26.0.dist-info/REQUESTED | 0 .../requests-2.26.0.dist-info/WHEEL | 6 + .../requests-2.26.0.dist-info/top_level.txt | 1 + .../Lib/site-packages/requests/__init__.py | 152 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3862 bytes .../__pycache__/__version__.cpython-39.pyc | Bin 0 -> 540 bytes .../_internal_utils.cpython-39.pyc | Bin 0 -> 1287 bytes .../__pycache__/adapters.cpython-39.pyc | Bin 0 -> 16886 bytes .../requests/__pycache__/api.cpython-39.pyc | Bin 0 -> 6704 bytes .../requests/__pycache__/auth.cpython-39.pyc | Bin 0 -> 8316 bytes .../requests/__pycache__/certs.cpython-39.pyc | Bin 0 -> 606 bytes .../__pycache__/compat.cpython-39.pyc | Bin 0 -> 1696 bytes .../__pycache__/cookies.cpython-39.pyc | Bin 0 -> 18807 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 5378 bytes .../requests/__pycache__/help.cpython-39.pyc | Bin 0 -> 2858 bytes .../requests/__pycache__/hooks.cpython-39.pyc | Bin 0 -> 975 bytes .../__pycache__/models.cpython-39.pyc | Bin 0 -> 24383 bytes .../__pycache__/packages.cpython-39.pyc | Bin 0 -> 682 bytes .../__pycache__/sessions.cpython-39.pyc | Bin 0 -> 19842 bytes .../__pycache__/status_codes.cpython-39.pyc | Bin 0 -> 4224 bytes .../__pycache__/structures.cpython-39.pyc | Bin 0 -> 4445 bytes .../requests/__pycache__/utils.cpython-39.pyc | Bin 0 -> 23297 bytes .../Lib/site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 42 + .../Lib/site-packages/requests/adapters.py | 533 ++ .../Lib/site-packages/requests/api.py | 159 + .../Lib/site-packages/requests/auth.py | 305 + .../Lib/site-packages/requests/certs.py | 18 + .../Lib/site-packages/requests/compat.py | 75 + .../Lib/site-packages/requests/cookies.py | 549 ++ .../Lib/site-packages/requests/exceptions.py | 127 + .../Lib/site-packages/requests/help.py | 135 + .../Lib/site-packages/requests/hooks.py | 34 + .../Lib/site-packages/requests/models.py | 966 ++ .../Lib/site-packages/requests/packages.py | 26 + .../Lib/site-packages/requests/sessions.py | 781 ++ .../site-packages/requests/status_codes.py | 123 + .../Lib/site-packages/requests/structures.py | 105 + .../Lib/site-packages/requests/utils.py | 1013 ++ .../setuptools-56.0.0.dist-info/INSTALLER | 1 + .../setuptools-56.0.0.dist-info/LICENSE | 19 + .../setuptools-56.0.0.dist-info/METADATA | 114 + .../setuptools-56.0.0.dist-info/RECORD | 295 + .../setuptools-56.0.0.dist-info/REQUESTED | 0 .../setuptools-56.0.0.dist-info/WHEEL | 5 + .../dependency_links.txt | 2 + .../entry_points.txt | 60 + .../setuptools-56.0.0.dist-info/top_level.txt | 3 + .../Lib/site-packages/setuptools/__init__.py | 241 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 8623 bytes .../_deprecation_warning.cpython-39.pyc | Bin 0 -> 549 bytes .../__pycache__/_imp.cpython-39.pyc | Bin 0 -> 2084 bytes .../__pycache__/archive_util.cpython-39.pyc | Bin 0 -> 5813 bytes .../__pycache__/build_meta.cpython-39.pyc | Bin 0 -> 9072 bytes .../__pycache__/config.cpython-39.pyc | Bin 0 -> 19847 bytes .../__pycache__/dep_util.cpython-39.pyc | Bin 0 -> 856 bytes .../__pycache__/depends.cpython-39.pyc | Bin 0 -> 5248 bytes .../__pycache__/dist.cpython-39.pyc | Bin 0 -> 33331 bytes .../__pycache__/errors.cpython-39.pyc | Bin 0 -> 849 bytes .../__pycache__/extension.cpython-39.pyc | Bin 0 -> 1943 bytes .../__pycache__/glob.cpython-39.pyc | Bin 0 -> 3693 bytes .../__pycache__/installer.cpython-39.pyc | Bin 0 -> 2770 bytes .../__pycache__/launch.cpython-39.pyc | Bin 0 -> 900 bytes .../__pycache__/lib2to3_ex.cpython-39.pyc | Bin 0 -> 2702 bytes .../__pycache__/monkey.cpython-39.pyc | Bin 0 -> 4612 bytes .../__pycache__/msvc.cpython-39.pyc | Bin 0 -> 43269 bytes .../__pycache__/namespaces.cpython-39.pyc | Bin 0 -> 3599 bytes .../__pycache__/package_index.cpython-39.pyc | Bin 0 -> 33093 bytes .../__pycache__/py34compat.cpython-39.pyc | Bin 0 -> 479 bytes .../__pycache__/sandbox.cpython-39.pyc | Bin 0 -> 15773 bytes .../__pycache__/ssl_support.cpython-39.pyc | Bin 0 -> 6860 bytes .../__pycache__/unicode_utils.cpython-39.pyc | Bin 0 -> 1113 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 323 bytes .../__pycache__/wheel.cpython-39.pyc | Bin 0 -> 7279 bytes .../windows_support.cpython-39.pyc | Bin 0 -> 1022 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 15 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 457 bytes .../__pycache__/_msvccompiler.cpython-39.pyc | Bin 0 -> 13812 bytes .../__pycache__/archive_util.cpython-39.pyc | Bin 0 -> 6644 bytes .../__pycache__/bcppcompiler.cpython-39.pyc | Bin 0 -> 6555 bytes .../__pycache__/ccompiler.cpython-39.pyc | Bin 0 -> 33260 bytes .../_distutils/__pycache__/cmd.cpython-39.pyc | Bin 0 -> 13983 bytes .../__pycache__/config.cpython-39.pyc | Bin 0 -> 3586 bytes .../__pycache__/core.cpython-39.pyc | Bin 0 -> 6711 bytes .../cygwinccompiler.cpython-39.pyc | Bin 0 -> 8560 bytes .../__pycache__/debug.cpython-39.pyc | Bin 0 -> 253 bytes .../__pycache__/dep_util.cpython-39.pyc | Bin 0 -> 2773 bytes .../__pycache__/dir_util.cpython-39.pyc | Bin 0 -> 5874 bytes .../__pycache__/dist.cpython-39.pyc | Bin 0 -> 34444 bytes .../__pycache__/errors.cpython-39.pyc | Bin 0 -> 5309 bytes .../__pycache__/extension.cpython-39.pyc | Bin 0 -> 6974 bytes .../__pycache__/fancy_getopt.cpython-39.pyc | Bin 0 -> 10682 bytes .../__pycache__/file_util.cpython-39.pyc | Bin 0 -> 6040 bytes .../__pycache__/filelist.cpython-39.pyc | Bin 0 -> 9892 bytes .../_distutils/__pycache__/log.cpython-39.pyc | Bin 0 -> 2372 bytes .../__pycache__/msvc9compiler.cpython-39.pyc | Bin 0 -> 17569 bytes .../__pycache__/msvccompiler.cpython-39.pyc | Bin 0 -> 14764 bytes .../__pycache__/py35compat.cpython-39.pyc | Bin 0 -> 629 bytes .../__pycache__/py38compat.cpython-39.pyc | Bin 0 -> 424 bytes .../__pycache__/spawn.cpython-39.pyc | Bin 0 -> 3425 bytes .../__pycache__/sysconfig.cpython-39.pyc | Bin 0 -> 12406 bytes .../__pycache__/text_file.cpython-39.pyc | Bin 0 -> 8498 bytes .../__pycache__/unixccompiler.cpython-39.pyc | Bin 0 -> 6659 bytes .../__pycache__/util.cpython-39.pyc | Bin 0 -> 15692 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 7398 bytes .../versionpredicate.cpython-39.pyc | Bin 0 -> 5182 bytes .../setuptools/_distutils/_msvccompiler.py | 561 ++ .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1116 +++ .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 532 bytes .../command/__pycache__/bdist.cpython-39.pyc | Bin 0 -> 3662 bytes .../__pycache__/bdist_dumb.cpython-39.pyc | Bin 0 -> 3645 bytes .../__pycache__/bdist_msi.cpython-39.pyc | Bin 0 -> 19827 bytes .../__pycache__/bdist_rpm.cpython-39.pyc | Bin 0 -> 12282 bytes .../__pycache__/bdist_wininst.cpython-39.pyc | Bin 0 -> 8602 bytes .../command/__pycache__/build.cpython-39.pyc | Bin 0 -> 3938 bytes .../__pycache__/build_clib.cpython-39.pyc | Bin 0 -> 4857 bytes .../__pycache__/build_ext.cpython-39.pyc | Bin 0 -> 16306 bytes .../__pycache__/build_py.cpython-39.pyc | Bin 0 -> 10490 bytes .../__pycache__/build_scripts.cpython-39.pyc | Bin 0 -> 4387 bytes .../command/__pycache__/check.cpython-39.pyc | Bin 0 -> 4966 bytes .../command/__pycache__/clean.cpython-39.pyc | Bin 0 -> 2139 bytes .../command/__pycache__/config.cpython-39.pyc | Bin 0 -> 10269 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 13856 bytes .../__pycache__/install_data.cpython-39.pyc | Bin 0 -> 2342 bytes .../install_egg_info.cpython-39.pyc | Bin 0 -> 3077 bytes .../install_headers.cpython-39.pyc | Bin 0 -> 1767 bytes .../__pycache__/install_lib.cpython-39.pyc | Bin 0 -> 5139 bytes .../install_scripts.cpython-39.pyc | Bin 0 -> 2190 bytes .../__pycache__/py37compat.cpython-39.pyc | Bin 0 -> 1033 bytes .../__pycache__/register.cpython-39.pyc | Bin 0 -> 8510 bytes .../command/__pycache__/sdist.cpython-39.pyc | Bin 0 -> 14537 bytes .../command/__pycache__/upload.cpython-39.pyc | Bin 0 -> 5260 bytes .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 ++ .../_distutils/command/bdist_rpm.py | 579 ++ .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 755 ++ .../setuptools/_distutils/command/build_py.py | 416 + .../_distutils/command/build_scripts.py | 160 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 677 ++ .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 77 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 234 + .../setuptools/_distutils/cygwinccompiler.py | 403 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 +++ .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 327 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 ++ .../setuptools/_distutils/msvccompiler.py | 643 ++ .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 125 + .../setuptools/_distutils/sysconfig.py | 573 ++ .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 328 + .../setuptools/_distutils/util.py | 561 ++ .../setuptools/_distutils/version.py | 347 + .../setuptools/_distutils/versionpredicate.py | 166 + .../Lib/site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 187 bytes .../__pycache__/ordered_set.cpython-39.pyc | Bin 0 -> 16381 bytes .../__pycache__/pyparsing.cpython-39.pyc | Bin 0 -> 201340 bytes .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-39.pyc | Bin 0 -> 703 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 549 bytes .../__pycache__/_compat.cpython-39.pyc | Bin 0 -> 1147 bytes .../__pycache__/_structures.cpython-39.pyc | Bin 0 -> 2901 bytes .../__pycache__/_typing.cpython-39.pyc | Bin 0 -> 1492 bytes .../__pycache__/markers.cpython-39.pyc | Bin 0 -> 9305 bytes .../__pycache__/requirements.cpython-39.pyc | Bin 0 -> 4082 bytes .../__pycache__/specifiers.cpython-39.pyc | Bin 0 -> 20584 bytes .../packaging/__pycache__/tags.cpython-39.pyc | Bin 0 -> 17263 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 1654 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 13321 bytes .../setuptools/_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../setuptools/_vendor/packaging/_typing.py | 48 + .../setuptools/_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 ++ .../setuptools/_vendor/packaging/tags.py | 751 ++ .../setuptools/_vendor/packaging/utils.py | 65 + .../setuptools/_vendor/packaging/version.py | 535 ++ .../setuptools/_vendor/pyparsing.py | 5742 +++++++++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 281 + .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 652 bytes .../command/__pycache__/alias.cpython-39.pyc | Bin 0 -> 2370 bytes .../__pycache__/bdist_egg.cpython-39.pyc | Bin 0 -> 13036 bytes .../__pycache__/bdist_rpm.cpython-39.pyc | Bin 0 -> 1356 bytes .../__pycache__/build_clib.cpython-39.pyc | Bin 0 -> 2467 bytes .../__pycache__/build_ext.cpython-39.pyc | Bin 0 -> 9740 bytes .../__pycache__/build_py.cpython-39.pyc | Bin 0 -> 8694 bytes .../__pycache__/develop.cpython-39.pyc | Bin 0 -> 6455 bytes .../__pycache__/dist_info.cpython-39.pyc | Bin 0 -> 1394 bytes .../__pycache__/easy_install.cpython-39.pyc | Bin 0 -> 63551 bytes .../__pycache__/egg_info.cpython-39.pyc | Bin 0 -> 21711 bytes .../__pycache__/install.cpython-39.pyc | Bin 0 -> 4035 bytes .../install_egg_info.cpython-39.pyc | Bin 0 -> 2426 bytes .../__pycache__/install_lib.cpython-39.pyc | Bin 0 -> 4133 bytes .../install_scripts.cpython-39.pyc | Bin 0 -> 2421 bytes .../__pycache__/py36compat.cpython-39.pyc | Bin 0 -> 4588 bytes .../__pycache__/register.cpython-39.pyc | Bin 0 -> 844 bytes .../command/__pycache__/rotate.cpython-39.pyc | Bin 0 -> 2503 bytes .../__pycache__/saveopts.cpython-39.pyc | Bin 0 -> 922 bytes .../command/__pycache__/sdist.cpython-39.pyc | Bin 0 -> 7622 bytes .../command/__pycache__/setopt.cpython-39.pyc | Bin 0 -> 4534 bytes .../command/__pycache__/test.cpython-39.pyc | Bin 0 -> 8497 bytes .../command/__pycache__/upload.cpython-39.pyc | Bin 0 -> 817 bytes .../__pycache__/upload_docs.cpython-39.pyc | Bin 0 -> 6160 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 31 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 322 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 216 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2290 +++++ .../setuptools/command/egg_info.py | 727 ++ .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 235 + .../setuptools/command/setopt.py | 148 + .../site-packages/setuptools/command/test.py | 274 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 202 + .../Lib/site-packages/setuptools/config.py | 710 ++ .../Lib/site-packages/setuptools/dep_util.py | 25 + .../Lib/site-packages/setuptools/depends.py | 175 + .../Lib/site-packages/setuptools/dist.py | 1057 ++ .../Lib/site-packages/setuptools/errors.py | 16 + .../Lib/site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2902 bytes .../Lib/site-packages/setuptools/glob.py | 167 + .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 97 + .../Lib/site-packages/setuptools/launch.py | 36 + .../site-packages/setuptools/lib2to3_ex.py | 68 + .../Lib/site-packages/setuptools/monkey.py | 177 + .../Lib/site-packages/setuptools/msvc.py | 1826 ++++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1145 +++ .../site-packages/setuptools/py34compat.py | 13 + .../Lib/site-packages/setuptools/sandbox.py | 496 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/ssl_support.py | 266 + .../site-packages/setuptools/unicode_utils.py | 42 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../soupsieve-2.2.1.dist-info/INSTALLER | 1 + .../soupsieve-2.2.1.dist-info/LICENSE.md | 21 + .../soupsieve-2.2.1.dist-info/METADATA | 124 + .../soupsieve-2.2.1.dist-info/RECORD | 18 + .../soupsieve-2.2.1.dist-info/WHEEL | 5 + .../soupsieve-2.2.1.dist-info/top_level.txt | 1 + .../Lib/site-packages/soupsieve/__init__.py | 111 + .../Lib/site-packages/soupsieve/__meta__.py | 192 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 3671 bytes .../__pycache__/__meta__.cpython-39.pyc | Bin 0 -> 5780 bytes .../__pycache__/css_match.cpython-39.pyc | Bin 0 -> 34031 bytes .../__pycache__/css_parser.cpython-39.pyc | Bin 0 -> 26869 bytes .../__pycache__/css_types.cpython-39.pyc | Bin 0 -> 10625 bytes .../soupsieve/__pycache__/util.cpython-39.pyc | Bin 0 -> 2868 bytes .../Lib/site-packages/soupsieve/css_match.py | 1534 +++ .../Lib/site-packages/soupsieve/css_parser.py | 1209 +++ .../Lib/site-packages/soupsieve/css_types.py | 344 + .../Lib/site-packages/soupsieve/util.py | 110 + .../urllib3-1.26.7.dist-info/INSTALLER | 1 + .../urllib3-1.26.7.dist-info/LICENSE.txt | 21 + .../urllib3-1.26.7.dist-info/METADATA | 1396 +++ .../urllib3-1.26.7.dist-info/RECORD | 84 + .../urllib3-1.26.7.dist-info/WHEEL | 6 + .../urllib3-1.26.7.dist-info/top_level.txt | 1 + .../Lib/site-packages/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2174 bytes .../__pycache__/_collections.cpython-39.pyc | Bin 0 -> 10769 bytes .../__pycache__/_version.cpython-39.pyc | Bin 0 -> 198 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 13667 bytes .../__pycache__/connectionpool.cpython-39.pyc | Bin 0 -> 24694 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 11631 bytes .../urllib3/__pycache__/fields.cpython-39.pyc | Bin 0 -> 8146 bytes .../__pycache__/filepost.cpython-39.pyc | Bin 0 -> 2747 bytes .../__pycache__/poolmanager.cpython-39.pyc | Bin 0 -> 15149 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 5610 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 20821 bytes .../Lib/site-packages/urllib3/_collections.py | 337 + .../Lib/site-packages/urllib3/_version.py | 2 + .../Lib/site-packages/urllib3/connection.py | 569 ++ .../site-packages/urllib3/connectionpool.py | 1078 +++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 184 bytes .../_appengine_environ.cpython-39.pyc | Bin 0 -> 1404 bytes .../__pycache__/appengine.cpython-39.pyc | Bin 0 -> 8233 bytes .../__pycache__/ntlmpool.cpython-39.pyc | Bin 0 -> 3611 bytes .../__pycache__/pyopenssl.cpython-39.pyc | Bin 0 -> 15555 bytes .../securetransport.cpython-39.pyc | Bin 0 -> 21871 bytes .../contrib/__pycache__/socks.cpython-39.pyc | Bin 0 -> 5620 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 201 bytes .../__pycache__/bindings.cpython-39.pyc | Bin 0 -> 10696 bytes .../__pycache__/low_level.cpython-39.pyc | Bin 0 -> 9161 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../urllib3/contrib/appengine.py | 314 + .../site-packages/urllib3/contrib/ntlmpool.py | 130 + .../urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 ++ .../site-packages/urllib3/contrib/socks.py | 216 + .../Lib/site-packages/urllib3/exceptions.py | 323 + .../Lib/site-packages/urllib3/fields.py | 274 + .../Lib/site-packages/urllib3/filepost.py | 98 + .../urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 298 bytes .../packages/__pycache__/six.cpython-39.pyc | Bin 0 -> 27568 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 195 bytes .../__pycache__/makefile.cpython-39.pyc | Bin 0 -> 1293 bytes .../urllib3/packages/backports/makefile.py | 51 + .../Lib/site-packages/urllib3/packages/six.py | 1077 +++ .../packages/ssl_match_hostname/__init__.py | 24 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 557 bytes .../_implementation.cpython-39.pyc | Bin 0 -> 3288 bytes .../ssl_match_hostname/_implementation.py | 160 + .../Lib/site-packages/urllib3/poolmanager.py | 536 ++ .../Lib/site-packages/urllib3/request.py | 170 + .../Lib/site-packages/urllib3/response.py | 821 ++ .../site-packages/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 1094 bytes .../__pycache__/connection.cpython-39.pyc | Bin 0 -> 3434 bytes .../util/__pycache__/proxy.cpython-39.pyc | Bin 0 -> 1330 bytes .../util/__pycache__/queue.cpython-39.pyc | Bin 0 -> 1049 bytes .../util/__pycache__/request.cpython-39.pyc | Bin 0 -> 3437 bytes .../util/__pycache__/response.cpython-39.pyc | Bin 0 -> 2334 bytes .../util/__pycache__/retry.cpython-39.pyc | Bin 0 -> 15821 bytes .../util/__pycache__/ssl_.cpython-39.pyc | Bin 0 -> 11306 bytes .../__pycache__/ssltransport.cpython-39.pyc | Bin 0 -> 7475 bytes .../util/__pycache__/timeout.cpython-39.pyc | Bin 0 -> 8932 bytes .../util/__pycache__/url.cpython-39.pyc | Bin 0 -> 10633 bytes .../util/__pycache__/wait.cpython-39.pyc | Bin 0 -> 3117 bytes .../site-packages/urllib3/util/connection.py | 150 + .../Lib/site-packages/urllib3/util/proxy.py | 57 + .../Lib/site-packages/urllib3/util/queue.py | 22 + .../Lib/site-packages/urllib3/util/request.py | 143 + .../site-packages/urllib3/util/response.py | 107 + .../Lib/site-packages/urllib3/util/retry.py | 602 ++ .../Lib/site-packages/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssltransport.py | 221 + .../Lib/site-packages/urllib3/util/timeout.py | 268 + .../Lib/site-packages/urllib3/util/url.py | 432 + .../Lib/site-packages/urllib3/util/wait.py | 153 + .../Lib/site-packages/werkzeug/__init__.py | 6 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 351 bytes .../__pycache__/_internal.cpython-39.pyc | Bin 0 -> 18461 bytes .../__pycache__/_reloader.cpython-39.pyc | Bin 0 -> 11972 bytes .../__pycache__/datastructures.cpython-39.pyc | Bin 0 -> 106404 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 30236 bytes .../__pycache__/filesystem.cpython-39.pyc | Bin 0 -> 2086 bytes .../__pycache__/formparser.cpython-39.pyc | Bin 0 -> 14092 bytes .../werkzeug/__pycache__/http.cpython-39.pyc | Bin 0 -> 38054 bytes .../werkzeug/__pycache__/local.cpython-39.pyc | Bin 0 -> 22563 bytes .../__pycache__/routing.cpython-39.pyc | Bin 0 -> 73352 bytes .../__pycache__/security.cpython-39.pyc | Bin 0 -> 8172 bytes .../__pycache__/serving.cpython-39.pyc | Bin 0 -> 30762 bytes .../werkzeug/__pycache__/test.cpython-39.pyc | Bin 0 -> 39095 bytes .../__pycache__/testapp.cpython-39.pyc | Bin 0 -> 9615 bytes .../werkzeug/__pycache__/urls.cpython-39.pyc | Bin 0 -> 36625 bytes .../__pycache__/user_agent.cpython-39.pyc | Bin 0 -> 1832 bytes .../__pycache__/useragents.cpython-39.pyc | Bin 0 -> 6874 bytes .../werkzeug/__pycache__/utils.cpython-39.pyc | Bin 0 -> 32954 bytes .../werkzeug/__pycache__/wsgi.cpython-39.pyc | Bin 0 -> 30262 bytes .../Lib/site-packages/werkzeug/_internal.py | 626 ++ .../Lib/site-packages/werkzeug/_reloader.py | 430 + .../site-packages/werkzeug/datastructures.py | 3059 ++++++ .../site-packages/werkzeug/datastructures.pyi | 912 ++ .../site-packages/werkzeug/debug/__init__.py | 502 + .../debug/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 13022 bytes .../debug/__pycache__/console.cpython-39.pyc | Bin 0 -> 7938 bytes .../debug/__pycache__/repr.cpython-39.pyc | Bin 0 -> 8867 bytes .../debug/__pycache__/tbtools.cpython-39.pyc | Bin 0 -> 18045 bytes .../site-packages/werkzeug/debug/console.py | 211 + .../Lib/site-packages/werkzeug/debug/repr.py | 284 + .../werkzeug/debug/shared/FONT_LICENSE | 96 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 359 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/source.png | Bin 0 -> 818 bytes .../werkzeug/debug/shared/style.css | 163 + .../werkzeug/debug/shared/ubuntu.ttf | Bin 0 -> 70220 bytes .../site-packages/werkzeug/debug/tbtools.py | 600 ++ .../Lib/site-packages/werkzeug/exceptions.py | 943 ++ .../Lib/site-packages/werkzeug/filesystem.py | 55 + .../Lib/site-packages/werkzeug/formparser.py | 495 + .../Lib/site-packages/werkzeug/http.py | 1388 +++ .../Lib/site-packages/werkzeug/local.py | 677 ++ .../werkzeug/middleware/__init__.py | 22 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 696 bytes .../__pycache__/dispatcher.cpython-39.pyc | Bin 0 -> 2755 bytes .../__pycache__/http_proxy.cpython-39.pyc | Bin 0 -> 6800 bytes .../__pycache__/lint.cpython-39.pyc | Bin 0 -> 12696 bytes .../__pycache__/profiler.cpython-39.pyc | Bin 0 -> 4948 bytes .../__pycache__/proxy_fix.cpython-39.pyc | Bin 0 -> 6177 bytes .../__pycache__/shared_data.cpython-39.pyc | Bin 0 -> 9854 bytes .../werkzeug/middleware/dispatcher.py | 78 + .../werkzeug/middleware/http_proxy.py | 230 + .../site-packages/werkzeug/middleware/lint.py | 420 + .../werkzeug/middleware/profiler.py | 139 + .../werkzeug/middleware/proxy_fix.py | 187 + .../werkzeug/middleware/shared_data.py | 320 + .../Lib/site-packages/werkzeug/py.typed | 0 .../Lib/site-packages/werkzeug/routing.py | 2341 +++++ .../site-packages/werkzeug/sansio/__init__.py | 0 .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 184 bytes .../__pycache__/multipart.cpython-39.pyc | Bin 0 -> 6535 bytes .../sansio/__pycache__/request.cpython-39.pyc | Bin 0 -> 17180 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 22635 bytes .../sansio/__pycache__/utils.cpython-39.pyc | Bin 0 -> 3888 bytes .../werkzeug/sansio/multipart.py | 260 + .../site-packages/werkzeug/sansio/request.py | 548 ++ .../site-packages/werkzeug/sansio/response.py | 704 ++ .../site-packages/werkzeug/sansio/utils.py | 142 + .../Lib/site-packages/werkzeug/security.py | 247 + .../Lib/site-packages/werkzeug/serving.py | 1081 +++ .../Lib/site-packages/werkzeug/test.py | 1326 +++ .../Lib/site-packages/werkzeug/testapp.py | 240 + .../Lib/site-packages/werkzeug/urls.py | 1211 +++ .../Lib/site-packages/werkzeug/user_agent.py | 47 + .../Lib/site-packages/werkzeug/useragents.py | 215 + .../Lib/site-packages/werkzeug/utils.py | 1099 +++ .../werkzeug/wrappers/__init__.py | 16 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 907 bytes .../__pycache__/accept.cpython-39.pyc | Bin 0 -> 813 bytes .../wrappers/__pycache__/auth.cpython-39.pyc | Bin 0 -> 1291 bytes .../__pycache__/base_request.cpython-39.pyc | Bin 0 -> 1766 bytes .../__pycache__/base_response.cpython-39.pyc | Bin 0 -> 1777 bytes .../common_descriptors.cpython-39.pyc | Bin 0 -> 1368 bytes .../wrappers/__pycache__/cors.cpython-39.pyc | Bin 0 -> 1276 bytes .../wrappers/__pycache__/etag.cpython-39.pyc | Bin 0 -> 1276 bytes .../wrappers/__pycache__/json.cpython-39.pyc | Bin 0 -> 805 bytes .../__pycache__/request.cpython-39.pyc | Bin 0 -> 21304 bytes .../__pycache__/response.cpython-39.pyc | Bin 0 -> 29688 bytes .../__pycache__/user_agent.cpython-39.pyc | Bin 0 -> 826 bytes .../site-packages/werkzeug/wrappers/accept.py | 14 + .../site-packages/werkzeug/wrappers/auth.py | 26 + .../werkzeug/wrappers/base_request.py | 36 + .../werkzeug/wrappers/base_response.py | 36 + .../werkzeug/wrappers/common_descriptors.py | 26 + .../site-packages/werkzeug/wrappers/cors.py | 26 + .../site-packages/werkzeug/wrappers/etag.py | 26 + .../site-packages/werkzeug/wrappers/json.py | 13 + .../werkzeug/wrappers/request.py | 660 ++ .../werkzeug/wrappers/response.py | 890 ++ .../werkzeug/wrappers/user_agent.py | 14 + .../Lib/site-packages/werkzeug/wsgi.py | 982 ++ Rahul/task3/pyvenv3.9/Scripts/Activate.ps1 | 399 + Rahul/task3/pyvenv3.9/Scripts/activate | 66 + Rahul/task3/pyvenv3.9/Scripts/activate.bat | 33 + Rahul/task3/pyvenv3.9/Scripts/deactivate.bat | 21 + Rahul/task3/pyvenv3.9/Scripts/flask.exe | Bin 0 -> 106366 bytes Rahul/task3/pyvenv3.9/Scripts/normalizer.exe | Bin 0 -> 106402 bytes Rahul/task3/pyvenv3.9/Scripts/pip.exe | Bin 0 -> 106379 bytes Rahul/task3/pyvenv3.9/Scripts/pip3.9.exe | Bin 0 -> 106379 bytes Rahul/task3/pyvenv3.9/Scripts/pip3.exe | Bin 0 -> 106379 bytes Rahul/task3/pyvenv3.9/Scripts/python.exe | Bin 0 -> 543464 bytes Rahul/task3/pyvenv3.9/Scripts/pythonw.exe | Bin 0 -> 542440 bytes Rahul/task3/pyvenv3.9/pyvenv.cfg | 3 + 2021 files changed, 392365 insertions(+) create mode 100644 Rahul/task3/Crawler/crawler.py create mode 100644 Rahul/task3/Templates/base.html create mode 100644 Rahul/task3/Templates/home.html create mode 100644 Rahul/task3/Templates/search_result.html create mode 100644 Rahul/task3/app.py create mode 100644 Rahul/task3/images/logo.png create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/entry_points.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/entry_points.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/override.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/AUTHORS create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/COPYING.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/dammit.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/diagnose.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/element.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/formatter.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/testing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__pycache__/_html5lib.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__pycache__/_htmlparser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__pycache__/_lxml.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_html5lib.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_htmlparser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_lxml.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/dammit.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/diagnose.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/element.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/formatter.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/testing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/binary.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/code.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/codec_options.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/dbref.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/decimal128.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/errors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/int64.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/json_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/max_key.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/min_key.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/objectid.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/py3compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/raw_bson.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/regex.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/son.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/timestamp.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/tz_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/_cbson.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/binary.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/code.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/codec_options.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/dbref.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/decimal128.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/errors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/int64.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/json_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/max_key.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/min_key.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/objectid.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/py3compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/raw_bson.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/regex.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/son.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/timestamp.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/bson/tz_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__main__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__pycache__/__main__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/cacert.pem create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/entry_points.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/cd.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/api.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cd.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/normalizer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/constant.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/legacy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/md.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/models.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_termui_impl.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_textwrap.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_unicodefun.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/termui.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/testing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/types.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/_compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/_termui_impl.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/_textwrap.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/_unicodefun.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/_winconsole.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/decorators.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/formatting.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/globals.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/shell_completion.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/termui.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/testing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/types.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/click/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/LICENSE.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansi.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansitowin32.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/initialise.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/win32.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/winterm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/distutils-precedence.pth create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__main__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/__main__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/cli.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/ctx.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/helpers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/logging.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/scaffold.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/signals.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/testing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/typing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/views.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/app.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/blueprints.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/cli.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/config.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/ctx.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/debughelpers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/globals.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/helpers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__pycache__/tag.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/tag.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/logging.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/scaffold.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/sessions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/signals.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/templating.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/testing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/typing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/views.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask/wrappers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate-2021.10.26.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/flask_paginate/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/__pycache__/errors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/__pycache__/grid_file.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/errors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/gridfs/grid_file.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/LICENSE.md create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna-3.3.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/codec.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/idnadata.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/intranges.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/package_data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/__pycache__/uts46data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/codec.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/idnadata.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/intranges.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/package_data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/idna/uts46data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/LICENSE.rst create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous-2.0.1.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/_json.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/encoding.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/exc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/jws.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/serializer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/signer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/timed.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/__pycache__/url_safe.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/_json.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/encoding.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/exc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/jws.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/serializer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/signer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/timed.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/itsdangerous/url_safe.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/_identifier.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/async_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/bccache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/compiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/constants.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/debug.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/defaults.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/environment.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/ext.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/filters.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/idtracking.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/lexer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/loaders.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/meta.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/nativetypes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/nodes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/optimizer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/runtime.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/sandbox.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/tests.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/__pycache__/visitor.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/_identifier.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/async_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/bccache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/compiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/constants.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/debug.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/defaults.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/environment.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/ext.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/filters.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/idtracking.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/lexer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/loaders.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/meta.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/nativetypes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/nodes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/optimizer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/runtime.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/sandbox.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/tests.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/jinja2/visitor.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/LICENSE.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/LICENSES.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml-4.6.3.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/ElementInclude.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/ElementInclude.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/_elementpath.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/builder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/cssselect.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/doctestcompare.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/pyclasslookup.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/sax.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/__pycache__/usedoctest.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/_elementpath.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/_elementpath.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/builder.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/builder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/cssselect.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/doctestcompare.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/etree.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/etree.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/etree_api.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/ElementSoup.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/ElementSoup.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/_diffcommand.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/_html5builder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/_setmixin.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/builder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/clean.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/defs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/diff.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/formfill.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/html5parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/soupparser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/__pycache__/usedoctest.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/_diffcommand.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/_html5builder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/_setmixin.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/builder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/clean.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/clean.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/defs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/diff.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/diff.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/formfill.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/html5parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/soupparser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/html/usedoctest.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/__init__.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/c14n.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/config.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/dtdvalid.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/etree_defs.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/etreepublic.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/htmlparser.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libexslt/exslt.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libexslt/exsltconfig.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libexslt/exsltexports.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libexslt/libexslt.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/DOCBparser.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/HTMLparser.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/HTMLtree.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/SAX.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/SAX2.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/c14n.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/catalog.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/chvalid.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/debugXML.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/dict.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/encoding.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/entities.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/globals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/hash.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/list.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/nanoftp.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/nanohttp.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/parser.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/parserInternals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/pattern.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/relaxng.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/schemasInternals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/schematron.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/threads.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/tree.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/uri.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/valid.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xinclude.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xlink.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlIO.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlautomata.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlerror.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlexports.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlmemory.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlmodule.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlreader.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlregexp.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlsave.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlschemas.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlschemastypes.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlstring.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlunicode.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlversion.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xmlwriter.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xpath.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xpathInternals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxml/xpointer.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/attributes.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/documents.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/extensions.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/extra.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/functions.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/imports.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/keys.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/libxslt.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/namespaces.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/numbersInternals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/preproc.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/security.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/templates.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/transform.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/trio.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/triodef.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/variables.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/win32config.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xslt.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xsltInternals.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xsltconfig.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xsltexports.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xsltlocale.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/libxslt/xsltutils.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/lxml-version.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/relaxng.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/schematron.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/tree.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/uri.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xinclude.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xmlerror.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xmlparser.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xmlschema.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xpath.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/includes/xslt.pxd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/rng/iso-schematron.rng create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/lxml.etree.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/lxml.etree_api.h create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/objectify.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/pyclasslookup.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/sax.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/sax.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/lxml/usedoctest.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/__pycache__/_native.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/_native.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/_speedups.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/_speedups.pyi create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/markupsafe/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/LICENSE.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/entry_points.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip-21.1.3.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/__main__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/__pycache__/__main__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/main.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/build_env.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/configuration.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/index/sources.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/_distutils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/locations/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/main.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/index.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/link.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/download.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/session.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/parallel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/pkg_resources.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/parallel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/pkg_resources.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__pycache__/appdirs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/appdirs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/distro.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/_typing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/_typing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/pyparsing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/six.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/after.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/before.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__pycache__/decoder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__pycache__/encoder.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__pycache__/ordered.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/__pycache__/tz.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/decoder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/encoder.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/ordered.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/toml/tz.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pip/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo-3.12.1.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/_ipaddress.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/aggregation.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/auth.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/auth_aws.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/bulk.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/change_stream.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/client_options.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/client_session.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/collation.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/collection.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/command_cursor.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/common.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/compression_support.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/cursor.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/cursor_manager.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/daemon.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/database.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/driver_info.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/encryption.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/encryption_options.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/errors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/event_loggers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/hello.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/hello_compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/helpers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ismaster.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/max_staleness_selectors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/message.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/mongo_client.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/mongo_replica_set_client.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/monitor.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/monitoring.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/monotonic.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/network.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ocsp_cache.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ocsp_support.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/operations.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/periodic_executor.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/pool.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/pyopenssl_context.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/read_concern.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/read_preferences.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/results.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/saslprep.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/server.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/server_api.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/server_description.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/server_selectors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/server_type.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/settings.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/socket_checker.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/son_manipulator.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/srv_resolver.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ssl_context.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ssl_match_hostname.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/ssl_support.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/thread_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/topology.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/topology_description.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/uri_parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/__pycache__/write_concern.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/_cmessage.cp39-win_amd64.pyd create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/_ipaddress.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/aggregation.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/auth.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/auth_aws.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/bulk.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/change_stream.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/client_options.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/client_session.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/collation.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/collection.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/command_cursor.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/common.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/compression_support.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/cursor.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/cursor_manager.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/daemon.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/database.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/driver_info.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/encryption.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/encryption_options.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/errors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/event_loggers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/hello.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/hello_compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/helpers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ismaster.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/max_staleness_selectors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/message.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/mongo_client.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/mongo_replica_set_client.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/monitor.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/monitoring.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/monotonic.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/network.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ocsp_cache.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ocsp_support.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/operations.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/periodic_executor.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/pool.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/pyopenssl_context.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/read_concern.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/read_preferences.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/results.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/saslprep.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/server.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/server_api.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/server_description.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/server_selectors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/server_type.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/settings.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/socket_checker.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/son_manipulator.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/srv_resolver.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ssl_context.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ssl_match_hostname.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/ssl_support.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/thread_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/topology.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/topology_description.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/uri_parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/pymongo/write_concern.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests-2.26.0.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/__version__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/_internal_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/adapters.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/api.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/auth.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/certs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/cookies.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/help.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/hooks.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/models.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/packages.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/sessions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/status_codes.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/structures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/__version__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/_internal_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/adapters.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/api.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/auth.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/certs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/cookies.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/help.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/hooks.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/models.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/packages.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/sessions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/status_codes.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/structures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/requests/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/REQUESTED create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/dependency_links.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/entry_points.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools-56.0.0.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/_imp.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/config.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/depends.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/dist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/errors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/extension.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/glob.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/installer.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/launch.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/monkey.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/msvc.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/package_index.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/ssl_support.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/wheel.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/archive_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/cmd.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/build.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/check.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/clean.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/config.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/register.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/command/upload.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/config.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/core.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/debug.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/dep_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/dir_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/dist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/errors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/extension.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/file_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/filelist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/log.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/py35compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/py38compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/spawn.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/text_file.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_imp.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_typing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/_typing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/archive_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/build_meta.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/cli-32.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/cli-64.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/cli.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/install.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/register.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/test.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/alias.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/build_py.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/develop.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/install.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/register.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/rotate.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/sdist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/setopt.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/test.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/upload.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/config.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/dep_util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/depends.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/dist.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/errors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/extension.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/glob.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/gui-32.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/gui-64.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/gui.exe create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/installer.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/launch.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/lib2to3_ex.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/monkey.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/msvc.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/namespaces.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/package_index.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/py34compat.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/sandbox.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/script.tmpl create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/ssl_support.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/wheel.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/setuptools/windows_support.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/LICENSE.md create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve-2.2.1.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__meta__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/__meta__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/css_match.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/css_parser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/css_types.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/__pycache__/util.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/css_match.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/css_parser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/css_types.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/soupsieve/util.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/INSTALLER create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/LICENSE.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/METADATA create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/RECORD create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/WHEEL create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3-1.26.7.dist-info/top_level.txt create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/_collections.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/_version.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/connection.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/connectionpool.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/fields.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/filepost.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/poolmanager.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/_collections.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/_version.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/connection.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/connectionpool.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/_appengine_environ.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/appengine.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/ntlmpool.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/securetransport.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/__pycache__/socks.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_appengine_environ.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/bindings.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/_securetransport/low_level.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/appengine.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/ntlmpool.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/securetransport.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/contrib/socks.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/fields.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/filepost.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/__pycache__/six.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/backports/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/backports/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/backports/__pycache__/makefile.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/backports/makefile.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/six.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/poolmanager.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/connection.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/proxy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/queue.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/retry.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/ssl_.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/ssltransport.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/timeout.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/url.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/__pycache__/wait.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/connection.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/proxy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/queue.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/retry.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/ssl_.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/ssltransport.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/timeout.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/url.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/urllib3/util/wait.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/_internal.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/_reloader.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/datastructures.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/exceptions.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/filesystem.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/formparser.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/http.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/local.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/routing.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/security.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/serving.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/test.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/testapp.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/urls.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/user_agent.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/useragents.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/__pycache__/wsgi.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/_internal.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/_reloader.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/datastructures.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/datastructures.pyi create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/__pycache__/console.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/__pycache__/repr.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/__pycache__/tbtools.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/console.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/repr.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/FONT_LICENSE create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/console.png create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/less.png create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/more.png create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/source.png create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/style.css create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/shared/ubuntu.ttf create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/debug/tbtools.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/exceptions.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/filesystem.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/formparser.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/http.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/local.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/dispatcher.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/http_proxy.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/lint.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/profiler.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/proxy_fix.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/__pycache__/shared_data.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/lint.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/profiler.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/middleware/shared_data.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/py.typed create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/routing.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__pycache__/multipart.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/__pycache__/utils.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/multipart.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/sansio/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/security.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/serving.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/test.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/testapp.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/urls.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/user_agent.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/useragents.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/utils.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__init__.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/auth.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/base_response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-39.pyc create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/accept.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/auth.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/common_descriptors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/cors.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/etag.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/json.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/request.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/response.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/user_agent.py create mode 100644 Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wsgi.py create mode 100644 Rahul/task3/pyvenv3.9/Scripts/Activate.ps1 create mode 100644 Rahul/task3/pyvenv3.9/Scripts/activate create mode 100644 Rahul/task3/pyvenv3.9/Scripts/activate.bat create mode 100644 Rahul/task3/pyvenv3.9/Scripts/deactivate.bat create mode 100644 Rahul/task3/pyvenv3.9/Scripts/flask.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/normalizer.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/pip.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/pip3.9.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/pip3.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/python.exe create mode 100644 Rahul/task3/pyvenv3.9/Scripts/pythonw.exe create mode 100644 Rahul/task3/pyvenv3.9/pyvenv.cfg diff --git a/Rahul/task3/Crawler/crawler.py b/Rahul/task3/Crawler/crawler.py new file mode 100644 index 00000000..67066227 --- /dev/null +++ b/Rahul/task3/Crawler/crawler.py @@ -0,0 +1,107 @@ +from bs4 import BeautifulSoup +import requests +import pymongo +import urllib +import sys +import lxml + + +class Crawler(): + + connection_url = "mongodb://127.0.0.1:27017/" + + client = pymongo.MongoClient(connection_url) + + db = client.glugle + + disallowed_links = [] + + def start_crawl(self, url, depth): + robots_url = urllib.parse.urljoin(url, '/robots.txt') + + try: + robots = requests.get(robots_url) + except: + print("robots not found!!!") + self.crawl(url, depth) + + soup = BeautifulSoup(robots.text, 'lxml') + + sample_content = soup.find('p').text + content = sample_content.split() + for word in content: + if word[0] == '/': + self.disallowed_links.append(urllib.parse.urljoin(url, word)) + + print("robots found and appended in disallowed_links...") + + self.crawl(url, depth, self.disallowed_links) + + def crawl(self, url, depth, *disallowed_links): + + try: + print(f"Crawling url {url} at depth: {depth}") + response = requests.get(url) + except: + print(f"Failed to perform HTTP GET request on {url}") + return + + soup = BeautifulSoup(response.text, 'lxml') + + try: + title = soup.find('title').text + description = '' + + for tag in soup.findAll(): + if tag.name == 'p': + description += tag.text.strip().replace('\n', '') + + except: + print("Failed to retrieve title and description...") + return + + query = { + 'url': url, + 'title': title, + 'description': description, + } + + search_results = self.db.search_results + + search_results.insert_one(query) + + search_results.create_index( + [ + ('url', pymongo.TEXT), + ('title', pymongo.TEXT), + ('description', pymongo.TEXT) + ], + name='search_results', + default_language="english" + ) + + if depth == 0: + return + + links = soup.findAll('a') + + for link in links: + try: + if link['href'] not in disallowed_links[0]: + if 'http' in link['href']: + self.crawl(link['href'], depth-1, disallowed_links[0]) + else: + link['href'] = urllib.parse.urljoin(url, link['href']) + self.crawl(link['href'], depth-1, disallowed_links[0]) + except KeyError: + print("no links retrieved from the page") + pass + + self.client.close() + + +spider = Crawler() + +spider.start_crawl( + sys.argv[1], int(sys.argv[2]) +) \ No newline at end of file diff --git a/Rahul/task3/Templates/base.html b/Rahul/task3/Templates/base.html new file mode 100644 index 00000000..de09042f --- /dev/null +++ b/Rahul/task3/Templates/base.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + Glugle + + + + {% block content %}{% endblock %} + + + + + + + \ No newline at end of file diff --git a/Rahul/task3/Templates/home.html b/Rahul/task3/Templates/home.html new file mode 100644 index 00000000..015db9bd --- /dev/null +++ b/Rahul/task3/Templates/home.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} + +{% block content %} +
+ + +
+ +

Glugle Search

+
+ + +
+
+ + +
+
+
+{% endblock %} \ No newline at end of file diff --git a/Rahul/task3/Templates/search_result.html b/Rahul/task3/Templates/search_result.html new file mode 100644 index 00000000..3d7e2aab --- /dev/null +++ b/Rahul/task3/Templates/search_result.html @@ -0,0 +1,40 @@ +{% extends 'base.html' %} + +{% block content %} + +
+
+
+ + +
+
+ +
+

Search result for '{{search_string}}'

+
+ + {% if search_result %} + {% for link in search_result %} +
+ + + +
+ {{ link.url }} +

{{ link.description[:300] }}...

+
+
+ {% endfor %} + {% else %} + No results found + {% endif %} + +
+ {{pagination.links}} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/Rahul/task3/app.py b/Rahul/task3/app.py new file mode 100644 index 00000000..dd810977 --- /dev/null +++ b/Rahul/task3/app.py @@ -0,0 +1,56 @@ +from flask import Flask, render_template, request +from flask_paginate import Pagination, get_page_args +import pymongo + +app = Flask(__name__) + + +@app.route('/') +def entry_point(): + return render_template('home.html') + + +@app.route('/search_results') +def search_results(): + connect_url = 'mongodb://127.0.0.1:27017/' + + client = pymongo.MongoClient(connect_url, connect=False) + + db = client.glugle + + search_string = request.args.get('search') + + query = db.search_results.find( + {'$text': {'$search': search_string, '$caseSensitive': False}}) + + search_result = [] + + for doc in query: + exist = False + for result in search_result: + if result['title'] == doc['title'] or result['url'] == doc['url']: + exist = True + break + + if exist == False: + search_result.append(doc) + + page, per_page, offset = get_page_args(page_parameter='page', + per_page_parameter='per_page') + + total = len(search_result) + + pagination = Pagination(page=page, per_page=per_page, total=total, + css_framework='bootstrap4') + + return render_template('search_result.html', + search_result=search_result[offset:offset+per_page], + page=page, + per_page=per_page, + pagination=pagination, + search_string=search_string + ) + + +if __name__ == '__main__': + app.run(debug=True) \ No newline at end of file diff --git a/Rahul/task3/images/logo.png b/Rahul/task3/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60e4b66657f64dcbb9621784372a1dfe1613617d GIT binary patch literal 195981 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%0DTI1_b+T?K z0cq7HOf~DKW6p&Or3fYuCc(_2b^sViA&%cCe~mTx0|-8iXey4qQ+pBQ!G_ylioqPE zcG=S{cc!g05?Q<4>6T4RW}?g2g@Moj)^x4G%X(ghQ+iIpslBJ-l-^UYrfUrbgM;Yt z_kb}5Aq6s)JsgqDCy|r3JA%6{7Z`EML8*cJ58sZp;?Hp=zY_t5wFiahb;zQTI@jB;z#~7o_8@%0g(@nY0=?H>d+mn-z_KjT zX!2YvaBD^KYi>t%X`4XT6Xnb)AQ|XrNM>L_p3Q60D#Y6$m9h6>&JV5 zuvyz(z3yJOP?7tB4joQcYbn7q^&g4B3%G`?!Hy(iF1J)BMd$k#KVX0hDxo* zTg@LJsnS(P0;B}YAVVge$JUzbWnuq|Kls)aw>bBF z;l=MkQ^DH}H{37?VB*uC{`7kQ^jMaqve_)1&oq9aM7t1hLzA_!ng!h8VF?Q_vwNN1 zFSOBy3oX)nLxWN}Qc5t!s;T9l&+IMSHHO7i=71Nk~KBnBZRo*8)-1~uBQ)kcf|qea6Cbj~{qAF>17{5*(9 zk34|U*bLt3dl*y^SV&e)Lt`4AkO#lhnJ*PZ*9 z@Q@&H#e00SR`kp>&(PPu{`G4Cj7B1n?E?b?>r$zdh{xk>z9;zkUUSQ(rQVJ3uu^}k zdYZhV^xx@yYgU-Jtm%ylVC7IBV5eNaPYr%6wiyffEiN58$yQ597s|{kYP< z2`A%iNFY+ZTq+g1SNZY$gJbyhzrBdAm4S}f$`MMCn#qA06eqvB2LmUEKq+uwdlWt? zal?(TMKqqnm#%#PnPeV;uxT@@i(%d5j04^lFUUJRo8qUuwC9%x9{<=oy?$*p{3xQ7 z{V4s3Pkdq!z|8yK|NgfR3=FJ;-S5U0+k9W#=T@t{ffpF8;r1o2$#9uwqk33wyKzACnE-P#Qx{)I1m;o~?i53*=M-DcVPv;QL7?=BQ#~Jtl;+O`V2c%GgfEvJqHx416Rp0^E(XWyc3WNcneiMB!2>_Jf ztsgiAZ@OqD{^N5`;K25A^sNXiQWnGkZ(^#U`vvDrOdO5k?SK5LuYK^nuNhHFQNv)K zz5z7_Szdqr_5A?i=bUrS>rOxY^!3$Pw_1}YrL?Vb8O;Cyod%EXWEj0LNa2<9&`wsj znb&l+QtW(!yizI*^!ae}&xVj5O(NW7prAP78qb&gNZZ4-Qm-5D(jKNd7DMO23{V{1 zHH&P@0yRhlc*l`L1SYz1DSZc7r*!s z2e?_;Y?dq}s@qPTGq18o?PmAjfnfo(vD6BWd!p96-qQW7r<`BBjFhrW281yN##mM0 z77lX^k0fyOokJjfJ_t)52WeF|N-Iy85@v(9imaPvh;E0Z-F?A#bUx1^6 zY#|6ZGMGXTtMD$e6DRZYFeS#Z`M_q(q-GH|!=7T`lv409AN)Lo=f|GMhJ*JaB-Y`5 z<`7QBC5RycG9Pdg3ZVfX4*hl-Pu+C{;X$(jP}B;-lpq_);hImMfrBqh;MQ;a7G0}C zAY}238(@LTX{Tp)abX&a&K{V;r~l^7e*t?)!IRP;O$Tq+Uw?fFK>n0dPI>9&mtX!t zIHJ6ZNwn^iTPpxdBZ;<^G8{{Z(OC{<&gD?>FdOqIfSHd!2z^AO7d| zJy6pbgo3<={%2vE%qv#Ty3sJ8cm>w2&u-e$p<}+p#R#mt!jT=bFaxwIQ%k^*K?DpY zE+dcO4~**&mD70e(7hO*9YvSfWk1Ap@L@qJ2}UTo%^oB&X>8no2c8^%60b4-9Dic$ zLl0gt?{I=cM#2nnWMX+d_?><51vn`6&R_;(1ks5M&c1XF&Uj4_|NJ*w;Op^$8x(TU zr=Ed|DFFFJLm5V?H9ecg>eB}|f8+CSzYk6cbxC{&8ePF1cigcOz}Tlg^(kkx))MJ- zn#`waT`eKHy*6G0ZtdC@mf5gCv%zvLtWvYey=ak$aWl^ELg#G0eIUd(-*%ZdH#p~2 zADk>9(AQ(&#RIdrr zc&~3WE~Gz%g)Gtw05<@joWK|2*!1naNJO$QLmXZq6)6QWX@Ov`5AVD7H2mw|K7w>Q zk5Gs=(C5ZMWTGKWHvo!I@Z4w&U;o_OKIpJ+bg5kb4ejVnH{IkL85uz!5a|2Z$3Au) z0OWExT8oT9>FbpmtG&uJwG*&-MIxkKEZRcH+b$=Cb^^kBn6+9ypM}n!5TcBAtK?sL zd>MkSun*t9WjBz@!|$Utw4~L`x)BgVvu-+S1U^E+3~@{xj3YLlh7p*b!69If$RLhs zoQf;(C+sNB@qGe2CwJoRz2C!F@))|!J_MX;)K-Bw*CLBk6WwMX7-85k^%(Bl`vV-D zn8JE~Bi?81$4PiA5}1KNazWsxl-=j{#E%YQ|8E@Ad5@W>XQFvrb=@oQtJ}6?|Mn^L zt_alN$TA;n5umCuO*fM>F>x%4xBu~3|MKVWea)~^igC`C%#&k70(4*c(w9~O82{{N zKl>2?T~bPs$z)iigtic%D`wri;75u!`ciu3c;Nw`(pL35dine=b|0#-aPtAe(!Y^X zR`f4*|1G3Ke~*dhc1Ljk1BYM^1Yn6eShqPkZPH=g!gF7j7KqUW5I>;u8ky**EqNIP z$ti*TPfg?OKY9sr$;<-DoPq#IA_9(XoJYQeGkhP#v-z)L^MRYOvM+#F555Vj{A-~U zMc&FHuX0eNF_uF@f+!AyaByyb5{X!T0z0R-JpSJ}!}nnr0Fp>RBIAHI zvLJ}K4aetm)4ZjqKo1iH*VyYU3S?i0H)IE^lrc3zb2c_%9)uNT3UWtDDjo5 zxqDGq6&`3@_o{F%JT5HUDq!8nb=t@=92d;3e6Oj_pxKk$sZnEt^{b{WzLOQmrQlkn1Cse zidk53N(g`QwbvjW&DG(^A)%n)!vOpQm{DWcp8a~TmBNtB%%CqtvhtsBEcOIOXSZOVe>;rs!{`cG2>VT#%mAkb zlp-MDpkNNjqD6pEfDi!*g{;gVk&hvf&LWlUf=aAID1RBw!i8ALUV}h@ATNQGib5g> z3O28P+nn#QGoX-93vB$x9@~i_z`Y|2;u_Brj#s|QkInb(2BRE|(FP`bopPy+G-iRt zsF;YP*vV%M-udNEzh#qBig?w(wCT*-Q%^lb&N=6tbpS@j#>SpmwQAMrxm-@n%*?QQ zSU09wHy!n-b4HMu%;M$et-$4ZQXPiiV-V(1NZ$xdGY!TqC?17US%BI=MFQkRu0buH?tFC&-s#U8_2Y_@s&FW2Z^-iS1!+xY_V~K(TF0IVYDXd)K!^4k{VEeW)1O`Jj0Jmb+O_scF zl=r&9vWFCip*>7>ERKB>3V}Wo2cDinq>xe(C@4Tuhh;MsNx3M5SNO5z zyZdnP>1p(=_InPv0Tc#T$jpu)oys=>xN#7bXcV}?Fc`-7PvL{toOAVM>tCK#N^wHS zlDzpWw)p%C07v%i+qY%ix^-`~EX$gjn&K|&Rx5C;G~woT)?_I$cF?_d%l_EvVc`fN z$Ye4|BoZ(TqoN?M3kDSwR`mJsCx5*e`-Wx^>hsmey7d4oRDpHtw;8zt>m~t3K?5gg z)=fvl>|1Oyi!&}9#3k3Cf!O$B*|%zpoB|*nZj2OxJvKLm68n3jlyJNfj!$dX+Q(MI zjRZZb{dnr9!+7+651?yRXAI|SffZCn0FiSLY$N+f0Z1_G7y!|TrkjYy(`=wGux<3& zPrh-hXbIHuq8zb|0(5Q z6b68U!f<|gQ-GTk3f-&x*zv#^9=-V>LW4dJ0yq1d5jhR0j7>i_ypIf2L>dy~bu`^r zZZwXsfBvFB1%Uh#(sXMGyfMZU0Ni!gU3~y%Zn)uwPddrKN~Kcsiieg)rNn_{EWX<+ zAmtTC2+P0=)T@ASp<`P}ytj0{LWshULb0c5@sD9J4N>y|x0nAJwlO9?_lWxl46 zc@WwSC|Wd~Cjl5ByhnSO>S#_Pr0LcWcmsfsfBfS; z0Mf62{p(+Q_St7&2FD6Z2vK)}>SXe4H!x@wL*o^;s~wD;mjU5?QEk1A92=@kY0vvb zrxccDK?qS1=((SJ-V#{R=fm9(9Ko@nS%kWMC2k51b5;z{lm!rOyCXOyBRHid5FZE+ zmJKNo-lL^KbTloLPzd((8Mjouu_zAuY8&B@J%8!=kl<<*c-BFM#Dr;g(D*ZQuRz8w{~T z7B}7Y0?_3&87o=z;~LQy>0Bx0NPv{>7>Lp9ux>ccx)B4!=qb0&(xIa<2nT!#8)X{l^T>Hi5Kh{xk)Y@7RUAr$<60xPfZuD^T`nXEuC zz_1{8Qv$>o0I09Tt5krPD?w;6sFQXhci?30VXC8bj07c!j%D!1_nnOMKeQIn(UdLs zzm$NRROlY`VSH~K_x$5-SQ!a_H}{-psSVuHj&N>64B1>3PbNU+Si|MgblPI+tax4? z`P^9mAcQ20(PdFjuL;ur&;R^SaB^}o^QJew>FhVZ`OWWvU4mh`T&^bI=1!Nk1Gu3D zC9GC5FJ2s2@B*_|?|Quo+}h39Rr?MUGi;^c&IWH113iA+{Ik8tjHevdZNU@+Fkd-v zg9X9@4(nC|=#2g)mq>LiF~&+NbPbx=_R}NSdH)EyRt1_kecB$zt!L1WqtC~1_m_6U z%6S#IQ2;qmIaMzgw7@#^4ZA1+P>eFST>5S}<+-g4Cy}i9Jot>SHJpJ_3KYPO) z-tbPPlr=j$%d^>RO+ver(gN$Y6vcPF$Vz#2e_Lt&hSt4*K=h0miIb;1zEk#Oz4g^HZqqROx}Ir?BCl_keQ>GvvimDFtAGib>}?-mEqV z4l0g;sC1*=rE2`ZG+BSiD?jz{9Uu5tr4(BZLke{@sOt3koTVcm$oBI^cbmH|4#`T(U_Hyv#V1#pAF>@u+N zn|rYPp>g!C@!PDg2RojWv_*dVP6}Y?kx6X$$_p?|?qT4TZwYWCa;9P6#uyb-(`hnz zYTwp}@A$yKVwp^r)(qY(%OU{qo$q|73qaz=8*luabF;VN@%X&DZpE*2&Z~kvugFq( zkqNAK3bz%ET|0rva#?S?fN?Dk816DsN?4XPr-X`v4VFZ2mxn}Y0^wZx4dt$9nF0CcO)a#^x7I{r}dc9up_bgp^tNcN|a2{H9 zEqLL2SZHe4eV;LgTrO9T2`OdXKomj&if`Zg0w5&}gVyGz!2AyDCg!qkybFL?GGPi3 z-d8RqqC-a;037oXg!@fwz4-tp_Q$dQ!|M!hjOM{r~zR_G}tQ zXwU>>Ues}Of!jorftyo;mE#Ss(=;d<8;amV*S_&j-tm@oQ7I*-lrGCB#(B@wFMjb0 z0|37Fz3=^z|8?;l~^}IY;V)DGHM8fg*5A?qeBP@Ae5kc(2t?5 z5&Y!S+i~c()96}hBG_dQ0<_!MT?z$433}G}5jm8?PyTj0_G}qP*J?i~^(t_aEhv@Z zxFlU=RFvP>ouM0~TSAbQ?i`R9Qo5z3hDK5tN@)>>4nY_~xKViFfZ}!-u>*AUhhaKi{P2_NExp|xa zJSbs!hbT&+ld_aO?=G-CBXPt7WN*0pt{Cy9x%$=x(KzY(7G40_QMOJ>>vm!qzwZL>3h{~eKQLC1cDO%=3gRUIzn|J z!KdmmARu5W0;-_N0s5iV1VQoiNTxqK=Af$Z7lBmjsVQHZp|8X{@j>nPtEW%@#?;rN z`?p(D5)%+Ltm-0l&96#Vk63u(B zXnz`|miMV@oMJG_^00hSHF{l+KJ$??<|mi7II0AKX`*Kn*MoLZI;>nqGQ66?3hOF; z1LKm{O{W~yg#*k{M1$f2BHfNvB+%Ga6)_Dw$N&1o&!x&cwqHZ<^tL$XeWA7^1qj%0 zEhHrL8UV~3vA<{=&jvmz*cnonC;&X-@+4Y zgL~NJ4FRRmw89e5MutiB4}Wsat(r{kzvjXKH%d5wc(k7JnXSang|JYTA{&@vRpql$Oax$2aLdmp_w zY;0A;5pV79#%`%+klYVL;B4QMi2mS=hRIMVt`EwU1^H3F`k+VXuZhF7;@Y`BYI!4y zg|I#^-9-`8w$W1pmtg%VkxZQS`@Krt)&8=`&1(-Y90Yk}WxLoCbjXC$fLQyfF$yU5Kh!f$t>Y>5_ldfFy{MOI5SyCM`vc%Df3mA z7SuAsPS38BQ?{5a`aw1B83YqUP`vr=nXC+bhBMf}SepBZzHr(BsNzT1({b1>sY%f~ z1Eg!vqrxLBiWe|c_1>)-cFs9+TCeJh=2nDz<7RD1J_o|)r|U57OztGV2-779k5fxx znlz4pO|H|#rwKSf#ORraF%a41wl)z1=Bi?oNbbQN;>`bf!H~RK8DlXV-9_uB1)o<# z^5kX$x`Ck->4OKXm#XbRu`!2IXDjbMZ@-q8IvSVYh8ZP#XlO>#Xv_-Cudn|r6c`iT zCIbP+r_7z?8bkIACX_#olQ73qSVH1KVg6e)Ole1X1Dry_5`;WiFPJ`PUe{!2T<9-ec^J`?_;_PtPc>AvdnNQ4Q;&c`1cr$*AnZ9oOY1@%2r7e%g5WtarncJeUMv8 z_CT*qvvO^6wV$TA79Ss&d{E*h6A>P4m$mC8u03qR556{W(b3bLr9C};~TOjZ)&VO zd1{wY=>~mJp8vebcy&FAMOXd@&+;EnoO~-h_t}FsIP1%h%1rJ3W4<$2kyDIset=7J zv|h!kE>hg{wOhP03`YlCb^bbrzkj!Ge~p|c55lB^Ow1*7q!F*_jjV09wzKuoZfs!TkY6Xs&pp{!&q3z8SJaK~(pvVG54QP#g$~#k2v@RJ`szaZWt#&mELLN(sl!Jl{ zt+oc@;Ny#fbQNx8 z!zR63z5G`6*%0<(j zh3(jS8(9lwH2D@~iWh!XqGcv5mD>MIg*C7dr! zr$J1|HawdNL`bh2$o_RSeJWq_;UkX$aDlVu4O|g=oPoak=g)ozy(jMKqJ~v50FRM> zE>7Qa^nf&%ti7!C_}fe|4bDF2~NTDvTWVZ)xfw5bBAQ-V7A z>0OGimvo?`V3%3R2$Cp;O`m1!G=|j1v$ry9m}qg-$po}>ap)Yr$rxaLD<5RI4iC$J z-z7CHqUH=)x@NX~n!&%{V>m-ItX!d?*Iccj3Nc8qsQtyU0aJpP?bYiL_+bg63jpBaQER8SM0W}z_%-D8u@_nz!hw!9wa=kOc;k?6J zc`UVzJ&v2(e|vaU=bf6#&334km{R5Pzhs^f9e6=mhwPDAC|@SYQABWxCDSN9q1E_9 zp>9xC!tsrsuYO0#&jU|Oui255duq7KKWwLgWP1P&P+>eb8gshf7tw~M6&lqernx{9 zzo+sIU`gWcF4R&D8o|q5=Gi(FH zYVh0PfK^`#P_1ck>ZKF#kO(wUMX))FK*VC8PnCsJI&S-_fO9^m1JbX|0+;#GE}PjtFtd-l*W2nGqg6A z#X8oySdRWUnAkK5Qe2>RQBOEbdk#%tQb|yx5@G6NV*hb9Tl(Dh>`LZ7OP!Ma(LIIV zmB$U0$Q)2GRMD`?y9+UkGyMA2sj!N3^hzm*_iJZOfH-=^hwNCW?#lr3qlD`PgEkdzdK7&$YR-8k)Npg;#0J!fS4 zP)6FVnUe?71Z zNzwjL4D>GxF-bXcZUdz?@p`lX^`T_{#bNUXYK`rSKqQj^y-i+tt8T_*TdvYa0)*|d zAHDbodd~9vBviqA`zG$c^hf}gWTgL0VN8jo$4k`}yxu^V3-6)|Pk8NYeDDvKv(9@} z%Su}FfxwrO@9W-b10r(hsHK>Ij(*Ducy4b7$*&s8z#?QmLp6#$P6Bw*=kfwK`$g-2 z4A!59kS27P==dw-R%>I@_s-;a7y%o2oC%3sdS%DEDQcPLD7TQJ&`IY@7^ht%27nX)Q zWr)Sl?s4Il-}p0d?F$|s2J}J0dw*hbQI|(<$A%`vgjhFLBw|qjkE5SZBWe0=+ioUs zG~0DgR#l;Lne~@0lpj&x0GOC^eSQ7O^13c+>Y#C}K-ZXmwzIt2+sk-_oPK|`v@YHb zF7qnYt+d*?I4}0_>PK^#iClunyUmuyQ*;zsp>6#LoU%-G-sf1jWS4c%GQ9OQ>qdvZ2mUO%@4|PEUHjt600~W)6OI*dLtAkntA%`vN}#BG*J0M#if0 zMw=gIhwWJ6&^cR6PzhIfr8(C?!_~O$S-B(0gEpnri&)F%1+uk`EM`~itUCV4WntRx zn-EG!X=pw6pKcW2#^Yiwag`xxz*0Cf)i(g85pR7~(fpuBgF!+&kgHAL=42Y4%Ev?! zB`Gg>vGufh#PcbKt6Yo?^n0m32D|~VfHWww9HtzvBx3nABYPT{76YixeBEmrlJ6&m zE+(QpGAYa9J*LRO^O0tBG-<^udjk7DCXfH`X6wbGf2Xp|7tj=L_nF zixK}h#Q69k7YwF%a=&!l#a;Q_hT&0@g&+}Vl(H>XMh3J`7}m7wypV*{)l8WKuPG`j zih^n!XF06%Y;?I+Vpx-r;@ku=9iN4UsZF=wb^hdUY=}Lig5?1=h)SzWoM&XOo+Z9r!&E<;_JAg%T5 z!^#e{LY8XA3F$)>Ob}YloiLVK(e)}erIQJ zMWpq~Pcf&L`HKVXb4xw?M?rjjyi!v5jNunK3O?}d;NbTlWs|e?I>jDTbV$pvlnPm` zt*mZ|P2@Pe?gYU5kB4Z zSB2@p>xY&h??L31DD+;+D@{2&OX$BSmh`1qCXDCbG$m_CE5ATtXTf63CEdWgS);?G zl`}V{@zojPiTmy$t7PaicovG5wr;r%09Nu!_c~r{4b9rO!l)va0xm<2P`^3eVrrTk z#-fL(@4>fEBJ1Ays4IWnAj})Eo{#t#p!$I8lkiMIj)NvW4mv-hDa#T*b=42SChX0d z5!+_JYi0}N9J%v3key;m{OMf#Ka5g-4uNHarKCSfjjJ;@@oPyO^*!wDUO<=1Xe@Wi zXiUt^&1duEm16RBF$%If)x|ow*SR)W`#&olupeOr`Q8kE4#qGZE*INS$LazleEIT4 z&0U*YUGUgWCxr&ff$Rd6P{8`wjwJI#>*Y<`oC$F`MW?!&8fjszdKg3Y=yq_BKM3m& zP6hU?2EVMKLG!I7A7_;ld1olu?`kjLCLGTce#Kf}X)MpIe?*ynhuXM{_2i+rbMwW> ze~D9n#Rphd7(CEN3!GrH)W+XGLkmg;`i6i~m`OzxY@&!XW*Ns6IY>|sPJXit(GUHp zpOvX`H0)=YmOphxPJ+B|q5N{7SRl(m$GJxfIQ|mdp%d@g7Z`VH4_@2P)Cl{Z5zq*I z_c0Vc(zgp^p{3!{Civ?cJldoMyw6dPrkEBV!M80~BA9)tVQ5hYsm_t?q487Uh1`60 zyT?)2OPMF738vQ3`#OL|P~6jc9w`0X=R&*w#Uh?b8B}Frcnn1pe7{C5CSqtMYO2KQhMkrrMgWR`hkA|>(U#K(umvhP>$f2>EC;scmzG1%WeKFdAn%!CqT-FDgJ%+ zj2|3S0iZK2D9j;&w`bIcJ~Y+@>&7T9v{j$%!VkOKU#o!_y&pq${e}0wy_8!Lg9ov~ zSVOZ~G!uBuS{>CT_SqNZU85iXlA(L-J_0egV&ku5_{|bYaI%ATCnf;$s@qs8E3Ls1 zOe|Sp89$@dYIO!@V(0a{IDNCC`WmMT?v9BB2uE`F%nT`BkF4~oiRs?+mQ{g;Kl^MC zkM+f`M5MRG^#ruVwRK`!1MO>Um;JLptjvRRGB$ms6;k& z*n5iA%>8i?NUv6mFaP3k3hCEVtu*1@aCLSr19_D&WBzHAAON9R04Hj)C>se}tMB5N z?AQIthn)YBF78zqDN=ok>Orl*BGK8<+{q2*=*zVA+d&b@hcP2q zG&=~$^863u`hr2VFLbuCz3uD1hZow`E)J{uF*Lg8mkJBhvslGq0BVX#bU)y#p4p># zbYAbdcr7hPQlR_cp%gPZ)_#5d>&e7r3}h9|`G;jb8@uVMZ6U_(s+qyxpN z@h}*}6E0t5Yrsp8c;P8q)!ry+0my%ql##Pb!}_gj#^$fC2phO?t*x!&Q>(b~6VG+?eYwRe`F2iKYeFLDj&7Tu+`>@kaIn&MtCQ{Wb>uIKOLq{uo$^6-~Q zgOAC-tD`U1$oY%jMte|XuT>g1qI2_2)p;5X`xU?5wdNbvJq$_G?iN%BF2%yp5vS0h zyXHl=Tr{&a`@`Qnu07a7erD_NtM4TqL1 zT<(O;;!mTdW5`WoS!02#QuB~ie-?S@zd7N|acdhJv@FlPQ_>$0TA9`(UR~%6BR&%h z11Pwa!@QP1xOu+stnNpd|L=lEHx)t2-u}zq=xmmMpRjTC8>6q(5W2SB{kq)Cd9Q}r z*kEqP5RrjRBo0i6nJ-AWt&Fkv+s;Q22?>2`OyVvr+H5n+Da*F|+WK(ImCU|k3|g?d zt~7qdzDEnVQiyOSKUq8<2oh#oyyQcP54rA+|`%XHcSJRaUvLx`G{x41F z>q>NTCG(l$Je_EF1CbY}f!>tZp@)tMILlaMf(@Tv`1 zC#8IOvo=nEI+KD?!d)=hGzsu)ksQkwDw`mY!Y<&W#C1{2+R_G;rd?!zqgzVdes3V` z=0pJJN<>XxZ9UIOqT49^M6!gxMmtf6$W|F~7N()2q7vJ>zJDV=#fmJm*XlsXh8tv& zY6vD^e%9Fh7D}pI{=xBb!F;q)1Iq5vOdC%tw$;SO_UnT9u?<65N;v*;e4ZJ9D`Wgx zx2o%p1f&gFmI=1{>mX-NCr)kEgcX?uPJULD&@0g*!!fJ-ReK~EHOhI-ca)tXC*Tl4 zudz?$n~xy>yOPFzma+&)@=czcxL`5bu816=AC>AA{l)jTeL%17#ocFUOA2L6a zIeGo@$~$%+-LgL0?VKh25JS8o~wa6!FGd@pqT)iP>mRnX==Cm(4v5Z+WK|Mny$ot7&TX z2&yZyTdG8~yP*24$%O7JQ*RPgzM)o-W5z=xKpU7#o&gpfyu0$pDNl#x2s!l^^J z7Enm4X2WV}HK*A3T4q%m;>5KXbmBjnTwuHqeP<<{V_j16^J$c(QtYunm3qCt4!?zar5K-7UzG3}S{rblJ%N z;I?AiIx!Y)z7yZX_ZhI-M)e)h;w+Ag*UplZ`5sKf@0xX=#6}+0Q{VcYl=w+yZP4wG zs`KE;y7kA?y;977a}y~2J(`~wNeYR~=*mpJUu*sOz(s~J95eSWE^ECv^oKEM2{Qb{ zIQkRebDqCnIFPvo5YeA!Jzt-L6a8-RWFxH-b`cW8ohfL=l{L4LrzjRFwJw4nE3f}m zQyJ4NsBheh6sV7KAC%bB(26P1zf>2hBT(R$T0(waDeVt4Pu!IETSpex?MItvgdrl@ zHURroQ&SW86@8F?OI6E&47W8Ze(|e?l-RdOwSIymFGuvF|J@8VJ5v9S1_?y=&M(YL zM4$V+#2PycAd6EBEq3RbFZ(u+wl7t}swzCxlxQz*r`WYwoQ31$ZWc%qYp#+xgWFH5k9g2P!^8+}Gmc9fUy|3Xe-nwUKxwPZ zo_ir~qIjD&pSRGG$M-1ETwfAbbrPRk8*_oK90{#zrDJX}C=bQrp}~6>x4dFvQRnC9 zkgu8AII$c=-_9N-2vHHC)&2!?fef}&3@K6tyzhLw?6zgY8rCvrND9ThxPCe|f3Q*5 zk3$VtY16laleu{ z_yUMux)v)4?W*t^q+Cwg&pfF&X#TO{NVy-wU^+foU)N@|NNt8boYmbz`To}2xX|J> z9VT@@thzTeO@j_ve7j>*!cIGhL=aX2we47gj$fSj!Jeyc#X95MDyT#>LmC0WSFJ@` z=L1$cbhzZ70cMHp;8ZiR+rV}Psx6_bV!hajs2R<9u3?^6@P1>#6>@=2tx=}ZDKYn8 zAEA}2({-7~adq|^Q8`J6O{Hr*)J-5Az`}(iG6p#vP(@x3r(hC>P%@VPSNpuS_z6m` zftCMKtL=J2B8x;L%Ll6G3k(vrh+najC2b@(nVPM)OHwA%fBZlR5aO|tpqY!M?cSke zPNXM=$i_F(&IQ29C2ZHpMi50e4UDOX12piDmcGOTf&q*AWz)ltUYCLw^UF8u8n|V~ zDJAnyj(Hugve~$$U3z${T-T)wv`fTxv;l5`=}yme@O!lLYCH(%W0j-bYH`nxWB_rP zuI}fsUA53mJA7wPCk~aR0qbHY^vdZL_B810!83kGvqZG=I?bjKK~>Am9VF$Ck^;RT?yC1!W1KTuDZGQ_H*d$ z_FEj>@D?eU{yD)C;AMmjt7LrvCPY?d2LT;*-J%Q?5tUEIQ`EIjs>zngJqUPL8AR{L23rwm|2QV)% z0QiGB8QR4gtIf9_ntlbTVI0;ofbk7}V6U~k3@yZf0~WeklwZ6JKw3JeY*bnY+sncCM>iy8cx~v8Z_!|1+ZuHaW}yG zD(G}CdF(xHWNc=_da!!g7n8wM+?$3ORqt_B(z($+c8@gfIszJl{8Ex_>yhj>qp~Dg;Hqv53Uwofd;Kg z6Xdlcd-K?JPC&f+^v|`n06qZ$oilFlR1#>{9&;oM_lp1No7_@*2O?}<87zE+A+d?Z zzf7aD7GP(v00yY!bW~hJZ~~)fGI+##3~Tnv03Q8?i7H_iETR}$#WgW7_Qo{$5&d+z z?UwnitQ?L)%qfrU8EdpGr8l(Xq5b}3d598~G2FnKx@OTi@9Vo}0j7v5jK}E8r_X110xOV7nMn8%c^t*gx8B`q0Do;-x1RI^}nnf5pu* zLkHerT>h(;tG*@ptJsn?p!1Kz{T4;Z^TT{mWq|G7ePSWR?Bb{@BEb& zqKZ-7eD3keZT6Bl`R;&HMJRlh?_YSWsGpUhL;DCXBcitk7}-nKff5+VUos0@&}h62$G z=B56||^d+}|zLH$TEYcJWD5y^FLZkiOga^fsXDc@C{7 zEA(=DMf=@a)&TiG6LuChqyiS-R27h+UFKHPx*X=*L9=lE(*xbpH-+UzO~P*UhE-aPw8G( ziq@af|7@?h3YC!*V+}9x|K>$ydaDgZ0RbI=_XHr@*yc9ZT!bB%vg4-rm9T_#Q33S^ z&>_YLXjZn%H0D*rPBx2*(A;{ix8t{1Xeen}Sw8`|gjR(})Y$bTp{L@C-=+!VPc; z!PH?gXc1e@u*YJf7Mrd&TrRA-d079?ifJT^vAsn0dl&oU`nkZpTyqA=uL9kW%H;Mv zewQ!GXaQHh!Fz#Y0VnIY?t#ic3J@#$gcOpIm0-QtByQovCJMHt;c^I}Tm|vfXNJb_ zAZmUenIq-&P_&FbU)Sm_1Sg{=lf<*RU4*diDHKkV#}F!=myDa=T)75qe*0vhi6H)z zHCc`K&8@!U@z_-}wN(*`paMPF3yRnHUF@#o;o*@&i;A_R)sfoh_)U)3nyH$lnaEe@ zcKGyjZl%eVnV*|W-vtBsJb>++wY=}5`pu5&a&=1FW*ILL`WT6g|vvy*Mj8D)1-Sl_hp`o}* zX>hU#v$GIKg}*bSXl*aUsK2}>oLhd^M6_(c$>s&Cw0rli+H+4s3tEaI!uVe~FaL@7 z<}yWv@&kqqod!+=gKLvo0tJ`uA_gvTF8H`G*P5!z`Mtx;$ve*-X)eMgLvAlxpk*aa zZcuP=ufhI8gp%qxbrE2=|Mnt-b_yEX4-nYwNWdmeMlwl^Bs$25vxp!Cpuez%s!b7Q zX69xsHU%V?0f{$Nqb^5%?p_IoOENe{TBJA%+a!{&)Tix|K%%L^pxO{`T;^Y^=S6|% zjx2)X?~iBSEYdm&gMvsC;4nk&3xZ{N9OQjDsM~)CR)rIW(*|Pn-tPxm$Sf&w@ZuMd zSzdukB(LSMys+tFz~6`omQ(B-dXw?-sh)}9dTrglF}koj?4{n`BBg{xx8iL1%n zhB|x8$)Bb9c42h5n72C$oC8UWn5sf}ya&*7!V1G`D~*FXZAfhYHjE;zm;b9Yj8)k* z8o3iOCdbS&?LSs&!T~U~dx04rMkJbb8D3L!u&WXA2Pq8tMd64%vq|w!q%VNjpTGZXrT;we}b`S798p-9vvyBNWxePT&gRE5{7 z3k~E56*1;*OeU{c3wutcw*()qeq7`jX!AlMrygN1v3v#8b-!8R{UDnN zA|ue_e+z=nm)D=JEP{h&!il~aJH+sP^pzxFNA3+5ofX%@?S6BFRT!t&D}v0B$IY?J zH#eg1PgbxY%DvhLS&1cx{e!KWgGXj%1%50vN}JJ^{ROjUwOQWVmhc-+xPYyRWwkUc z0@<@&hR7c+w95vEtH`pXS~%4GZ3^#ccx~LuUJwXm?TA~g+-D=ny}Hk5z?GxsZzN1`@| zWdT!jd)&R=rW$ zvM$UWR!j*rsuMNUoEl_W70xH?RCm{SE&Ouv=Y;6md4+(?E{aHz8i$aZL|0el^7Z@6 zS%d!U_C~9=Mm%^~QkMU}ZJDR-qCp$tLI?ggjGW1=-S&dU0&x4nbz4rbf<*oo?IMFK zr##zCK5S#`3GQ8iRP9htf<8*X)T1^xErGnQI{?{WfNXP-PGZO*zBzA`hs)qIO>49z zagB(w0h3L-DBiT;sg8|eYsF{{;I^q`61r?O=M({Maid=X94Wp=bq|KH+t1cxZm*p> zi_2FP`S_@<&y}tI6!|>do=UkL-T$lQRsTL*K;25#PiA0h2_C>=Y)Z0;x?uYXOkWaB z35kjM-Hb_`23pL1*JDF>oh{VNpJa>vsGHdhoo#V`*`@Mwfv56h-b%Vw@guR89G+kM z4$#9YK==Y{DNInXQc=Bs1Q`n z4K->5Su)C2C(g$hHRb{^m)A#2PfS9b>2J+Uor@lxT#7t2S^BuPpm&?yv zuU@&EdKuKh#D}^vOaI@VvVJMWRIK5_vwGSuPu4qv=cTS!YHdd|gsQkyc?9_eDCGsI z0ZzR`^tA&s7i~&$YoEtbrQ&eG1-PoWER`r!mI0ox^mz*yOnWW;^^+wf+3>ewZGINr zE~?C_CGu%CXFCMK2#_KYpN;`9Y{ znH(ld`K>RYsXOP(K?VJ^P8D;>!BqJuh>7YCBwlU|H=Jrgiw`48W2Y)EY=6_7X`s{qupk#eB-BgA5Wd1HBbI2+ODTFGnX|EIQX z*?54VoxJ38uUdh=)tKmBF2c&*9t&s$gaYe*dVPlR_h5EhUsDamHhSiYUb;>HJ9!E| zZu3LX_GX{n$3>2meXlsISese$!DggMSGVY7KqI!mdC|mbE}4@FW0@5W(}jRyi(_&5b8&Sr0|ZMBs|4oa67+BL)AOL9xiX_ONlm~cdQD2>`#wfqww;&Y3 zBjUf5j8gsy@o{b6|Dk6DDzOPJzD0&}C{=)%k{G@bhQE|$2Qdkz%Ga|InO7@^e4K$P zDl&V|M>iv0`>5+h{t-rhMTP&ntfYgxph)^(P?i^VhDTWy8G&|KO35_0WT`1h6+&cAlS0fvr&S;K}w~rg5Do(gm z1${PmO~!6L?rGl29L4JF{>5fwV^rX`Glo;**ANi8-+Qcozzx^P1pUHhY(RLNUITMW z|4#p#a9v+n8G$X^^%yBgjsN$4<>hJ!Mk+TQE90e$JivU#0EidH-gO7N&vmLej@ ztUjy@6t)dlrI<-awGx65W2kgzaPEC-Q=^<6_{YdluVt?xXCj9iF~y!%D{N}N4cxTu z)%V@`?IRw3MX}USmiI4tKe%tF^gnMp)OnZ1|5DGC0==HgvAs!=IZT9|g)w{}NmJSn zP?qkHo~|j&+VkTmM5XB@1_7Br60ry*{Of*u*-Gq44b~(oufx!wHkpvTiVA`pkq4V2 zYrehT_T!&ucnabuT5nxU*hnG#=|6!adUAR?46w_QR$ruta6msn8z`EbGo7fDtPc%Dxt1z$K|x58pN{$QO96z!a0|Dsg`oaMF77@^A&h zE;M1MyV&^X_KmXvwF}r|m%vt`r|r6siJ1VlP+^zqGZg$f?(;O<@h}`bmL*pE>l=O@ z{Ak`JC1P#O{O{ktcuNqQZwxjy4V#^4*A_HK^VEZZlaqlt9=Us>1du$UtKW-Z2IhX~ zz|xT~$~K*g1(ZxS9N`Lj;f$G{=V8w~FlCu+riXrbE2DHzM6wA{}oo>HY8xstQKl}mC& zG*~5>4VlRLW$re_Een51c`Zs2+R(PFm_hxm5qNlGzSFgKWpCES<8 z>ky?FotFY$>JffmmDz4Wj>X~t@vuKYhn_!w6qjWD@vPhITjV< z%Ip`2ypUI-#-RJIolF$!CK?NTkJjt8fc?Wm2pj34!Lejoi$1|2T52v{an#~XYQTCQ z=BW>}K1Ha3O4AHsRE<5Ah#II0aYWvv?#u9=b|xLH>|=Pcmbdqc=cZi(Q?z&Z(Kt=E zrNc;*b^P>5UM%5Bnp@lfU2kJ6Wp!Th(K2Kxy#sM{1<+xiK1aFs6IZK(E8I1$~;uYrFK zfI*ehQ%4w#ZVHBNzUN2p=;ZX~?c2A9A|mN<%xzskKD|6IE=xRSEaY7haRFkXEkGnA zGm|kKzAYLy#!APvhYt!zBoNzwZ#)mCUyG1=aFO{=-9tnck_n158}UxE1*v!ty`#p$ z#{_++JhA$M{+;nu`5HOV-uK#`6GDp`Sq`aa!0;--!=jG+nu$>^SBvu@l+(~h4w~oT z9=lf>N4muOOs{sTCQaEEhiiH&ENRThYn^8N@iWb=Uj!B-wsjv&fLdt}1}td!T{o?9 zUrfGyj!R*OYOgyQ@K~#KlZ@pM)h zX~(wvNfthaigdVU!j^%X?8bZ^2v=a59EZ`cH{EVdJ6tk4`?@@*4{#=Ay0jdCGD1DH zTEMv)w@m2NsP5EyqDsM8xYQZ=R=ps;6nwuh4Vp=hecdE|EBS7eNIi^0uLQxP$q63g zX4p&6K}e@g!Y;e=cE+;)Sd;)qB~un1*dEmyfy-!Qpej<9F|Zc=lsQWge6*|CiV33M z8{r>)AIFNa2Fk6jc6WLA?j18yun1%Bn$r}X(Z_&P0~deTjuQ!*0^nv~STvDO@gpj( z|1)`SZ=pi?S z2PK>VQec}3+1r4Jkka7XF?Ka9cC~xLeC&wEfYY}5=JP%p83?<#P?`sL1eM4j727)2 zZLGzh+}QgT@W!|E_gBZI_SLWa2y;FGF;Oj37&f4S*B3#v-2eI4B}YUBG`pdTo--U| zU4~{45CLC%dJ5n~K-is)35Gbl*P0U2)+oDo4aD94X|8=TJMOe9_~ZUf8!jG)<3IGP zRxGZU>0?kuCaANM>0(IDNR*f(l|-pd=6j*Sgf?44nv)W0_Mu8=L^m(URZ>Qxe8b#qns74G)4gMiaXT7yxEl=&H;)cYrWk9x$R~9JdOTmx?^M65=hvxP1A-x zll*+dwrCokHHPzY4r#eUVGXXx(q1vzNZ;1eQ%C$ZoG5f|PG3+&B)_qd0{B;3+#<40 z+bv1^TeWmJx5={mKTR1pSv99Kw)UM7O857eY0?dJ?YUN~WuhYNgpi9?H@Ti#+24nJ z1gY^ND+jp{f`80t+FvQCBrnb+nZ@JKH%e(^ONO=Kh%DX`v3E5yF8OJn zSW&g~PXuU0Y2E^nmIrCTh3%vA^@nSdJ+pHWk(_$`?+kKK%Er<0l%a3a4scCbR z-MGQdJ)eWyQT6MH-IA!8i*dAz^6*3>t(sO~E=p1aWB_Gq#PSX~R?g+Yf+2 zpN6n2^JX}o71mM8s@3D4Z*pT;sm4Ey8 zdH3d-rOUE?mpT?U6y7I}ODNMuA#>l0S(PvBjGJIeE^mwM*!22M#K46IVcscKEzjWJ z&<_lvX4h%8AWZ{HEXm{#a_gOQdFFn@k8OlUheKbbRekK~u1OmpYnpv>;Y^omyZfvu z`GoWfFmK;ceU~NPPX^%~L+9JD6Ew;e0g2MficZvtR76w!ZHh15&E0)^T>tl2SQ)s( z`R-()T7Id)?9HV^hwa!!CuL78l>ji<&f&5zk!&Wa=611K?J@JwpQqm)s~qd$fDQqA)`aZE(~i~iAnDJoh{88|ypJy}B3IYxz4 zmAKT7DAh*2S7V%)$66{>p;vNzUevQM?Mu5ZYe6r*ez;nc z(2zX;DOO%y-d)2bPE0|tr10_MM~s>I`OhX2UzqWOlBnoEaR_&^{aGqNSj2WUz_1tr zNMT}SB^J0bB8UYbt>8k9F=$D1BMu&8akL`9q3>TMbm<9j^=6(j#AP?ijgx1gnI%ls zPxhJXo(7}cwGDowF>t1`>KxrS3=@_T%*Z$k6#i#o$fZc6Zx#HUq2T84-RHH3%;&); z(%uA&S-5saBY|>p@zi_x-#biViMBYdM|CzDc&i}Ih^cf4R%u}&>)*rD$~D_%;iHoi z`uE@-*?9^abX`3?%e%h^fYAC>i<=HQy^@YxG~->%8|bDef$98fB_&MhhckIEAD`6R zI3kp>+bY>|VmHnwP(pF#XN$M0geO66oCFP5jQR#ySqz)9iB+Lox*+%Op>?L3ja`3M zBJs)7o&K!E#`C4BhYsLHDu361z7-kXK$V}R-MzG&BsaodeHD-c z@5MSi>h?X?ym$L2Un%bvV(6_*c_aZcNxC?D55A)iYaa@Ufn}))ISAL}XM>3tEWpH8=JUJi#y0=`naQjF-HbD9( z%0{_hWGpE)Zbm9)$ZfwBHnfVOmurPOD>cbkOyY&8<}3*NiQT4nKmPXXq5H_|$Ub8@ zG?CEdz_MX|KEGpi*S$st#L6}v%AQ!g;He!RCbR?Le93*0)jvy=g}p{zPP zMb6B+z{rm=5b+f3B|WM~%uIbHmlwVJ|(do(G8~X2cX)za4D5Fo7lM_{Ki<#%j`Jte?yw4A=ygX+i;~K*V))8g0 zPKjL|v{qeoN1K{C*O`sI+LZ_w09*OTl+(7Vq1diTS}DoMqV7I2CfVqqmPHIN*)A;A zTeWqc-%NSMvnBN}FSZ5n+Al&pJv||5V+}EOJWQ(JxTuVBKk=P+^nKX(rS*CE zF69X+p_So?OctS24LlqDPdMBaAAY`Mn=F*sNZFk)CQ*S``$!(4mA!D>`FS`i5effd zo)kw^>GB@lFv4rQHoMW{c9qytf8B1{;AOs|+gkq3k0qtQY;eWQk{y9nBv4Al-9 z%fF&hg}7NbIXPKG(c;&}#;G6{J!n|_nAbYMoxGiOKVue1{N7lW3qLu_Hr1kc2Ql;g zQPa@SVB+c}XW1!{=~g$4Tn^~i)A={Y5cEpVhTQuXiqGjEo%2!Jv)0c+Fl<6%h9XrO ztZ-y01$Xz03@Sc|vVUNbs6oNPvn_IB8mv&HX8YH?pZxP>`=JFa0Tz4IW#R zzoE{vt}`~1a}M3q@w?MixZ)puzyLXyC9jVaHVtSFVP&74mLr01t&9(-p7?Q7|G`4g zn}ZhB1i6gNOw^s79qDZ4PL+mwn^hG;=2ZDD>`(a|60Almokg_EW?!0voF9jp>ye1k zt$y2&hNL56OS-B`nSiAK~2vk|@_RZWFWTo4D~eQ=&=3W&aux6yfZ0IioItk&Twr8D!7kFyV0M zx7S!p$}-Tjl?ffYo9lZmU|Ybek%$l>3I2mfd4YTdF<%t4f&gw<3B zn;q1Mp%KFM}l@IG?^K|L_NKc^%Mv@*T;Z04i=KpVM)ygdHa))p*WQkG!O zUOZpQ_-IbX(2Y^^h?+}=3CJV9ulT#UDFz$`h+?Dq-^;f0DB4w*xz0NySCVC!=$8-3 zp=dm|x1!eWTSCgxb#&Ua&?sc2F`lifZg}6JZw~P@6#;^FqeRM_=Eu>cz4o5L`Iy?0iua+v2)-i?Boy{ID~4F~3TR&n9{>XWTyp>W zC}}#7XFIdD;-eDtKt$11Vn#; z>5YXz4SwDIaJEw97himobYRztgY`o5O{)Trm*T=XVpM-z&sj434m9zw`-+qV_?3?yxl_Jk_M*_}|M2NDSb*7UOCm`mDqRMe zj47%tlK{&wzBpX#76F7$--lnir~FVcvrM&23ftsc<}tZvs+IKg!Zlfg&AB|udoFh8 zhW{1fyV5Rb1@ItKlySN=e+kKEE7KduGJM?^Bn*UcbjfrwTpopCj4X2?r| zEiS)5oT7iNKDwE=(Gj5K`O~REuw&~7DZjl)i5 zsM&-d;gnAF&EA?uVeLv8W^uEuKn>?Ew#C#B&#|6X9W9~DznRuImnTontNj+Pio~k0 zv4a&TRTX$^&bL23N4(0&&(A+i523ld1iSx!Z(6Nzo@R$DIKBAjXgLsu6(s(#(+Ftf zfkcg-<6t9~0L@8Cr{(1W;>55&goAbhY&Rh4dVcsYJTnuj%B+@8cf#_T1zOg-5l(P3 zo3epDQ*B{m!#1+Xbq`-{-2cge&_Tx@qA185qhRTzKYBVd-mTv*KDq%x@!x>Dqoie( z@1bC(4?nkG575EKDkz4`5(rQbvc-(}nJ_C5Ao^p!hO|^iDRml!5O{+l@oueT4XVsL z>z71DRNY@2Q`$geu^(XZ>iu}*T~SHONm0w)bln$P{v4-JCnoEe=R@yJ7Hwb#Ktkny zKGlTq@sNaU<$hl39S@;s6AEtzbe0vu-Fza7m9E@NjJy`P?hx?;6?NN-S5{UmBb$|_ ztf3K@wVRVyi^~#;HZ#C5*)4!IgoAs@krVKybZOrtPZhseM8*Pp?0PWymr0}?!|>!} zNOQ9=i1=!YX9j~tmn>>uyzb5%F5d6}ZpF&VYRQARdhR;QxzHs#5#td{!MMgp# zYy4{f2lrAF84~W=|NLq7^;dP1({8LPL}MdA@fwGCK2>0+sCgw`@+SmUjRoBG1h&Wn z>$!+6Kpgzt?MC@pSE$m z8jLz?nw@5*>@0`g%f6|#D7G?LED}d1@j0#ko0ynL2rHx7NH#}|(nG|jnOA)4);A|v zFpD8+RzND&>K=Ub9d@7s(X0$Q(G$z3$`&oPX)}^cY;C%%q!MasY8EkHeeU3Y!m~+3?(RCVQK^czAAkK7Gg}3W1Lip@v#0I-G>qwY>aK;0ISynK*gR`KU$!C? zx!zw95)%3V9Rs8w6D8BPvw?Y^{ppab=>yg*_3p9MdhYC1mhIy1$e#2+dhsK-3xrT< zq~#9G5E+R0l=(w2rlDlGEC-GxF~onK zgF`TTyL9;m!|Jvsgma5ia_9c>nh=JYkWIWRUB!H<=X-hAxV*fK#X^kPH4_LM{7u9C ze4huW)2NI-Pc=VSSzGbKE(N91;0l(mp6qc6`1v5ttf;Pb?E;CM+vs$a)yCdJ3+=usY{Y78S>gC3fpUFwAx`W;un`9;iZ9(tjKrm; zeQ`El0KMG~gmcgp*^T znsS@|ctXq~6}m{uzE?YiGrQ^@$X6Gaq!Gx+sPVQP`q9R5J%Ug3$Z0|sMy$H44V#EC z@0c}guugfZso_TPxA(DNh38d`-NjFlo14i2?^j?>(BQ){p4V8C81r3{K-ki*Cr9LF z^I>IhMQ$wx$4 z=tnbNrDI}tkLRkE1Yd3><07PaseT-|Q+a!PyB`2KR3D%vn!35OGlvV8!TOXp$brJl zB&I7SM)j1n{!j5cM=;;bm!a%2EJG15M7!*HodXJ-cq|_?{S;!W`{W~uiqg!d$e|H= zY*B0Jb%i7E)C)XYJ)j|<@;fgUk2gm*?zUTQx5-3K@)X$K&=CQpX5eTTvrPm$awOW4 zfk-Atmj1-i@9Q`UVd;zblkMY;(GS_1#fb!8gp)5yNYFZ>M5i_7cysq}M~(!=m`r`l z>x+u|uXgNwudeTPR{Xc?cX};CBdDf(eMqh&Eh$8CL^DYeJ|sTW@u{cQX_WRCcYg#a zhGZdOcwDc{b7`^`$n_V(zvlBI_%YH)%8-2eg~ab-x$s&aLH-(~*^Y=(^afDibP94O zXb@1+qU|yi(Pb}&aVpyjO?Y#lAFnDlrQOaA>Rv|OovbuW2>tQ3;Y?S0lIh?we|=pu z=yO_ufA1#5`^p_H-J4YHs})I@(Kb?fP`;7Y&WF&+Vh!WMKitcpAI$CfoZAs9AzgD+R%-QR<9x)!Nk&MwV&2AH@JJn5e~mANGArq*FVro+@wKf>9pCxt)v*?3zY~kW!$8=&#u3BUH;sqA zEOtUiU}DtXeAAUTiR2d*neTqM54u#V9T%oQU)V-7+y6sV?0)Pth&TD&HASUjSq?_& zZw84%XDTj!CH}!`Y9mX(=CL~JX|+Dg{jSomSzVIsGb!S;GW)c**7}F# zSkGVSwxp2*$m2kmM!(3KCAwxI#YMfT_Qx>{&yLuifCM)fG|{_?lE;oVH=?lkdMR`xE~!#5h{^ zF9S4psH8R7H_#b=D%JO%25>wwSC=CY(-TQE#@T1x8EZ%R@;x6Zg;^_idA9O31?9y% z6zTe;F&g7t3l-Z_fXXuD>U|F<9f- zP^O6Q?=g>Voyq(nY*_>p#xfa$Zv#1MU074X_NNLmafLsqdD?Xosp{lfe0)q)4Q*XZR)9uIJlZERZH~i(s|E-x zG_l<3U&_gOl^Sb{d)FE35W6r@SmO9lJr~mt4h4tPC+c= zo8Y)`j1rui=$D_G_euMAPQiNfyr`K2y2H;9UI_QS=2h=A--|x76ran@7ubmVMDKY* z4B)whQmAXXG$x_YvMs7_dXL+?BeJt1RwBU^g>DCcyzZ|j*)`Vyc1(PY&CKbKY5fNf zC7C>KvGid_TOGI7t^H5!>NPdyX-~zlOvlRk+@>~J6x=ryN}A^|AtH18T^Xsi?q|AI?%sU&NIV zsRXae?e4<>Ys)p(UWrI)nH;#1Wh0(F`ulP;%j|8s$+tR}Xsvm;W)e^xhK=Yf6rO3= zj_!v6|5UxZsfWJD7bh(9yDjYYIx;GpmL^1z`F6lqt#^40U9UQ?xql z;Qh-(3GQ;_vqu%x6>}MlmyKiPyRF|Y7BB-uFcva)-M{t&AhnEqo0AO_KaZG=!l)UZ zb$h;Am6yIRUPYUpuK4l%g;7I8!@+;H0{&IwzO6`4W-1%bD9MEXK%8O3^hiVbhvO9g z7$FwRzW4rI4Jo>vPX`zAle&>;~36z}vl@bBc|EqOF~aKn!P7?V?P29gfSPGPOmd;3hmB;oAA zbv#~2Y-acJ^peIW8Hg*xMmr|Y1Wc&*G#OpwqTNivYw>7XqjAQr#L3plusuUkQVPFu zGZ8c!{6@tj_+7=yQoyX}jmiE4Lf~hc<4KbL^5;)`Uw+7uV9A&~t?2RUSA}=37i;mp zUcf>*zf(mP9*C#q^0-bymAI93&FC_u&$M4ymO5g;yar?hJ< zy8&pR&rSHtd3SxR;cO(MBo=nw)}K#3rnu3_?1(CMl1mfQ=r~rF*-A)H-nGCdqvGt< z7)>UluQRNnHL zP64vRTM^($6trsXfk>MuKovlasXIy1S;i`{@k^f6J_+fM_KS}!*(u|4Y#6XNfC`Na z6ZjuMYM22NE~|D*z#A$Fv}a5e9sab2r~$YarTPUz>fa=OZ4t$O*om*X4cn;1^^l;hyW!i zbynTlQhq9eC-Hsh08vkn`$0TH$@JUMpIL^}Rqcmz_#tzU75YU&ztAZoE#6e<`E~+WP(Os?+8EL2}vK`=|YsC;>|xFTI|5>}Pu# zaU&Q4h+F3HFf09ZtZ zZ+?KPZ5#n84q$8cdXpg(d1N9~7WM^nCR-ATiSzKRm{(KMV-8fyyaa$VPHr5joYBxg z377*y`vBtK_1rG15k6lGAUp-@ay%gdr5eV@lYbOS(slHWUV^H_=ba8ks~EaT8!T@u zxytnf}aw)U)t!qbTxKAd)H*rK~}zX$)256#o55b8LyoZ0_ZGkTR_RcB+OLpK>(qBwdE?M5<;ygTqvtIpn$d?DM`B; z^R->gM^{})zyENpZ=*=J&hZy$6aJ!8X4L7gRqn+BstVrIOM>o@UJh) zLuapdcXt_Ps-23rFGC~slQ}f}v=NFp>v_!M7QHu*V)aViBSD0tbo1-5H>$5-vLKPu zxa)YWFMd$u;OD~)cCB)g`H^f{Gahd4PJmWp`|xgn^94RI@m3c-UtuPVn;i@}`c(4(T)%FO)T25>4ybG#qSJw5ccx>mrf3cL%)*3**J?yNpbX*U+Tq{&U z(Dkk9WsL+86{Z(&Eq-2;ZxPumyim~fx*gd7$E{ZAoGw2*BrC>oG^D?$r**~<2%%R1 z;Lc1%#>p})ZsEbG8vX|}=8X`{!^LkXwc0L8E2`%<~hJKRh!{S0I`VmHyz~}Uy zmF7$L<0$Eqe^V7JPV2uvNqx?Dq}@Qp~V^8qnrDcNb#1${$z^~huJ zND$zM8=xQ9V(@=DJ-8!suWT#_BNg2RB~<7?|Gp>|_nzbR&z~x6M&Bl$ zw7+@!+Z`Ya@y*V?pC4_u8H6h{JbKcl_u~2Uef7HHrqk)I5E@T&Y{)%*jI1~KgNc=w2+0Ghs&?jO6V9o|X35D| zp#Jq<^utX2k~O2A{z3{ffDhunbtXV2bksiJblX_5JuA|Dx@3`;GK>AUA8Ls1%x$Pi zDnVy`u|Ufd6bL$4=c0u99!iVL@L6s#Yliq~51=j^{tT7~4yqavs0XEC*;aTIrLVW9Xm#wi^>8z>eYhSwOL zd3>u?ZS%}QuV%iy(BINRjN709$|2>aJ;Zj<5w8Tn@68i<410;QKdR7f+%)(U=&>|d z>++d-_u71w;I$E6b;+gT{hO{jZlGCTY=xQ@XX;`*TkCKJ_}nkoWYu@zPqBV9Xvq~mr% z2Tw-zg?6&|_6mhQwB7oh@zvZc*#2m3y?40}#(zCc72G+Q)YpfIqP6E1YkxCi6lK|H zzbGXIJEYm#mehL{OJ#bc9a5gmEc|!W^CGs-EWn=!WIJ9t^5%xdO`pd~Qu=3ou67#k zi~Ph4Y0=K*DAd`g0?v^Af3&XsyRu{vS0{G!7t(arspqq_u55$rv-H1G{^1>)5c*MP z!<8t9^I?H8SOWB5Le#aeK^m9ZJ8=w2fBE&5%Hv1o2Y9N9275Vl=Ba)Uki-(nR57ru z7al#8xYF46PAQkMBK?Yk;+lrUI%FV*sWsQtM6@QvuR zU^p7%4?7~e+?~UJKlF|+m4iB4Jgu*m-Q`znCl_pW4kteB99iaf9Mub`j1GNAx5iP_ ze)UKO`Z?o+87DIL*(!oeVWGv#9&63mr4h5OAX#R~10`+IaaEU~rR>YL1M#IJ&I<82 zY%S;Et;e}mVJ>I%PFKR!UYGMK!aT+rW*V1+W-0t77r#|DxKclKHR?$;i!red&>u*o z#wc4*ao?Ljs%_bk5i>6@&%#zps#^|1WBmJwaxgzA)e`mJ&9L_KeZCXRp>H@%!By3C zM$x;edBnjuC_37xJi?;vlqmf!*}dKZxm5faZOQs!@Xr@o?NHETP@3j4m?Bg}pIBnh zI9|rMHu3<;k^8E!&2iJ;(`yA2--SD!&xSg0lThSh-g+j(DWP-y)^)UaO6b=$UTE}Y zoIIsx!*hhQ8B})1QT%ghxA}o%OGzmj<0d9D^I(|3Ph*i=l)#TXzOxUqh@Hmn?=BI$ zU6;}Ku)L|7f6QU24p%1-PWxjtC=PH8N6WWXj%Em5v(NNhhaGl0JXw^L5oiyy*{tBe zwVC7a+FgoYh1+>$ZWTA|YU9C;wA96jUsuK>Y3=9yVH>H;5;&_yTZgawXI0TF z9e0E7>aL?qEJ(JFxz3p}tzQ)o^|P4EGIob!r1zJz-hIP{M#{#s+gvRX`u=eQ>~L&U z8{?I+JmDZ{DP@YW##;r!mM6s6GcL(T)8?@%XCo7Y+wZ0)MqovbmRT^)wL%Tl-1nrR zH?As9g*neO*8cn?&4{73uu6Bl(@*C+DBi17!6{jksi|g2ZrGoF{bu(dhCd}55*;{V z!mlEo;1NHBTLl#mnA(u2sy?qs422R&UR8i-GJ)f(Hk~SFXRKIg)3EKfF@4mG z+vN34ltx;da{L9X6{Fwp3C=MQ#FHz&YQdPTFB&L{2ksZhJQTSc{&IS|rhl6qnpyk# zm@z~kpLV;q=_}-16-%Sw2!BO4QdB+)Eh{ZX=47HXoY^tSu z5-gFXnXW{_%2A{#Mo`Ko$Yvp&1?R}WtwLFJVEz8nB8`bd!#++WZGA9+Bs;(Tu=NLR zh|jlBD}48_({%Vkco^b9&?J-?vm6&Nahx|tBChsY?pn9T3+h_TKcryJRQID;ncS~M zo9A!b)QbUja0y;|oo2yes}j5JcNG2@?C`iG`^AL;;?^LwyV}UOQTnHb zOC9E7@@^8>Hh%@IgiAe8TPYr){JH*wtwln#qZZGJ>;sL-V=i;i0yW^;r{LNxE}(&M zB*b&@XpuJpurux#aFc4q+eCAQd^?q+6g9SU{IbwED=pGV$K_)m`|*4!-6|P((hg+F z;*K2D@ReV($V=7KHtZeFulWDWA?lxa{QFdVo0H;3MddLJ!topmH#^aNVlBQn{&CdS zj3HPqzxbl?&ShL}r{(sfL_k)ca}}^8?w7m3C9!Vnv%1yj;G7gs%Qzf2Paq7J?Bp9r zTsf4xz)x3v>ry!rwBC$Qe7j=$K6V=Vt)h~~glqAiSOaTcs}Vh%bhdlV(Z~6vQfiyF zqHnSK_m_Y0Cer6a2}(WCt>2JP^yghsV^}lpm6MRN>wc>Rwe;!xAMqbg;yCu|k>cowTGJ|0yoBd`)*(>J>=;rU^rl3vi@HJY z;+6Q8Ytx+DcCniAp8r&KGXW<%rO#%(Imb76)?7>PuSX{UY^gDZqoq*ZKK*4cXsMEXxy*XaIH{acEG^h}Y; zj=6jlc#KY_8(DjMx&3fb&rPp*A&I-r8t9aRg)#3O>*TZxN@_!(POj17eRax@ZXk!r zx7MqKzYc@&72D{@7QDi@Ao%{SwiSgWZ%sT;>=zVLID1QvIvbC6xO^>G3(qCtl71-R zM}a^Kj3g>_7yxC8yRZwu(i#J3tY-;uyvPdI0pk4UrJgxLrOgM zoDBXzE$Jz-UtinVn?7C1v~a1-+v4r5IvYr2NnYL?efu_aA<);feYH&1@(s7y;f2-M z|5-g(G(!0^T+VvB@{=H#?=gNq!Qy(SW+4LI@NE!=?EZ=e4dh&r>|ZL6rUSIH&m=NR zr_Ebqpp4~Ad+jqqIss-08*!GxhvdTi9R~u8%MK6R1-&P<%(4ggw+owR>{@P05%bD2 z%k{+;8UJ%}z{maLR?KMhulqBqAfk5z8s^6szm4LO);j(TOblRzAe{)9=+$5WP$YH$ zF;kCNd!9tUD)m11wO06+(Aft$$cQr*8>Htupr8K&E(NBI?J1J64cjiR5lCHkn#$%!GU|4UY#s^9i2uTdu+w~`)uid7g0h7fxT%T z>E-E+T?j3h1DX#A@I!HII>~WyaWLcGOUXK>hkts56gwgDm?NTyAxE`5ajT$Z6h<#F z^Vu;7c7e-Y3wLVAerf_nK0bCUC3Dh?muAAx{m(VtJIDIfdRvPR1mj;>V`ZWMq*?~> zoIf$jS7qHa6{DM#@=T_Iur59`U;q>#u;_i84+s)vAYi?D{q|L{ IxPkxw1KN+HX#fBK literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/LICENSE.rst b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/METADATA new file mode 100644 index 00000000..aaf27cae --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/METADATA @@ -0,0 +1,125 @@ +Metadata-Version: 2.1 +Name: Flask +Version: 2.0.2 +Summary: A simple framework for building complex web applications. +Home-page: https://palletsprojects.com/p/flask +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://flask.palletsprojects.com/ +Project-URL: Changes, https://flask.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/flask/ +Project-URL: Issue Tracker, https://github.com/pallets/flask/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: Werkzeug (>=2.0) +Requires-Dist: Jinja2 (>=3.0) +Requires-Dist: itsdangerous (>=2.0) +Requires-Dist: click (>=7.1.2) +Provides-Extra: async +Requires-Dist: asgiref (>=3.2) ; extra == 'async' +Provides-Extra: dotenv +Requires-Dist: python-dotenv ; extra == 'dotenv' + +Flask +===== + +Flask is a lightweight `WSGI`_ web application framework. It is designed +to make getting started quick and easy, with the ability to scale up to +complex applications. It began as a simple wrapper around `Werkzeug`_ +and `Jinja`_ and has become one of the most popular Python web +application frameworks. + +Flask offers suggestions, but doesn't enforce any dependencies or +project layout. It is up to the developer to choose the tools and +libraries they want to use. There are many extensions provided by the +community that make adding new functionality easy. + +.. _WSGI: https://wsgi.readthedocs.io/ +.. _Werkzeug: https://werkzeug.palletsprojects.com/ +.. _Jinja: https://jinja.palletsprojects.com/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Flask + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + # save this as app.py + from flask import Flask + + app = Flask(__name__) + + @app.route("/") + def hello(): + return "Hello, World!" + +.. code-block:: text + + $ flask run + * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) + + +Contributing +------------ + +For guidance on setting up a development environment and how to make a +contribution to Flask, see the `contributing guidelines`_. + +.. _contributing guidelines: https://github.com/pallets/flask/blob/main/CONTRIBUTING.rst + + +Donate +------ + +The Pallets organization develops and supports Flask and the libraries +it uses. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://flask.palletsprojects.com/ +- Changes: https://flask.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Flask/ +- Source Code: https://github.com/pallets/flask/ +- Issue Tracker: https://github.com/pallets/flask/issues/ +- Website: https://palletsprojects.com/p/flask/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/RECORD new file mode 100644 index 00000000..84826d22 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/RECORD @@ -0,0 +1,52 @@ +../../Scripts/flask.exe,sha256=PQU3kE4W7Ykhtm6mYWjibTzmusLQZxDQpLpuVVOV9aU,106366 +Flask-2.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask-2.0.2.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 +Flask-2.0.2.dist-info/METADATA,sha256=aKsvjFA_ZjZN1jLh1Ac3aQk-ZUZDPrrwo_TGYW1kdAQ,3839 +Flask-2.0.2.dist-info/RECORD,, +Flask-2.0.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask-2.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +Flask-2.0.2.dist-info/entry_points.txt,sha256=gBLA1aKg0OYR8AhbAfg8lnburHtKcgJLDU52BBctN0k,42 +Flask-2.0.2.dist-info/top_level.txt,sha256=dvi65F6AeGWVU0TBpYiC04yM60-FX1gJFkK31IKQr5c,6 +flask/__init__.py,sha256=9ZCelLoNCpr6eSuLmYlzvbp12B3lrLgoN5U2UWk1vdo,2251 +flask/__main__.py,sha256=bYt9eEaoRQWdejEHFD8REx9jxVEdZptECFsV7F49Ink,30 +flask/__pycache__/__init__.cpython-39.pyc,, +flask/__pycache__/__main__.cpython-39.pyc,, +flask/__pycache__/app.cpython-39.pyc,, +flask/__pycache__/blueprints.cpython-39.pyc,, +flask/__pycache__/cli.cpython-39.pyc,, +flask/__pycache__/config.cpython-39.pyc,, +flask/__pycache__/ctx.cpython-39.pyc,, +flask/__pycache__/debughelpers.cpython-39.pyc,, +flask/__pycache__/globals.cpython-39.pyc,, +flask/__pycache__/helpers.cpython-39.pyc,, +flask/__pycache__/logging.cpython-39.pyc,, +flask/__pycache__/scaffold.cpython-39.pyc,, +flask/__pycache__/sessions.cpython-39.pyc,, +flask/__pycache__/signals.cpython-39.pyc,, +flask/__pycache__/templating.cpython-39.pyc,, +flask/__pycache__/testing.cpython-39.pyc,, +flask/__pycache__/typing.cpython-39.pyc,, +flask/__pycache__/views.cpython-39.pyc,, +flask/__pycache__/wrappers.cpython-39.pyc,, +flask/app.py,sha256=ectBbi9hGmVHAse5TNcFQZIDRkDAxYUAnLgfuKD0Xws,81975 +flask/blueprints.py,sha256=AkAVXZ_MMkjwjklzCAMdBNowTiM0wVQPynnUnXjTL2M,23781 +flask/cli.py,sha256=wn2Un9RO32ZfRmCMem5KJ5h62-5lnmy1H9uxgyV-eBs,32238 +flask/config.py,sha256=70Uyjh1Jzb9MfTCT7NDhuZWAzyIEu-TIyk6-22MP3zQ,11285 +flask/ctx.py,sha256=EM3W0v1ctuFQAGk_HWtQdoJEg_r2f5Le4xcmElxFwwk,17428 +flask/debughelpers.py,sha256=W82-xrRmodjopBngI9roYH-q08EbQwN2HEGfDAi6SA0,6184 +flask/globals.py,sha256=cWd-R2hUH3VqPhnmQNww892tQS6Yjqg_wg8UvW1M7NM,1723 +flask/helpers.py,sha256=00WqA3wYeyjMrnAOPZTUyrnUf7H8ik3CVT0kqGl_qjk,30589 +flask/json/__init__.py,sha256=unAKdZBlxMI5OMiTU0-Z2Hl4CF1CMJmqTUzpStiExNw,11822 +flask/json/__pycache__/__init__.cpython-39.pyc,, +flask/json/__pycache__/tag.cpython-39.pyc,, +flask/json/tag.py,sha256=fys3HBLssWHuMAIJuTcf2K0bCtosePBKXIWASZEEjnU,8857 +flask/logging.py,sha256=1o_hirVGqdj7SBdETnhX7IAjklG89RXlrwz_2CjzQQE,2273 +flask/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +flask/scaffold.py,sha256=fM9mRy7QBh9fhJ0VTogVx900dDa5oxz8FOw6OK5F-TU,32796 +flask/sessions.py,sha256=Kb7zY4qBIOU2cw1xM5mQ_KmgYUBDFbUYWjlkq0EFYis,15189 +flask/signals.py,sha256=H7QwDciK-dtBxinjKpexpglP0E6k0MJILiFWTItfmqU,2136 +flask/templating.py,sha256=l96VD39JQ0nue4Bcj7wZ4-FWWs-ppLxvgBCpwDQ4KAk,5626 +flask/testing.py,sha256=OsHT-2B70abWH3ulY9IbhLchXIeyj3L-cfcDa88wv5E,10281 +flask/typing.py,sha256=hXEVcXoH-QEabmy1F11pYaQ2SonlkMAwfjBAnqj2x18,1982 +flask/views.py,sha256=nhq31TRB5Z-z2mjFGZACaaB2Et5XPCmWhWxJxOvLWww,5948 +flask/wrappers.py,sha256=VndbHPRBSUUOejmd2Y3ydkoCVUtsS2OJIdJEVIkBVD8,5604 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/REQUESTED b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/WHEEL new file mode 100644 index 00000000..5bad85fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/entry_points.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/entry_points.txt new file mode 100644 index 00000000..1eb02520 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +flask = flask.cli:main + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..7e106024 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Flask-2.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +flask diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/LICENSE.rst b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..c37cae49 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/METADATA new file mode 100644 index 00000000..274e91c0 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/METADATA @@ -0,0 +1,113 @@ +Metadata-Version: 2.1 +Name: Jinja2 +Version: 3.0.2 +Summary: A very fast and expressive template engine. +Home-page: https://palletsprojects.com/p/jinja/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://jinja.palletsprojects.com/ +Project-URL: Changes, https://jinja.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/jinja/ +Project-URL: Issue Tracker, https://github.com/pallets/jinja/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: MarkupSafe (>=2.0) +Provides-Extra: i18n +Requires-Dist: Babel (>=2.7) ; extra == 'i18n' + +Jinja +===== + +Jinja is a fast, expressive, extensible templating engine. Special +placeholders in the template allow writing code similar to Python +syntax. Then the template is passed data to render the final document. + +It includes: + +- Template inheritance and inclusion. +- Define and import macros within templates. +- HTML templates can use autoescaping to prevent XSS from untrusted + user input. +- A sandboxed environment can safely render untrusted templates. +- AsyncIO support for generating templates and calling async + functions. +- I18N support with Babel. +- Templates are compiled to optimized Python code just-in-time and + cached, or can be compiled ahead-of-time. +- Exceptions point to the correct line in templates to make debugging + easier. +- Extensible filters, tests, functions, and even syntax. + +Jinja's philosophy is that while application logic belongs in Python if +possible, it shouldn't make the template designer's job difficult by +restricting functionality too much. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U Jinja2 + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +In A Nutshell +------------- + +.. code-block:: jinja + + {% extends "base.html" %} + {% block title %}Members{% endblock %} + {% block content %} + + {% endblock %} + + +Donate +------ + +The Pallets organization develops and supports Jinja and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://jinja.palletsprojects.com/ +- Changes: https://jinja.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Jinja2/ +- Source Code: https://github.com/pallets/jinja/ +- Issue Tracker: https://github.com/pallets/jinja/issues/ +- Website: https://palletsprojects.com/p/jinja/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/RECORD new file mode 100644 index 00000000..ea72b5de --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/RECORD @@ -0,0 +1,58 @@ +Jinja2-3.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Jinja2-3.0.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Jinja2-3.0.2.dist-info/METADATA,sha256=NxKriGP-LwQjFBZ4hjV696NkZMe3GPy3tE00McDQZZ0,3539 +Jinja2-3.0.2.dist-info/RECORD,, +Jinja2-3.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +Jinja2-3.0.2.dist-info/entry_points.txt,sha256=Qy_DkVo6Xj_zzOtmErrATe8lHZhOqdjpt3e4JJAGyi8,61 +Jinja2-3.0.2.dist-info/top_level.txt,sha256=PkeVWtLb3-CqjWi1fO29OCbj55EhX_chhKrCdrVe_zs,7 +jinja2/__init__.py,sha256=w4sanG5_dogKC4J_2thsPN9tXzmily3fmXK8Pd46Q1Y,2205 +jinja2/__pycache__/__init__.cpython-39.pyc,, +jinja2/__pycache__/_identifier.cpython-39.pyc,, +jinja2/__pycache__/async_utils.cpython-39.pyc,, +jinja2/__pycache__/bccache.cpython-39.pyc,, +jinja2/__pycache__/compiler.cpython-39.pyc,, +jinja2/__pycache__/constants.cpython-39.pyc,, +jinja2/__pycache__/debug.cpython-39.pyc,, +jinja2/__pycache__/defaults.cpython-39.pyc,, +jinja2/__pycache__/environment.cpython-39.pyc,, +jinja2/__pycache__/exceptions.cpython-39.pyc,, +jinja2/__pycache__/ext.cpython-39.pyc,, +jinja2/__pycache__/filters.cpython-39.pyc,, +jinja2/__pycache__/idtracking.cpython-39.pyc,, +jinja2/__pycache__/lexer.cpython-39.pyc,, +jinja2/__pycache__/loaders.cpython-39.pyc,, +jinja2/__pycache__/meta.cpython-39.pyc,, +jinja2/__pycache__/nativetypes.cpython-39.pyc,, +jinja2/__pycache__/nodes.cpython-39.pyc,, +jinja2/__pycache__/optimizer.cpython-39.pyc,, +jinja2/__pycache__/parser.cpython-39.pyc,, +jinja2/__pycache__/runtime.cpython-39.pyc,, +jinja2/__pycache__/sandbox.cpython-39.pyc,, +jinja2/__pycache__/tests.cpython-39.pyc,, +jinja2/__pycache__/utils.cpython-39.pyc,, +jinja2/__pycache__/visitor.cpython-39.pyc,, +jinja2/_identifier.py,sha256=EdgGJKi7O1yvr4yFlvqPNEqV6M1qHyQr8Gt8GmVTKVM,1775 +jinja2/async_utils.py,sha256=bY2nCUfBA_4FSnNUsIsJgljBq3hACr6fzLi7LiyMTn8,1751 +jinja2/bccache.py,sha256=v5rKAlYxIvfJEa0uGzAC6yCYSS3KuXT5Eqi-n9qvNi8,12670 +jinja2/compiler.py,sha256=v7zKz-mgSYXmfXD9mRmi2BU0B6Z-1RGZmOXCrsPKzc0,72209 +jinja2/constants.py,sha256=GMoFydBF_kdpaRKPoM5cl5MviquVRLVyZtfp5-16jg0,1433 +jinja2/debug.py,sha256=uBmrsiwjYH5l14R9STn5mydOOyriBYol5lDGvEqAb3A,9238 +jinja2/defaults.py,sha256=boBcSw78h-lp20YbaXSJsqkAI2uN_mD_TtCydpeq5wU,1267 +jinja2/environment.py,sha256=T6U4be9mY1CUXXin_EQFwpvpFqCiryweGqzXGRYIoSA,61573 +jinja2/exceptions.py,sha256=ioHeHrWwCWNaXX1inHmHVblvc4haO7AXsjCp3GfWvx0,5071 +jinja2/ext.py,sha256=44SjDjeYkkxQTpmC2BetOTxEFMgQ42p2dfSwXmPFcSo,32122 +jinja2/filters.py,sha256=jusKTZbd0ddZMaibZkxMUVKNsOsaYtOq_Il8Imtx4BE,52609 +jinja2/idtracking.py,sha256=WekexMql3u5n3vDxFsQ_i8HW0j24AtjWTjrPBLWrHww,10721 +jinja2/lexer.py,sha256=qNEQqDQw_zO5EaH6rFQsER7Qwn2du0o22prB-TR11HE,29930 +jinja2/loaders.py,sha256=WGJNP5RQEGtuTABIK2tp1sWEy2kfe5ZFOY0ON0gi0LY,22477 +jinja2/meta.py,sha256=GNPEvifmSaU3CMxlbheBOZjeZ277HThOPUTf1RkppKQ,4396 +jinja2/nativetypes.py,sha256=62hvvsAxAj0YaxylOHoREYVogJ5JqOlJISgGY3OKd_o,3675 +jinja2/nodes.py,sha256=8zvzM5mYaylI-kbT6oI1DChxGH8dZkghWt1fVizy4Us,34605 +jinja2/optimizer.py,sha256=tHkMwXxfZkbfA1KmLcqmBMSaz7RLIvvItrJcPoXTyD8,1650 +jinja2/parser.py,sha256=kHnU8v92GwMYkfr0MVakWv8UlSf_kJPx8LUsgQMof70,39767 +jinja2/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +jinja2/runtime.py,sha256=wVRlkEmAgNU67AIQDqLvI6UkNLkzDqpLA-z4Mi3vl3g,35054 +jinja2/sandbox.py,sha256=-8zxR6TO9kUkciAVFsIKu8Oq-C7PTeYEdZ5TtA55-gw,14600 +jinja2/tests.py,sha256=Am5Z6Lmfr2XaH_npIfJJ8MdXtWsbLjMULZJulTAj30E,5905 +jinja2/utils.py,sha256=udQxWIKaq4QDCZiXN31ngKOaGGdaMA5fl0JMaM-F6fg,26971 +jinja2/visitor.py,sha256=ZmeLuTj66ic35-uFH-1m0EKXiw4ObDDb_WuE6h5vPFg,3572 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/WHEEL new file mode 100644 index 00000000..5bad85fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/entry_points.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/entry_points.txt new file mode 100644 index 00000000..3619483f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[babel.extractors] +jinja2 = jinja2.ext:babel_extract [i18n] + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..7f7afbf3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Jinja2-3.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +jinja2 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst new file mode 100644 index 00000000..9d227a0c --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2010 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/METADATA new file mode 100644 index 00000000..ef44e2b3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/METADATA @@ -0,0 +1,100 @@ +Metadata-Version: 2.1 +Name: MarkupSafe +Version: 2.0.1 +Summary: Safely add untrusted strings to HTML/XML markup. +Home-page: https://palletsprojects.com/p/markupsafe/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://markupsafe.palletsprojects.com/ +Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/markupsafe/ +Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Text Processing :: Markup :: HTML +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst + +MarkupSafe +========== + +MarkupSafe implements a text object that escapes characters so it is +safe to use in HTML and XML. Characters that have special meanings are +replaced so that they display as the actual characters. This mitigates +injection attacks, meaning untrusted user input can safely be displayed +on a page. + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U MarkupSafe + +.. _pip: https://pip.pypa.io/en/stable/quickstart/ + + +Examples +-------- + +.. code-block:: pycon + + >>> from markupsafe import Markup, escape + + >>> # escape replaces special characters and wraps in Markup + >>> escape("") + Markup('<script>alert(document.cookie);</script>') + + >>> # wrap in Markup to mark text "safe" and prevent escaping + >>> Markup("Hello") + Markup('hello') + + >>> escape(Markup("Hello")) + Markup('hello') + + >>> # Markup is a str subclass + >>> # methods and operators escape their arguments + >>> template = Markup("Hello {name}") + >>> template.format(name='"World"') + Markup('Hello "World"') + + +Donate +------ + +The Pallets organization develops and supports MarkupSafe and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://markupsafe.palletsprojects.com/ +- Changes: https://markupsafe.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/MarkupSafe/ +- Source Code: https://github.com/pallets/markupsafe/ +- Issue Tracker: https://github.com/pallets/markupsafe/issues/ +- Website: https://palletsprojects.com/p/markupsafe/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/RECORD new file mode 100644 index 00000000..c5acda27 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/RECORD @@ -0,0 +1,13 @@ +MarkupSafe-2.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +MarkupSafe-2.0.1.dist-info/LICENSE.rst,sha256=RjHsDbX9kKVH4zaBcmTGeYIUM4FG-KyUtKV_lu6MnsQ,1503 +MarkupSafe-2.0.1.dist-info/METADATA,sha256=FmPpxBdaqCCjF-XKqoxeEzqAzhetQnrkkSsd3V3X-Jc,3211 +MarkupSafe-2.0.1.dist-info/RECORD,, +MarkupSafe-2.0.1.dist-info/WHEEL,sha256=jr7ubY0Lkz_yXH9FfFe9PTtLhGOsf62dZkNvTYrJINE,100 +MarkupSafe-2.0.1.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 +markupsafe/__init__.py,sha256=s08KbuFRV3zh4Wh7xjsIphXgp1xf0EUB79wlPj-4scc,9211 +markupsafe/__pycache__/__init__.cpython-39.pyc,, +markupsafe/__pycache__/_native.cpython-39.pyc,, +markupsafe/_native.py,sha256=JMXegJtk1ZcnRKrgyCA-CEXmRnOpaIXLyDAM98GbshY,2061 +markupsafe/_speedups.cp39-win_amd64.pyd,sha256=hPTsANj9bt7hLYxWLuZcC7E3-EnJQ4GlvIf9Vx0p1p0,16384 +markupsafe/_speedups.pyi,sha256=f5QtwIOP0eLrxh2v5p6SmaYmlcHIGIfmz0DovaqL0OU,238 +markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL new file mode 100644 index 00000000..d1267fcc --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.36.2) +Root-Is-Purelib: false +Tag: cp39-cp39-win_amd64 + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt new file mode 100644 index 00000000..75bf7292 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/MarkupSafe-2.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +markupsafe diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/LICENSE.rst b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/LICENSE.rst new file mode 100644 index 00000000..c37cae49 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2007 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/METADATA new file mode 100644 index 00000000..b58b9bd5 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/METADATA @@ -0,0 +1,129 @@ +Metadata-Version: 2.1 +Name: Werkzeug +Version: 2.0.2 +Summary: The comprehensive WSGI web application library. +Home-page: https://palletsprojects.com/p/werkzeug/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://werkzeug.palletsprojects.com/ +Project-URL: Changes, https://werkzeug.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/werkzeug/ +Project-URL: Issue Tracker, https://github.com/pallets/werkzeug/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application +Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware +Classifier: Topic :: Software Development :: Libraries :: Application Frameworks +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: dataclasses ; python_version < "3.7" +Provides-Extra: watchdog +Requires-Dist: watchdog ; extra == 'watchdog' + +Werkzeug +======== + +*werkzeug* German noun: "tool". Etymology: *werk* ("work"), *zeug* ("stuff") + +Werkzeug is a comprehensive `WSGI`_ web application library. It began as +a simple collection of various utilities for WSGI applications and has +become one of the most advanced WSGI utility libraries. + +It includes: + +- An interactive debugger that allows inspecting stack traces and + source code in the browser with an interactive interpreter for any + frame in the stack. +- A full-featured request object with objects to interact with + headers, query args, form data, files, and cookies. +- A response object that can wrap other WSGI applications and handle + streaming data. +- A routing system for matching URLs to endpoints and generating URLs + for endpoints, with an extensible system for capturing variables + from URLs. +- HTTP utilities to handle entity tags, cache control, dates, user + agents, cookies, files, and more. +- A threaded WSGI server for use while developing applications + locally. +- A test client for simulating HTTP requests during testing without + requiring running a server. + +Werkzeug doesn't enforce any dependencies. It is up to the developer to +choose a template engine, database adapter, and even how to handle +requests. It can be used to build all sorts of end user applications +such as blogs, wikis, or bulletin boards. + +`Flask`_ wraps Werkzeug, using it to handle the details of WSGI while +providing more structure and patterns for defining powerful +applications. + +.. _WSGI: https://wsgi.readthedocs.io/en/latest/ +.. _Flask: https://www.palletsprojects.com/p/flask/ + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + pip install -U Werkzeug + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + from werkzeug.wrappers import Request, Response + + @Request.application + def application(request): + return Response('Hello, World!') + + if __name__ == '__main__': + from werkzeug.serving import run_simple + run_simple('localhost', 4000, application) + + +Donate +------ + +The Pallets organization develops and supports Werkzeug and other +popular packages. In order to grow the community of contributors and +users, and allow the maintainers to devote more time to the projects, +`please donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://werkzeug.palletsprojects.com/ +- Changes: https://werkzeug.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/Werkzeug/ +- Source Code: https://github.com/pallets/werkzeug/ +- Issue Tracker: https://github.com/pallets/werkzeug/issues/ +- Website: https://palletsprojects.com/p/werkzeug/ +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/RECORD new file mode 100644 index 00000000..5b221529 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/RECORD @@ -0,0 +1,111 @@ +Werkzeug-2.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Werkzeug-2.0.2.dist-info/LICENSE.rst,sha256=O0nc7kEF6ze6wQ-vG-JgQI_oXSUrjp3y4JefweCUQ3s,1475 +Werkzeug-2.0.2.dist-info/METADATA,sha256=vh_xrARtpmkFYnWRAgfSiHgl66LH143rMfAfPZo-R_E,4452 +Werkzeug-2.0.2.dist-info/RECORD,, +Werkzeug-2.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +Werkzeug-2.0.2.dist-info/top_level.txt,sha256=QRyj2VjwJoQkrwjwFIOlB8Xg3r9un0NtqVHQF-15xaw,9 +werkzeug/__init__.py,sha256=Wx1PLCftJ7UAS0fBXEO4Prdr6kvEQ124Stwg-XwyhW4,188 +werkzeug/__pycache__/__init__.cpython-39.pyc,, +werkzeug/__pycache__/_internal.cpython-39.pyc,, +werkzeug/__pycache__/_reloader.cpython-39.pyc,, +werkzeug/__pycache__/datastructures.cpython-39.pyc,, +werkzeug/__pycache__/exceptions.cpython-39.pyc,, +werkzeug/__pycache__/filesystem.cpython-39.pyc,, +werkzeug/__pycache__/formparser.cpython-39.pyc,, +werkzeug/__pycache__/http.cpython-39.pyc,, +werkzeug/__pycache__/local.cpython-39.pyc,, +werkzeug/__pycache__/routing.cpython-39.pyc,, +werkzeug/__pycache__/security.cpython-39.pyc,, +werkzeug/__pycache__/serving.cpython-39.pyc,, +werkzeug/__pycache__/test.cpython-39.pyc,, +werkzeug/__pycache__/testapp.cpython-39.pyc,, +werkzeug/__pycache__/urls.cpython-39.pyc,, +werkzeug/__pycache__/user_agent.cpython-39.pyc,, +werkzeug/__pycache__/useragents.cpython-39.pyc,, +werkzeug/__pycache__/utils.cpython-39.pyc,, +werkzeug/__pycache__/wsgi.cpython-39.pyc,, +werkzeug/_internal.py,sha256=_QKkvdaG4pDFwK68c0EpPzYJGe9Y7toRAT1cBbC-CxU,18572 +werkzeug/_reloader.py,sha256=B1hEfgsUOz2IginBQM5Zak_eaIF7gr3GS5-0x2OHvAE,13950 +werkzeug/datastructures.py,sha256=m79A8rHQEt5B7qVqyrjARXzHL66Katn8S92urGscTw4,97929 +werkzeug/datastructures.pyi,sha256=CoVwrQ2Vr9JnbprNL9aE3vOz8mOejT9qysQ-BT53C8Y,34089 +werkzeug/debug/__init__.py,sha256=jYA1e1Gw_8EPOytr-BoMdmm0rzP-Z1H0Ih7wIObnKwQ,17968 +werkzeug/debug/__pycache__/__init__.cpython-39.pyc,, +werkzeug/debug/__pycache__/console.cpython-39.pyc,, +werkzeug/debug/__pycache__/repr.cpython-39.pyc,, +werkzeug/debug/__pycache__/tbtools.cpython-39.pyc,, +werkzeug/debug/console.py,sha256=E1nBMEvFkX673ShQjPtVY-byYatfX9MN-dBMjRI8a8E,5897 +werkzeug/debug/repr.py,sha256=QCSHENKsChEZDCIApkVi_UNjhJ77v8BMXK1OfxO189M,9483 +werkzeug/debug/shared/FONT_LICENSE,sha256=LwAVEI1oYnvXiNMT9SnCH_TaLCxCpeHziDrMg0gPkAI,4673 +werkzeug/debug/shared/ICON_LICENSE.md,sha256=DhA6Y1gUl5Jwfg0NFN9Rj4VWITt8tUx0IvdGf0ux9-s,222 +werkzeug/debug/shared/console.png,sha256=bxax6RXXlvOij_KeqvSNX0ojJf83YbnZ7my-3Gx9w2A,507 +werkzeug/debug/shared/debugger.js,sha256=tg42SZs1SVmYWZ-_Fj5ELK5-FLHnGNQrei0K2By8Bw8,10521 +werkzeug/debug/shared/less.png,sha256=-4-kNRaXJSONVLahrQKUxMwXGm9R4OnZ9SxDGpHlIR4,191 +werkzeug/debug/shared/more.png,sha256=GngN7CioHQoV58rH6ojnkYi8c_qED2Aka5FO5UXrReY,200 +werkzeug/debug/shared/source.png,sha256=RoGcBTE4CyCB85GBuDGTFlAnUqxwTBiIfDqW15EpnUQ,818 +werkzeug/debug/shared/style.css,sha256=h1ZSUVaKNpfbfcYzRb513WAhPySGDQom1uih3uEDxPw,6704 +werkzeug/debug/shared/ubuntu.ttf,sha256=1eaHFyepmy4FyDvjLVzpITrGEBu_CZYY94jE0nED1c0,70220 +werkzeug/debug/tbtools.py,sha256=AFRrjLDCAps7G5K2-RxNZpXXaEoeFHm68T00f4vlDYA,19362 +werkzeug/exceptions.py,sha256=CUwx0pBiNbk4f9cON17ekgKnmLi6HIVFjUmYZc2x0wM,28681 +werkzeug/filesystem.py,sha256=JS2Dv2QF98WILxY4_thHl-WMcUcwluF_4igkDPaP1l4,1956 +werkzeug/formparser.py,sha256=X-p3Ek4ji8XrKrbmaWxr8StLSc6iuksbpIeweaabs4s,17400 +werkzeug/http.py,sha256=oUCXFFMnkOQ-cHbUY_aiqitshcrSzNDq3fEMf1VI_yk,45141 +werkzeug/local.py,sha256=bwL-y3-qOZAspJ66W1P36SUApLXJy3UY8nLYbM9kfmY,23183 +werkzeug/middleware/__init__.py,sha256=qfqgdT5npwG9ses3-FXQJf3aB95JYP1zchetH_T3PUw,500 +werkzeug/middleware/__pycache__/__init__.cpython-39.pyc,, +werkzeug/middleware/__pycache__/dispatcher.cpython-39.pyc,, +werkzeug/middleware/__pycache__/http_proxy.cpython-39.pyc,, +werkzeug/middleware/__pycache__/lint.cpython-39.pyc,, +werkzeug/middleware/__pycache__/profiler.cpython-39.pyc,, +werkzeug/middleware/__pycache__/proxy_fix.cpython-39.pyc,, +werkzeug/middleware/__pycache__/shared_data.cpython-39.pyc,, +werkzeug/middleware/dispatcher.py,sha256=Fh_w-KyWnTSYF-Lfv5dimQ7THSS7afPAZMmvc4zF1gg,2580 +werkzeug/middleware/http_proxy.py,sha256=HE8VyhS7CR-E1O6_9b68huv8FLgGGR1DLYqkS3Xcp3Q,7558 +werkzeug/middleware/lint.py,sha256=sAg3GcOhICIkwYX5bJGG8n8iebX0Yipq_UH0HvrBvoU,13964 +werkzeug/middleware/profiler.py,sha256=QkXk7cqnaPnF8wQu-5SyPCIOT3_kdABUBorQOghVNOA,4899 +werkzeug/middleware/proxy_fix.py,sha256=uRgQ3dEvFV8JxUqajHYYYOPEeA_BFqaa51Yp8VW0uzA,6849 +werkzeug/middleware/shared_data.py,sha256=xydEqOhAGg0aQJEllPDVfz2-8jHwWvJpAxfPsfPCu7k,10960 +werkzeug/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/routing.py,sha256=oqJ32sWIZtIF6zbqfrnwB1Pbv2ShNwPDJd6FYqxdYVo,84527 +werkzeug/sansio/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +werkzeug/sansio/__pycache__/__init__.cpython-39.pyc,, +werkzeug/sansio/__pycache__/multipart.cpython-39.pyc,, +werkzeug/sansio/__pycache__/request.cpython-39.pyc,, +werkzeug/sansio/__pycache__/response.cpython-39.pyc,, +werkzeug/sansio/__pycache__/utils.cpython-39.pyc,, +werkzeug/sansio/multipart.py,sha256=bJMCNC2f5xyAaylahNViJ0JqmV4ThLRbDVGVzKwcqrQ,8751 +werkzeug/sansio/request.py,sha256=aA9rABkWiG4MhYMByanst2NXkEclsq8SIxhb0LQf0e0,20228 +werkzeug/sansio/response.py,sha256=zvCq9HSBBZGBd5Gg412BY9RZIwnKsJl5Kzfd3Kl9sSo,26098 +werkzeug/sansio/utils.py,sha256=V5v-UUnX8pm4RehP9Tt_NiUSOJGJGUvKjlW0eOIQldM,4164 +werkzeug/security.py,sha256=gPDRuCjkjWrcqj99tBMq8_nHFZLFQjgoW5Ga5XIw9jo,8158 +werkzeug/serving.py,sha256=AfgLn0yKr9qXknmwO-0KXJ055oloS4h5DIFDHEu8iHA,38088 +werkzeug/test.py,sha256=8gE1l-Y9yAh2i3SI0kgpxIaI4oYZuehIkxxyDFcz6J0,48123 +werkzeug/testapp.py,sha256=f48prWSGJhbSrvYb8e1fnAah4BkrLb0enHSdChgsjBY,9471 +werkzeug/urls.py,sha256=Du2lreBHvgBh5c2_bcx72g3hzV2ZabXYZsp-picUIJs,41023 +werkzeug/user_agent.py,sha256=WclZhpvgLurMF45hsioSbS75H1Zb4iMQGKN3_yZ2oKo,1420 +werkzeug/useragents.py,sha256=G8tmv_6vxJaPrLQH3eODNgIYe0_V6KETROQlJI-WxDE,7264 +werkzeug/utils.py,sha256=D_dnCLUfodQ4k0GRSpnI6qDoVoaX7-Dza57bx7sabG0,37101 +werkzeug/wrappers/__init__.py,sha256=-s75nPbyXHzU_rwmLPDhoMuGbEUk0jZT_n0ZQAOFGf8,654 +werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/accept.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/auth.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/base_request.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/base_response.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/common_descriptors.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/cors.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/etag.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/json.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/request.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/response.cpython-39.pyc,, +werkzeug/wrappers/__pycache__/user_agent.cpython-39.pyc,, +werkzeug/wrappers/accept.py,sha256=_oZtAQkahvsrPRkNj2fieg7_St9P0NFC3SgZbJKS6xU,429 +werkzeug/wrappers/auth.py,sha256=rZPCzGxHk9R55PRkmS90kRywUVjjuMWzCGtH68qCq8U,856 +werkzeug/wrappers/base_request.py,sha256=saz9RyNQkvI_XLPYVm29KijNHmD1YzgxDqa0qHTbgss,1174 +werkzeug/wrappers/base_response.py,sha256=q_-TaYywT5G4zA-DWDRDJhJSat2_4O7gOPob6ye4_9A,1186 +werkzeug/wrappers/common_descriptors.py,sha256=v_kWLH3mvCiSRVJ1FNw7nO3w2UJfzY57UKKB5J4zCvE,898 +werkzeug/wrappers/cors.py,sha256=c5UndlZsZvYkbPrp6Gj5iSXxw_VOJDJHskO6-jRmNyQ,846 +werkzeug/wrappers/etag.py,sha256=XHWQQs7Mdd1oWezgBIsl-bYe8ydKkRZVil2Qd01D0Mo,846 +werkzeug/wrappers/json.py,sha256=HM1btPseGeXca0vnwQN_MvZl6h-qNsFY5YBKXKXFwus,410 +werkzeug/wrappers/request.py,sha256=yZGplfC3UqNuykwLJmgywiMhmnoKEGHJOZn_A_ublcQ,24822 +werkzeug/wrappers/response.py,sha256=0n8OcQptiM2e550SALLeg7vC1uWsUbCeE1rPZFfXR78,35177 +werkzeug/wrappers/user_agent.py,sha256=Wl1-A0-1r8o7cHIZQTB55O4Ged6LpCKENaQDlOY5pXA,435 +werkzeug/wsgi.py,sha256=L7s5-Rlt7BRVEZ1m81MaenGfMDP7yL3p1Kxt9Yssqzg,33727 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/WHEEL new file mode 100644 index 00000000..5bad85fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/top_level.txt new file mode 100644 index 00000000..6fe8da84 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/Werkzeug-2.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +werkzeug diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__init__.py new file mode 100644 index 00000000..47ce2494 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,128 @@ +import sys +import os +import re +import importlib +import warnings + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +warnings.filterwarnings('ignore', + '.+ distutils .+ deprecated', + DeprecationWarning) + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils.") + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + warnings.warn("Setuptools is replacing distutils.") + mods = [name for name in sys.modules if re.match(r'distutils\b', name)] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') + return which == 'local' + + +def ensure_local_distutils(): + clear_distutils() + distutils = importlib.import_module('setuptools._distutils') + distutils.__name__ = 'distutils' + sys.modules['distutils'] = distutils + + # sanity check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + if path is not None: + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + import importlib.abc + import importlib.util + + class DistutilsLoader(importlib.abc.Loader): + + def create_module(self, spec): + return importlib.import_module('setuptools._distutils') + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader('distutils', DistutilsLoader()) + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @staticmethod + def pip_imported_during_build(): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + return any( + frame.f_globals['__file__'].endswith('setup.py') + for frame, line in traceback.walk_stack(None) + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3821049cc24f00affd77bb76afc7069c74e36baa GIT binary patch literal 5103 zcmbtYO>^7E8Qujz3Zg!&$RCqrn&~!9(r{{1wv#k*MpZr}Cw1%4Ze+((jyy2PU5b!F zfL?%7#7dXSGfgg?_8(X?z2w?!{|T-=<=k5iNuPH?f~4fQlPNg6z%CZM&%W>Tek}ck zg$l#<^}hywdy%n!Q)BWfq46O~@;6kHNglFBe&-Et+E&9dce`PmyVG!_rPxksmo>`D zc{(F)=_vQu=1i7k`3Y;x${Fe6UXio1g8Q7Dlk>RG%LTcJ`@*M8o{>vWm|Qxt8jEW2 zh&9g07vwVDEy=U;9PTejzR9ZRzXd8*Z@8Y<+wbjrURDmaqgboK%e7w#86;^x4Z=iF zL-n+3`KgjE`eyR7(O5@GYN#Yn*$&_3dQq}XmRee%ZA@vuK+CX>n8-OSQt+bW*Y8a5-Lji*h|{+ zQ;`%K!sh^$q<$D;zko-;Q|-$j4dTcT#U7x&scPFb5yh$SBcbrhfE#{R#nO>n0l=>R zNQoa?#1ApkY0(x)Yt?dQLp0gUP&V02kQlOL^SeqXK;s2bJI>raUq{$vk~#GB4b$_` zqN%=nu<`!Z-Hmwt@~2^c8}hrO;~i{Y#F6Oki}kqM>!(U@_4apFwEI@=`qr(Wxs?Q| zy4>?ykNjx~Ay{uZ{^y z`pii<#e-T4Brh()QAXKBNq&ZE8!J3GNAo|0uQ=exmUa&K->t_EEQb%~3Yly*t5#-d zm6f`F+UiiFb|rHnzpKV-&FGICRjc8E8Hrw|oxIPNQcn`)Cf>Yq5h}#pE*4&4Q?FKrIy5NM^^>sjI zQZrvRUfjHK_uiemw{PFt^zLom@HTF4-o1DC=B>@FoTM@gnpw$6qH1SW3?mp$mD$@W zt@5n2*9lskliS89T0&L{KW&6Li(HdJr?xpoyN~fUWk-y&)NJ(_^pe&A^XvnbIy)t4 zt>$mwIuE%74R*@AELr;mURA-DL zvf13r($*L9M=!Vh3_*ej<#}TsP+vO;(O0$13YkOmo)pN1+{t-Hl;b6@V$VZ5lwqPM zc7PzhFGTPaK!X-%8j%vs!cGn2LCily)ofY$!(fdMJw*@Pcs812~W|6|Avc= z;mky?@><1Av#FHmq-igCe`RGmNIU%|WY%3lob*@5B3{Y;{L0%`-@RxaF@}hC`K{~M zu3dlc?JHN!WQbRYHSqJ@I1P4vqG`^+det_}FkZ>*eL{G~oQ&1Z$=D-^I*@7=vPj4j z*-RNi)34*{l)!9seu$D>L!}ty8pty$(vtQQj!eUmC1e4PEXx_(OR6kgIr{`&tubSS zIhUQ?7zN+YRO){cApYrk%g`B9(nT03zgb5~-bQtROs3EEJW)~d9oA+6NPEQo!T-t+ zofLFFKyCvB?8rVW9h8pp3}A3J>8X|n8F_zd_rs7_c6e$>L;>R&2?DL~4X>Y+)mUKe zYUp>H(qF4%v_6Mwu=0!z)!NvXN6SyTy!=bpd>NSFQL}RH4zn4Uy`QEULD7M~X=m;T zZ|3y;w3C%nUt>%**HvjJmd0SRa^9E#YjiqWtbG&k5|c;5A3D}D{Nmu1=b}9oH%KU? z^W;5L@RTfMU*~uJHT#tPg|*>5A$eEYU$Gr)$A$(to+ulGGdW_%&d9F1J+M&JuAt&qSD{n>rIOw2lb@L93`nCrEl zfVVa^^C|SFsH=ZDLNGC**pj0F!I)9$uTc=UVf&exC*tfnYSlh=Sl!^P8<~v4}M_ zI%i}yb(ZrLF%(!nt+985#wd9Cw95WKSX@*LrsY~Mx`Q_gw9nP` zl!cK3i7M+T#s&^R!DGmPd}SVpa=(UvjXVX!bOt-d@l$>>3`lu&nMh6cIw}&nA5q$D z&KFwrf?ggM=sSu)CfuO+;(PD@`l_HXqD}PhM=1;qte-O2=P+)9VuicZZ(?KHD7mM+ z_FNGW#)lvNlvoN0XpUx}dbZsYpGe zebHIW$7vJ05=l!3y|gAiS8Z|e+FS3uGgh5(qxC5c*+4>GI-&9^D&+PrZ&`=@&_W7_ zi1rd?`EYArAfb5-fB5^U7DhvzD^b8JBDg{9Z%Uj zK%_xy7=dZk2_$3wzkwIOMKSTkg&F)tPzJ^`(Yvd8P+cQUCGg`kg3jGli8?^~F^GcK%!jPc1#iYd-4 oN!2X?T9cTbS{#FBwLZ)qy@JYH95%W6DWy57c8ow9KLarX0FpODoB#j- literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/override.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/override.py new file mode 100644 index 00000000..2cc433a4 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/_distutils_hack/override.py @@ -0,0 +1 @@ +__import__('_distutils_hack').do_override() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/AUTHORS b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/AUTHORS new file mode 100644 index 00000000..1f14fe07 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore and Isaac Muse have made significant contributions to the +code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppänen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skyttä, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/COPYING.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/COPYING.txt new file mode 100644 index 00000000..fb6ae69c --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/COPYING.txt @@ -0,0 +1,27 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) 2004-2017 Leonard Richardson + + 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. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) 2006-2013 +James Graham and other contributors diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/LICENSE b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/LICENSE new file mode 100644 index 00000000..4c068bab --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/LICENSE @@ -0,0 +1,30 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) 2004-2019 Leonard Richardson + + 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. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) 2006-2013 +James Graham and other contributors + +Beautiful Soup depends on the soupsieve library, which is also made +available under the MIT license. Copyright (c) 2018 Isaac Muse diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/METADATA new file mode 100644 index 00000000..7aa00565 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/METADATA @@ -0,0 +1,120 @@ +Metadata-Version: 2.1 +Name: beautifulsoup4 +Version: 4.10.0 +Summary: Screen-scraping library +Home-page: http://www.crummy.com/software/BeautifulSoup/bs4/ +Author: Leonard Richardson +Author-email: leonardr@segfault.org +License: MIT +Download-URL: http://www.crummy.com/software/BeautifulSoup/bs4/download/ +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: XML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >3.0.0 +Description-Content-Type: text/markdown +Requires-Dist: soupsieve (>1.2) +Provides-Extra: html5lib +Requires-Dist: html5lib ; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml ; extra == 'lxml' + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

SomebadHTML") +>>> print(soup.prettify()) + + +

+ Some + + bad + + HTML + + +

+ + +>>> soup.find(text="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](http://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](http://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](http://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](http://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://bazaar.launchpad.net/~leonardr/beautifulsoup/bs4/view/head:/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery from the project root directory: + +``` +$ nosetests +``` + +``` +$ python3 -m unittest discover -s bs4 +``` + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/RECORD new file mode 100644 index 00000000..e0d778d5 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/RECORD @@ -0,0 +1,29 @@ +beautifulsoup4-4.10.0.dist-info/AUTHORS,sha256=uSIdbrBb1sobdXl7VrlUvuvim2dN9kF3MH4Edn0WKGE,2176 +beautifulsoup4-4.10.0.dist-info/COPYING.txt,sha256=pH6lEjYJhGT-C09Vl0NZC1MwVtngD0nsv4Apn6tH4jE,1315 +beautifulsoup4-4.10.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +beautifulsoup4-4.10.0.dist-info/LICENSE,sha256=ynIn3bnu1syAnhV_Z7Ag543eBjJAAB0RhW-FxJy25CM,1447 +beautifulsoup4-4.10.0.dist-info/METADATA,sha256=xXGta_JNOdH5pvsMsrB1-MPPjMDhfi5q22-8r-iTMkg,3542 +beautifulsoup4-4.10.0.dist-info/RECORD,, +beautifulsoup4-4.10.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +beautifulsoup4-4.10.0.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92 +beautifulsoup4-4.10.0.dist-info/top_level.txt,sha256=H8VT-IuPWLzQqwG9_eChjXDJ1z0H9RRebdSR90Bjnkw,4 +bs4/__init__.py,sha256=kZ9EDFbdsNtqNkUL95_7epbnZCO7HKgW-s2ukdAXXY0,32673 +bs4/__pycache__/__init__.cpython-39.pyc,, +bs4/__pycache__/dammit.cpython-39.pyc,, +bs4/__pycache__/diagnose.cpython-39.pyc,, +bs4/__pycache__/element.cpython-39.pyc,, +bs4/__pycache__/formatter.cpython-39.pyc,, +bs4/__pycache__/testing.cpython-39.pyc,, +bs4/builder/__init__.py,sha256=FP2SbcvOUZWk8a84wc9-K90F2YA2--nQpxm-GK0G8Gc,19870 +bs4/builder/__pycache__/__init__.cpython-39.pyc,, +bs4/builder/__pycache__/_html5lib.cpython-39.pyc,, +bs4/builder/__pycache__/_htmlparser.cpython-39.pyc,, +bs4/builder/__pycache__/_lxml.cpython-39.pyc,, +bs4/builder/_html5lib.py,sha256=hDxlzVrAku_eU7zEt4gZ-sAXzG58GvkLfMz6P4zUqoA,18748 +bs4/builder/_htmlparser.py,sha256=KjnSpA8C8-_yX4nFd_UwCB4SGO9pzqR05WjjbuZjzH4,18933 +bs4/builder/_lxml.py,sha256=h20vsAgSkeiIPiCKwJ-ggajeaxra7bicCtQSOoinUTc,12699 +bs4/dammit.py,sha256=lMWxYrl9VeLqEgXvk4MJK8isKPgNF_yQXk8B9R4UxXE,98709 +bs4/diagnose.py,sha256=WOzytCTkvqh_fGhqYlMyaYVjtH50w4jbdf1Fd0iundE,7755 +bs4/element.py,sha256=noCV6m4euxWVo3I1Bjh9SYDgG_VNu7oGoWLB0XlCldc,85238 +bs4/formatter.py,sha256=wAuETtbENr2HP-ZiR6WRu4_bLFY8ALRV_BPqWhhr7HA,6385 +bs4/testing.py,sha256=6leLHpE7mHFV7W8SqR3vRvsgEVR3eqxprJVIf8W_bgY,47412 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/REQUESTED b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/REQUESTED new file mode 100644 index 00000000..e69de29b diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/WHEEL new file mode 100644 index 00000000..b552003f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.34.2) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/top_level.txt new file mode 100644 index 00000000..13154420 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/beautifulsoup4-4.10.0.dist-info/top_level.txt @@ -0,0 +1 @@ +bs4 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__init__.py new file mode 100644 index 00000000..2a436d34 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__init__.py @@ -0,0 +1,804 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.5 and up. It works better if lxml +and/or html5lib is installed. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.10.0" +__copyright__ = "Copyright (c) 2004-2021 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = ['BeautifulSoup'] + + +from collections import Counter +import os +import re +import sys +import traceback +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError('You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3.') + +from .builder import builder_registry, ParserRejectedMarkup +from .dammit import UnicodeDammit +from .element import ( + CData, + Comment, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + SoupStrainer, + Tag, + TemplateString, + ) + +# Define some custom warnings. +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + +class MarkupResemblesLocatorWarning(UserWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's
tag), call handle_starttag and then + handle_endtag. + """ + + # Since BeautifulSoup subclasses Tag, it's possible to treat it as + # a Tag with a .name. This name makes it clear the BeautifulSoup + # object isn't a real markup tag. + ROOT_TAG_NAME = '[document]' + + # If the end-user gives no indication which tree builder they + # want, look for one with these features. + DEFAULT_BUILDER_FEATURES = ['html', 'fast'] + + # A string containing all ASCII whitespace characters, used in + # endData() to detect data chunks that seem 'empty'. + ASCII_SPACES = '\x20\x0a\x09\x0c\x0d' + + NO_PARSER_SPECIFIED_WARNING = "No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system (\"%(parser)s\"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.\n\nThe code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features=\"%(parser)s\"' to the BeautifulSoup constructor.\n" + + def __init__(self, markup="", features=None, builder=None, + parse_only=None, from_encoding=None, exclude_encodings=None, + element_classes=None, **kwargs): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if 'convertEntities' in kwargs: + del kwargs['convertEntities'] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters.") + + if 'markupMassage' in kwargs: + del kwargs['markupMassage'] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage.") + + if 'smartQuotesTo' in kwargs: + del kwargs['smartQuotesTo'] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters.") + + if 'selfClosingTags' in kwargs: + del kwargs['selfClosingTags'] + warnings.warn( + "BS4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags.") + + if 'isHTML' in kwargs: + del kwargs['isHTML'] + warnings.warn( + "BS4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML.") + + def deprecated_argument(old_name, new_name): + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'has been renamed to "%s."' % (old_name, new_name)) + value = kwargs[old_name] + del kwargs[old_name] + return value + return None + + parse_only = parse_only or deprecated_argument( + "parseOnlyThese", "parse_only") + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding") + + if from_encoding and isinstance(markup, str): + warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.") + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + builder_class = builder_registry.lookup(*features) + if builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features)) + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + builder = builder_class(**kwargs) + if not original_builder and not ( + original_features == builder.NAME or + original_features in builder.ALTERNATE_NAMES + ) and markup: + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number= 1 + filename = globals.get('__file__') + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type + ) + warnings.warn( + self.NO_PARSER_SPECIFIED_WARNING % values, + GuessedAtParserWarning, stacklevel=2 + ) + else: + if kwargs: + warnings.warn("Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`.") + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + self.builder.initialize_soup(self) + + if hasattr(markup, 'read'): # It's a file-type object. + markup = markup.read() + elif len(markup) <= 256 and ( + (isinstance(markup, bytes) and not b'<' in markup) + or (isinstance(markup, str) and not '<' in markup) + ): + # Print out warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # just in case that's what the user really wants. + if (isinstance(markup, str) + and not os.path.supports_unicode_filenames): + possible_filename = markup.encode("utf8") + else: + possible_filename = markup + is_file = False + is_directory = False + try: + is_file = os.path.exists(possible_filename) + if is_file: + is_directory = os.path.isdir(possible_filename) + except Exception as e: + # This is almost certainly a problem involving + # characters not valid in filenames on this + # system. Just let it go. + pass + if is_directory: + warnings.warn( + '"%s" looks like a directory name, not markup. You may' + ' want to open a file found in this directory and pass' + ' the filehandle into Beautiful Soup.' % ( + self._decode_markup(markup) + ), + MarkupResemblesLocatorWarning + ) + elif is_file: + warnings.warn( + '"%s" looks like a filename, not markup. You should' + ' probably open this file and pass the filehandle into' + ' Beautiful Soup.' % self._decode_markup(markup), + MarkupResemblesLocatorWarning + ) + self._check_markup_is_url(markup) + + rejections = [] + success = False + for (self.markup, self.original_encoding, self.declared_html_encoding, + self.contains_replacement_characters) in ( + self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings)): + self.reset() + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def __copy__(self): + """Copy a BeautifulSoup object by converting the document to a string and parsing it again.""" + copy = type(self)( + self.encode('utf-8'), builder=self.builder, from_encoding='utf-8' + ) + + # Although we encoded the tree to UTF-8, that may not have + # been the encoding of the original markup. Set the copy's + # .original_encoding to reflect the original object's + # .original_encoding. + copy.original_encoding = self.original_encoding + return copy + + def __getstate__(self): + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if 'builder' in d and not self.builder.picklable: + d['builder'] = None + return d + + @classmethod + def _decode_markup(cls, markup): + """Ensure `markup` is bytes so it's safe to send into warnings.warn. + + TODO: warnings.warn had this problem back in 2010 but it might not + anymore. + """ + if isinstance(markup, bytes): + decoded = markup.decode('utf-8', 'replace') + else: + decoded = markup + return decoded + + @classmethod + def _check_markup_is_url(cls, markup): + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string. + """ + if isinstance(markup, bytes): + space = b' ' + cant_start_with = (b"http:", b"https:") + elif isinstance(markup, str): + space = ' ' + cant_start_with = ("http:", "https:") + else: + return + + if any(markup.startswith(prefix) for prefix in cant_start_with): + if not space in markup: + warnings.warn( + '"%s" looks like a URL. Beautiful Soup is not an' + ' HTTP client. You should probably use an HTTP client like' + ' requests to get the document behind the URL, and feed' + ' that document to Beautiful Soup.' % cls._decode_markup( + markup + ), + MarkupResemblesLocatorWarning + ) + + def _feed(self): + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while self.currentTag.name != self.ROOT_TAG_NAME: + self.popTag() + + def reset(self): + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = 1 + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self.pushTag(self) + + def new_tag(self, name, namespace=None, nsprefix=None, attrs={}, + sourceline=None, sourcepos=None, **kwattrs): + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of `kwattrs` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within `sourceline` where this + tag was (purportedly) found. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + kwattrs.update(attrs) + return self.element_classes.get(Tag, Tag)( + None, self.builder, name, namespace, nsprefix, kwattrs, + sourceline=sourceline, sourcepos=sourcepos + ) + + def string_container(self, base_class=None): + container = base_class or NavigableString + + # There may be a general override of NavigableString. + container = self.element_classes.get( + container, container + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string(self, s, subclass=None): + """Create a new NavigableString associated with this BeautifulSoup + object. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_before().") + + def insert_after(self, *args): + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self): + """Internal method called by _popToTag when a tag is closed.""" + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if self.preserve_whitespace_tag_stack and tag == self.preserve_whitespace_tag_stack[-1]: + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + #print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag): + """Internal method called by handle_starttag when a tag is opened.""" + #print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass=None): + """Method called by the TreeBuilder when the end of a data segment + occurs. + """ + if self.current_data: + current_data = ''.join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if '\n' in current_data: + current_data = '\n' + else: + current_data = ' ' + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if self.parse_only and len(self.tagStack) <= 1 and \ + (not self.parse_only.text or \ + not self.parse_only.search(current_data)): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed(self, o, parent=None, most_recent_element=None): + """Method called by the TreeBuilder to integrate an object into the parse tree.""" + if parent is None: + parent = self.currentTag + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el): + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + descendant = child._last_descendant(False) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + target = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag(self, name, nsprefix=None, inclusivePop=True): + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + """ + #print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if (name == t.name and nsprefix == t.prefix): + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None, + sourcepos=None): + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + + If this method returns None, the tag was rejected by an active + SoupStrainer. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if (self.parse_only and len(self.tagStack) <= 1 + and (self.parse_only.text + or not self.parse_only.search_tag(name, attrs))): + return None + + tag = self.element_classes.get(Tag, Tag)( + self, self.builder, name, namespace, nsprefix, attrs, + self.currentTag, self._most_recent_element, + sourceline=sourceline, sourcepos=sourcepos + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name, nsprefix=None): + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + """ + #print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data): + """Called by the tree builder when a chunk of textual data is encountered.""" + self.current_data.append(data) + + def decode(self, pretty_print=False, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal"): + """Returns a string or Unicode representation of the parse tree + as an HTML or XML document. + + :param pretty_print: If this is True, indentation will be used to + make the document more readable. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = '' + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + eventual_encoding = None + if eventual_encoding != None: + encoding_part = ' encoding="%s"' % eventual_encoding + prefix = '\n' % encoding_part + else: + prefix = '' + if not pretty_print: + indent_level = None + else: + indent_level = 0 + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter) + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args, **kwargs): + kwargs['features'] = 'xml' + warnings.warn( + 'The BeautifulStoneSoup class is deprecated. Instead of using ' + 'it, pass features="xml" into the BeautifulSoup constructor.') + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +class StopParsing(Exception): + """Exception raised by a TreeBuilder if it's unable to continue parsing.""" + pass + +class FeatureNotFound(ValueError): + """Exception raised by the BeautifulSoup constructor if no parser with the + requested features is found. + """ + pass + + +#If this file is run as a script, act as an HTML pretty-printer. +if __name__ == '__main__': + import sys + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2e352339992bc958386558025d9a7c9ef3e3b01 GIT binary patch literal 23186 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
L;p?B$7nLdNltvjCX)xT!JR**D_KoPbbKl& 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

1It4LFV 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 NdSR+y6($Pm{{s1@UTOdU literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/element.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/element.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..321ad2fe94e8f8567488a2bdce2704698d59a5f6 GIT binary patch literal 65434 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 F{}0Y%Aw2*9 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/formatter.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/formatter.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f12e5d951ddc1e0e656a1c6577a0e89da3b0189 GIT binary patch literal 6176 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 Cg{HFr literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/testing.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/__pycache__/testing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71a8155b6fb5a0579d056fefc414a8cf69a74deb GIT binary patch literal 44341 zcmeHw3zS?(T3)}Wr!{(7k|kT~y&B1~$E%sqj3ir@S}p5o%WI9rYS!Lu+cZ5>cV>Fj z)7`qaThg>gS+8Yad3Z5zH~}IroCFaF5Xd1UJPykvn*1j5+2JVoa}}L99ZZ3 z{;GTX-k$Cr$-v1uIhr|L_f=K5>aYL*>#zU+>%YbI>oXDj{l!l;i-&$P68SA&1pgAa zcnUxFcaW$^KBA)esEVn0IhK#fF`kdhF_BNmF_}-wF_ll@m?$Tg2J!>Z2+ot`^wMB{ zP|j23%+k92x}~A~(9-(+`lSu|4NDvI8<#faH!W?>Z(iDx-?DUH{yxb&P~N(OQsgjY$3>6~7c2+1A|oj9sqTjx}2@x~}b7b5+Nx+iu+* zYsD{|pZ*+R5t$l^w$jtMdAjJ@IA4FtE;j0=xkmX?wNV=xZ0$U~P;^|oe!;F6PuA;B zX{J%PUnrIvc5C2tb!o}2)RCuJspF(uo-@_i`f|-~?Y#KW>1UpwDqOmF_VoF4=T8^T zPMv=K%=xLOFSUmFs!MgJSgP1gD|KnsDb?z&%%%Er*>)FfyWWaV7w6HqZO=?!c=!?L>bdi$S7leFtGVp%mrkEKIeqe_la?GU*PgAHsukXxe7Zsn1>HDi~nmHAg*$z{h`Fq4(y?$!Br9qiX(DPR@LHavQZ;)wNZ5*;**N)~p^ecPu-OY@veF`=*1} z*}8qb4%ilRFP7>HXh{)Br0?vvmWs~hM$IahF57sYyw0_X6=h}jW%m`AYR4>hq1q@b z0KuxGj=HTZyuDni+fK2Z9rtPqwIJ&X2INX})}tjWYfX+=uL3T%Q-5?AFS(%Kc}=%Q z=VkBRzVBj3bHgLYtQ*;JQ-83R(+efnsx+2tr!;E;GfMSk3wM@Et_y?$2yJVwR4JA* z%uA)&Dn|6EmA!7&j}O;M`}Ry8nkd$b!{J^Otp&%PI}Ti{*N%>l+t&e)vOP9iT^i4h zbHF$(MUSMctE4HbVqXQt&R6T8S`JsRjaje8xoVX)?6;WucR>KdxvrI7 z#cj;E_LT-Ys__QZ7@XQ|2`E%`7Qnz`7h_*{EkYY3KU1A=xR$cPQkpRVRU@_#e=8E$Incku|7fqwkF07 zSkq3i;+6=RVtIW0?9?z`gsy5PNQ^2~Fwi9u#B8zQ3Zw8L1hR69U?89lw^p3BO%LkD znX;YB)|FMMUUP~y-S(MkwQK{TZ46o{GKWSake0%jnxX-I@eH`rBcM^_tk~B}F8Q`W z_@maoJwUBv)?E(7jE$KE^o@=h$^ogAz`0%2IA1rtsO7-9i}Pszf=8+3j;8b0Ou0IH z*-|C9RxU1EcG)KOx%(|lH>eqaLvw{gg6>oqSXa*(TsZ+esiUtou+|xC=J@dBfnlq7 ze0XA*7ZdtoQf?iT^w4nbLZe(S0Sz^<%+!eXyTv8D4N>749fJU73CQ|T6aag`CL>)9 z@vPjkN{UTF>5dvIn0&z%CDYMB-pO`ep?5u=!B@zg_LL%I2R`V56#T3T$bowihHb0@ z0Kuv8M~)bzv8;^2l}5D=Y^&vvORB7qMG$poQB8Gj4m<=UIb0?yAg{+>;jy4W`>AFx z?MCVjYNlZt4CHP%S!QuPtLUb6g(≪F+;}23RgtE(5|+Ezj9z%}+J+8_NWGE9C)W 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__init__.py new file mode 100644 index 00000000..bd44905e --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/__init__.py @@ -0,0 +1,520 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import itertools +import sys +from bs4.element import ( + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re +) + +__all__ = [ + 'HTMLTreeBuilder', + 'SAXTreeBuilder', + 'TreeBuilder', + 'TreeBuilderRegistry', + ] + +# Some useful features for a TreeBuilder to have. +FAST = 'fast' +PERMISSIVE = 'permissive' +STRICT = 'strict' +XML = 'xml' +HTML = 'html' +HTML_5 = 'html5' + + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + def __init__(self): + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class): + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of Treebuilder. its .features + attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features): + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + features = list(features) + features.reverse() + candidates = None + candidate_set = None + while len(features) > 0: + feature = features.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + else: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection( + set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + +# The BeautifulSoup class will take feature lists from developers and use them +# to look up builders in this registry. +builder_registry = TreeBuilderRegistry() + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree.""" + + NAME = "[Unknown tree builder]" + ALTERNATE_NAMES = [] + features = [] + + is_xml = False + picklable = False + empty_element_tags = None # A tag will be considered an empty-element + # tag when and only when it has no contents. + + # A value for these tag/attribute combinations is a space- or + # comma-separated list of CDATA, rather than a single CDATA. + DEFAULT_CDATA_LIST_ATTRIBUTES = {} + + # Whitespace should be preserved inside these tags. + DEFAULT_PRESERVE_WHITESPACE_TAGS = set() + + # The textual contents of tags with these names should be + # instantiated with some class other than NavigableString. + DEFAULT_STRING_CONTAINERS = {} + + USE_DEFAULT = object() + + # Most parsers don't keep track of line numbers. + TRACKS_LINE_NUMBERS = False + + def __init__(self, multi_valued_attributes=USE_DEFAULT, + preserve_whitespace_tags=USE_DEFAULT, + store_line_numbers=USE_DEFAULT, + string_containers=USE_DEFAULT, + ): + """Constructor. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is `multi_valued_attributes`. + + :param preserve_whitespace_tags: A list of tags to treat + the way

 tags are treated in HTML. Tags in this list
+         are immune from pretty-printing; their contents will always be
+         output as-is.
+
+        :param string_containers: A dictionary mapping tag names to
+        the classes that should be instantiated to contain the textual
+        contents of those tags. The default is to use NavigableString
+        for every tag, no matter what the name. You can override the
+        default by changing DEFAULT_STRING_CONTAINERS.
+
+        :param store_line_numbers: If the parser keeps track of the
+         line numbers and positions of the original markup, that
+         information will, by default, be stored in each corresponding
+         `Tag` object. You can turn this off by passing
+         store_line_numbers=False. If the parser you're using doesn't 
+         keep track of this information, then setting store_line_numbers=True
+         will do nothing.
+        """
+        self.soup = None
+        if multi_valued_attributes is self.USE_DEFAULT:
+            multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+        self.cdata_list_attributes = multi_valued_attributes
+        if preserve_whitespace_tags is self.USE_DEFAULT:
+            preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+        self.preserve_whitespace_tags = preserve_whitespace_tags
+        if store_line_numbers == self.USE_DEFAULT:
+            store_line_numbers = self.TRACKS_LINE_NUMBERS
+        self.store_line_numbers = store_line_numbers 
+        if string_containers == self.USE_DEFAULT:
+            string_containers = self.DEFAULT_STRING_CONTAINERS
+        self.string_containers = string_containers
+        
+    def initialize_soup(self, soup):
+        """The BeautifulSoup object has been initialized and is now
+        being associated with the TreeBuilder.
+
+        :param soup: A BeautifulSoup object.
+        """
+        self.soup = soup
+        
+    def reset(self):
+        """Do any work necessary to reset the underlying parser
+        for a new document.
+
+        By default, this does nothing.
+        """
+        pass
+
+    def can_be_empty_element(self, tag_name):
+        """Might a tag with this name be an empty-element tag?
+
+        The final markup may or may not actually present this tag as
+        self-closing.
+
+        For instance: an HTMLBuilder does not consider a 

tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty

tag + will be presented as "

", not "

" or "

". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "" will become "", and "bar" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup): + """Run some incoming markup through some parsing process, + populating the `BeautifulSoup` object in self.soup. + + This method is not implemented in TreeBuilder; it must be + implemented in subclasses. + + :return: None. + """ + raise NotImplementedError() + + def prepare_markup(self, markup, user_specified_encoding=None, + document_declared_encoding=None, exclude_encodings=None): + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: Some markup -- probably a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment): + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of tests. + + :param fragment: A string -- fragment of HTML. + :return: A string -- a full HTML document. + """ + return fragment + + def set_up_substitutions(self, tag): + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :param tag: A `Tag` + :return: Whether or not a substitution was performed. + """ + return False + + def _replace_cdata_list_attribute_values(self, tag_name, attrs): + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + """ + if not attrs: + return attrs + if self.cdata_list_attributes: + universal = self.cdata_list_attributes.get('*', []) + tag_specific = self.cdata_list_attributes.get( + tag_name.lower(), None) + for attr in list(attrs.keys()): + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + value = attrs[attr] + if isinstance(value, str): + values = nonwhitespace_re.findall(value) + else: + # html5lib sometimes calls setAttributes twice + # for the same tag when rearranging the parse + # tree. On the second call the attribute value + # here is already a list. If this happens, + # leave the value alone rather than trying to + # split it again. + values = value + attrs[attr] = values + return attrs + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, but it demonstrates + how a simple TreeBuilder would work. + """ + + def feed(self, markup): + raise NotImplementedError() + + def close(self): + pass + + def startElement(self, name, attrs): + attrs = dict((key[1], value) for key, value in list(attrs.items())) + #print("Start %s, %r" % (name, attrs)) + self.soup.handle_starttag(name, attrs) + + def endElement(self, name): + #print("End %s" % name) + self.soup.handle_endtag(name) + + def startElementNS(self, nsTuple, nodeName, attrs): + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple, nodeName): + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + #handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix, nodeValue): + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix): + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content): + self.soup.handle_data(content) + + def startDocument(self): + pass + + def endDocument(self): + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML. + + Such as which tags are empty-element tags. + """ + + empty_element_tags = set([ + # These are from HTML5. + 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', + + # These are from earlier versions of HTML and are removed in HTML5. + 'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer' + ]) + + # The HTML standard defines these as block-level elements. Beautiful + # Soup does not treat these elements differently from other elements, + # but it may do so eventually, and this information is available if + # you need to use it. + block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"]) + + # The HTML standard defines an unusual content model for these tags. + # We represent this by using a string class other than NavigableString + # inside these tags. + # + # I made this list by going through the HTML spec + # (https://html.spec.whatwg.org/#metadata-content) and looking for + # "metadata content" elements that can contain strings. + # + # TODO: Arguably

as a +# string. +# +# XXX This code can be removed once most Python 3 users are on 3.2.3. +if major == 3 and minor == 2 and not CONSTRUCTOR_TAKES_STRICT: + import re + attrfind_tolerant = re.compile( + r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' + r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?') + HTMLParserTreeBuilder.attrfind_tolerant = attrfind_tolerant + + locatestarttagend = re.compile(r""" + <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name + (?:\s+ # whitespace before attribute name + (?:[a-zA-Z_][-.:a-zA-Z0-9_]* # attribute name + (?:\s*=\s* # value indicator + (?:'[^']*' # LITA-enclosed value + |\"[^\"]*\" # LIT-enclosed value + |[^'\">\s]+ # bare value + ) + )? + ) + )* + \s* # trailing whitespace +""", re.VERBOSE) + BeautifulSoupHTMLParser.locatestarttagend = locatestarttagend + + from html.parser import tagfind, attrfind + + def parse_starttag(self, i): + self.__starttag_text = None + endpos = self.check_for_whole_start_tag(i) + if endpos < 0: + return endpos + rawdata = self.rawdata + self.__starttag_text = rawdata[i:endpos] + + # Now parse the data between i+1 and j into a tag and attrs + attrs = [] + match = tagfind.match(rawdata, i+1) + assert match, 'unexpected call to parse_starttag()' + k = match.end() + self.lasttag = tag = rawdata[i+1:k].lower() + while k < endpos: + if self.strict: + m = attrfind.match(rawdata, k) + else: + m = attrfind_tolerant.match(rawdata, k) + if not m: + break + attrname, rest, attrvalue = m.group(1, 2, 3) + if not rest: + attrvalue = None + elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ + attrvalue[:1] == '"' == attrvalue[-1:]: + attrvalue = attrvalue[1:-1] + if attrvalue: + attrvalue = self.unescape(attrvalue) + attrs.append((attrname.lower(), attrvalue)) + k = m.end() + + end = rawdata[k:endpos].strip() + if end not in (">", "/>"): + lineno, offset = self.getpos() + if "\n" in self.__starttag_text: + lineno = lineno + self.__starttag_text.count("\n") + offset = len(self.__starttag_text) \ + - self.__starttag_text.rfind("\n") + else: + offset = offset + len(self.__starttag_text) + if self.strict: + self.error("junk characters in start tag: %r" + % (rawdata[k:endpos][:20],)) + self.handle_data(rawdata[i:endpos]) + return endpos + if end.endswith('/>'): + # XHTML-style empty tag: + self.handle_startendtag(tag, attrs) + else: + self.handle_starttag(tag, attrs) + if tag in self.CDATA_CONTENT_ELEMENTS: + self.set_cdata_mode(tag) + return endpos + + def set_cdata_mode(self, elem): + self.cdata_elem = elem.lower() + self.interesting = re.compile(r'' % self.cdata_elem, re.I) + + BeautifulSoupHTMLParser.parse_starttag = parse_starttag + BeautifulSoupHTMLParser.set_cdata_mode = set_cdata_mode + + CONSTRUCTOR_TAKES_STRICT = True diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_lxml.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_lxml.py new file mode 100644 index 00000000..11c9a696 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/builder/_lxml.py @@ -0,0 +1,342 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + 'LXMLTreeBuilderForXML', + 'LXMLTreeBuilder', + ] + +try: + from collections.abc import Callable # Python 3.6 +except ImportError as e: + from collections import Callable + +from io import BytesIO +from io import StringIO +from lxml import etree +from bs4.element import ( + Comment, + Doctype, + NamespacedAttribute, + ProcessingInstruction, + XMLProcessingInstruction, +) +from bs4.builder import ( + FAST, + HTML, + HTMLTreeBuilder, + PERMISSIVE, + ParserRejectedMarkup, + TreeBuilder, + XML) +from bs4.dammit import EncodingDetector + +LXML = 'lxml' + +def _invert(d): + "Invert a dictionary." + return dict((v,k) for k, v in list(d.items())) + +class LXMLTreeBuilderForXML(TreeBuilder): + DEFAULT_PARSER_CLASS = etree.XMLParser + + is_xml = True + processing_instruction_class = XMLProcessingInstruction + + NAME = "lxml-xml" + ALTERNATE_NAMES = ["xml"] + + # Well, it's permissive by XML parser standards. + features = [NAME, LXML, XML, FAST, PERMISSIVE] + + CHUNK_SIZE = 512 + + # This namespace mapping is specified in the XML Namespace + # standard. + DEFAULT_NSMAPS = dict(xml='http://www.w3.org/XML/1998/namespace') + + DEFAULT_NSMAPS_INVERTED = _invert(DEFAULT_NSMAPS) + + # NOTE: If we parsed Element objects and looked at .sourceline, + # we'd be able to see the line numbers from the original document. + # But instead we build an XMLParser or HTMLParser object to serve + # as the target of parse messages, and those messages don't include + # line numbers. + # See: https://bugs.launchpad.net/lxml/+bug/1846906 + + def initialize_soup(self, soup): + """Let the BeautifulSoup object know about the standard namespace + mapping. + + :param soup: A `BeautifulSoup`. + """ + super(LXMLTreeBuilderForXML, self).initialize_soup(soup) + self._register_namespaces(self.DEFAULT_NSMAPS) + + def _register_namespaces(self, mapping): + """Let the BeautifulSoup object know about namespaces encountered + while parsing the document. + + This might be useful later on when creating CSS selectors. + + :param mapping: A dictionary mapping namespace prefixes to URIs. + """ + for key, value in list(mapping.items()): + if key and key not in self.soup._namespaces: + # Let the BeautifulSoup object know about a new namespace. + # If there are multiple namespaces defined with the same + # prefix, the first one in the document takes precedence. + self.soup._namespaces[key] = value + + def default_parser(self, encoding): + """Find the default parser for the given encoding. + + :param encoding: A string. + :return: Either a parser object or a class, which + will be instantiated with default arguments. + """ + if self._default_parser is not None: + return self._default_parser + return etree.XMLParser( + target=self, strip_cdata=False, recover=True, encoding=encoding) + + def parser_for(self, encoding): + """Instantiate an appropriate parser for the given encoding. + + :param encoding: A string. + :return: A parser object such as an `etree.XMLParser`. + """ + # Use the default parser. + parser = self.default_parser(encoding) + + if isinstance(parser, Callable): + # Instantiate the parser with default arguments + parser = parser( + target=self, strip_cdata=False, recover=True, encoding=encoding + ) + return parser + + def __init__(self, parser=None, empty_element_tags=None, **kwargs): + # TODO: Issue a warning if parser is present but not a + # callable, since that means there's no way to create new + # parsers for different encodings. + self._default_parser = parser + if empty_element_tags is not None: + self.empty_element_tags = set(empty_element_tags) + self.soup = None + self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED] + super(LXMLTreeBuilderForXML, self).__init__(**kwargs) + + def _getNsTag(self, tag): + # Split the namespace URL out of a fully-qualified lxml tag + # name. Copied from lxml's src/lxml/sax.py. + if tag[0] == '{': + return tuple(tag[1:].split('}', 1)) + else: + return (None, tag) + + def prepare_markup(self, markup, user_specified_encoding=None, + exclude_encodings=None, + document_declared_encoding=None): + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + lxml really wants to get a bytestring and convert it to + Unicode itself. So instead of using UnicodeDammit to convert + the bytestring to Unicode using different encodings, this + implementation uses EncodingDetector to iterate over the + encodings, and tell lxml to try to parse the document as each + one in turn. + + :param markup: Some markup -- hopefully a bytestring. + :param user_specified_encoding: The user asked to try this encoding. + :param document_declared_encoding: The markup itself claims to be + in this encoding. + :param exclude_encodings: The user asked _not_ to try any of + these encodings. + + :yield: A series of 4-tuples: + (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy for converting the + document to Unicode and parsing it. Each strategy will be tried + in turn. + """ + is_html = not self.is_xml + if is_html: + self.processing_instruction_class = ProcessingInstruction + else: + self.processing_instruction_class = XMLProcessingInstruction + + if isinstance(markup, str): + # We were given Unicode. Maybe lxml can parse Unicode on + # this system? + yield markup, None, document_declared_encoding, False + + if isinstance(markup, str): + # No, apparently not. Convert the Unicode to UTF-8 and + # tell lxml to parse it as UTF-8. + yield (markup.encode("utf8"), "utf8", + document_declared_encoding, False) + + # This was provided by the end-user; treat it as a known + # definite encoding per the algorithm laid out in the HTML5 + # spec. (See the EncodingDetector class for details.) + known_definite_encodings = [user_specified_encoding] + + # This was found in the document; treat it as a slightly lower-priority + # user encoding. + user_encodings = [document_declared_encoding] + detector = EncodingDetector( + markup, known_definite_encodings=known_definite_encodings, + user_encodings=user_encodings, is_html=is_html, + exclude_encodings=exclude_encodings + ) + for encoding in detector.encodings: + yield (detector.markup, encoding, document_declared_encoding, False) + + def feed(self, markup): + if isinstance(markup, bytes): + markup = BytesIO(markup) + elif isinstance(markup, str): + markup = StringIO(markup) + + # Call feed() at least once, even if the markup is empty, + # or the parser won't be initialized. + data = markup.read(self.CHUNK_SIZE) + try: + self.parser = self.parser_for(self.soup.original_encoding) + self.parser.feed(data) + while len(data) != 0: + # Now call feed() on the rest of the data, chunk by chunk. + data = markup.read(self.CHUNK_SIZE) + if len(data) != 0: + self.parser.feed(data) + self.parser.close() + except (UnicodeDecodeError, LookupError, etree.ParserError) as e: + raise ParserRejectedMarkup(e) + + def close(self): + self.nsmaps = [self.DEFAULT_NSMAPS_INVERTED] + + def start(self, name, attrs, nsmap={}): + # Make sure attrs is a mutable dict--lxml may send an immutable dictproxy. + attrs = dict(attrs) + nsprefix = None + # Invert each namespace map as it comes in. + if len(nsmap) == 0 and len(self.nsmaps) > 1: + # There are no new namespaces for this tag, but + # non-default namespaces are in play, so we need a + # separate tag stack to know when they end. + self.nsmaps.append(None) + elif len(nsmap) > 0: + # A new namespace mapping has come into play. + + # First, Let the BeautifulSoup object know about it. + self._register_namespaces(nsmap) + + # Then, add it to our running list of inverted namespace + # mappings. + self.nsmaps.append(_invert(nsmap)) + + # Also treat the namespace mapping as a set of attributes on the + # tag, so we can recreate it later. + attrs = attrs.copy() + for prefix, namespace in list(nsmap.items()): + attribute = NamespacedAttribute( + "xmlns", prefix, "http://www.w3.org/2000/xmlns/") + attrs[attribute] = namespace + + # Namespaces are in play. Find any attributes that came in + # from lxml with namespaces attached to their names, and + # turn then into NamespacedAttribute objects. + new_attrs = {} + for attr, value in list(attrs.items()): + namespace, attr = self._getNsTag(attr) + if namespace is None: + new_attrs[attr] = value + else: + nsprefix = self._prefix_for_namespace(namespace) + attr = NamespacedAttribute(nsprefix, attr, namespace) + new_attrs[attr] = value + attrs = new_attrs + + namespace, name = self._getNsTag(name) + nsprefix = self._prefix_for_namespace(namespace) + self.soup.handle_starttag(name, namespace, nsprefix, attrs) + + def _prefix_for_namespace(self, namespace): + """Find the currently active prefix for the given namespace.""" + if namespace is None: + return None + for inverted_nsmap in reversed(self.nsmaps): + if inverted_nsmap is not None and namespace in inverted_nsmap: + return inverted_nsmap[namespace] + return None + + def end(self, name): + self.soup.endData() + completed_tag = self.soup.tagStack[-1] + namespace, name = self._getNsTag(name) + nsprefix = None + if namespace is not None: + for inverted_nsmap in reversed(self.nsmaps): + if inverted_nsmap is not None and namespace in inverted_nsmap: + nsprefix = inverted_nsmap[namespace] + break + self.soup.handle_endtag(name, nsprefix) + if len(self.nsmaps) > 1: + # This tag, or one of its parents, introduced a namespace + # mapping, so pop it off the stack. + self.nsmaps.pop() + + def pi(self, target, data): + self.soup.endData() + self.soup.handle_data(target + ' ' + data) + self.soup.endData(self.processing_instruction_class) + + def data(self, content): + self.soup.handle_data(content) + + def doctype(self, name, pubid, system): + self.soup.endData() + doctype = Doctype.for_name_and_ids(name, pubid, system) + self.soup.object_was_parsed(doctype) + + def comment(self, content): + "Handle comments as Comment objects." + self.soup.endData() + self.soup.handle_data(content) + self.soup.endData(Comment) + + def test_fragment_to_document(self, fragment): + """See `TreeBuilder`.""" + return '\n%s' % fragment + + +class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML): + + NAME = LXML + ALTERNATE_NAMES = ["lxml-html"] + + features = ALTERNATE_NAMES + [NAME, HTML, FAST, PERMISSIVE] + is_xml = False + processing_instruction_class = ProcessingInstruction + + def default_parser(self, encoding): + return etree.HTMLParser + + def feed(self, markup): + encoding = self.soup.original_encoding + try: + self.parser = self.parser_for(encoding) + self.parser.feed(markup) + self.parser.close() + except (UnicodeDecodeError, LookupError, etree.ParserError) as e: + raise ParserRejectedMarkup(e) + + + def test_fragment_to_document(self, fragment): + """See `TreeBuilder`.""" + return '%s' % fragment diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/dammit.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/dammit.py new file mode 100644 index 00000000..e017408b --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/dammit.py @@ -0,0 +1,3338 @@ +# -*- coding: utf-8 -*- +"""Beautiful Soup bonus library: Unicode, Dammit + +This library converts a bytestream to Unicode through any means +necessary. It is heavily based on code from Mark Pilgrim's Universal +Feed Parser. It works best on XML and HTML, but it does not rewrite the +XML or HTML to reflect a new encoding; that's the tree builder's job. +""" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from html.entities import codepoint2name +from collections import defaultdict +import codecs +import re +import logging +import string + +# Import a library to autodetect character encodings. +chardet_type = None +try: + # First try the fast C implementation. + # PyPI package: cchardet + import cchardet + def chardet_dammit(s): + if isinstance(s, str): + return None + return cchardet.detect(s)['encoding'] +except ImportError: + try: + # Fall back to the pure Python implementation + # Debian package: python-chardet + # PyPI package: chardet + import chardet + def chardet_dammit(s): + if isinstance(s, str): + return None + return chardet.detect(s)['encoding'] + #import chardet.constants + #chardet.constants._debug = 1 + except ImportError: + # No chardet available. + def chardet_dammit(s): + return None + +# Available from http://cjkpython.i18n.org/. +# +# TODO: This doesn't work anymore and the closest thing, iconv_codecs, +# is GPL-licensed. Check whether this is still necessary. +try: + import iconv_codec +except ImportError: + pass + +# Build bytestring and Unicode versions of regular expressions for finding +# a declared encoding inside an XML or HTML document. +xml_encoding = '^\\s*<\\?.*encoding=[\'"](.*?)[\'"].*\\?>' +html_meta = '<\\s*meta[^>]+charset\\s*=\\s*["\']?([^>]*?)[ /;\'">]' +encoding_res = dict() +encoding_res[bytes] = { + 'html' : re.compile(html_meta.encode("ascii"), re.I), + 'xml' : re.compile(xml_encoding.encode("ascii"), re.I), +} +encoding_res[str] = { + 'html' : re.compile(html_meta, re.I), + 'xml' : re.compile(xml_encoding, re.I) +} + +try: + from html.entities import html5 +except ImportError: + # This is a copy of html.entities.html5 from Python 3.9. There's + # no equivalent table in Python 2, so we'll just provide a copy + # here. + html5 = { + 'Aacute': '\xc1', + 'aacute': '\xe1', + 'Aacute;': '\xc1', + 'aacute;': '\xe1', + 'Abreve;': '\u0102', + 'abreve;': '\u0103', + 'ac;': '\u223e', + 'acd;': '\u223f', + 'acE;': '\u223e\u0333', + 'Acirc': '\xc2', + 'acirc': '\xe2', + 'Acirc;': '\xc2', + 'acirc;': '\xe2', + 'acute': '\xb4', + 'acute;': '\xb4', + 'Acy;': '\u0410', + 'acy;': '\u0430', + 'AElig': '\xc6', + 'aelig': '\xe6', + 'AElig;': '\xc6', + 'aelig;': '\xe6', + 'af;': '\u2061', + 'Afr;': '\U0001d504', + 'afr;': '\U0001d51e', + 'Agrave': '\xc0', + 'agrave': '\xe0', + 'Agrave;': '\xc0', + 'agrave;': '\xe0', + 'alefsym;': '\u2135', + 'aleph;': '\u2135', + 'Alpha;': '\u0391', + 'alpha;': '\u03b1', + 'Amacr;': '\u0100', + 'amacr;': '\u0101', + 'amalg;': '\u2a3f', + 'AMP': '&', + 'amp': '&', + 'AMP;': '&', + 'amp;': '&', + 'And;': '\u2a53', + '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;': '\u0104', + 'aogon;': '\u0105', + 'Aopf;': '\U0001d538', + 'aopf;': '\U0001d552', + 'ap;': '\u2248', + 'apacir;': '\u2a6f', + 'apE;': '\u2a70', + 'ape;': '\u224a', + 'apid;': '\u224b', + 'apos;': "'", + 'ApplyFunction;': '\u2061', + 'approx;': '\u2248', + 'approxeq;': '\u224a', + 'Aring': '\xc5', + 'aring': '\xe5', + 'Aring;': '\xc5', + 'aring;': '\xe5', + 'Ascr;': '\U0001d49c', + 'ascr;': '\U0001d4b6', + 'Assign;': '\u2254', + 'ast;': '*', + 'asymp;': '\u2248', + 'asympeq;': '\u224d', + 'Atilde': '\xc3', + 'atilde': '\xe3', + 'Atilde;': '\xc3', + 'atilde;': '\xe3', + 'Auml': '\xc4', + 'auml': '\xe4', + 'Auml;': '\xc4', + 'auml;': '\xe4', + 'awconint;': '\u2233', + 'awint;': '\u2a11', + 'backcong;': '\u224c', + 'backepsilon;': '\u03f6', + 'backprime;': '\u2035', + 'backsim;': '\u223d', + 'backsimeq;': '\u22cd', + 'Backslash;': '\u2216', + 'Barv;': '\u2ae7', + 'barvee;': '\u22bd', + 'Barwed;': '\u2306', + 'barwed;': '\u2305', + 'barwedge;': '\u2305', + 'bbrk;': '\u23b5', + 'bbrktbrk;': '\u23b6', + 'bcong;': '\u224c', + 'Bcy;': '\u0411', + 'bcy;': '\u0431', + 'bdquo;': '\u201e', + 'becaus;': '\u2235', + 'Because;': '\u2235', + 'because;': '\u2235', + 'bemptyv;': '\u29b0', + 'bepsi;': '\u03f6', + 'bernou;': '\u212c', + 'Bernoullis;': '\u212c', + 'Beta;': '\u0392', + 'beta;': '\u03b2', + 'beth;': '\u2136', + 'between;': '\u226c', + 'Bfr;': '\U0001d505', + '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;': '\u2aed', + 'bnot;': '\u2310', + 'Bopf;': '\U0001d539', + 'bopf;': '\U0001d553', + 'bot;': '\u22a5', + 'bottom;': '\u22a5', + 'bowtie;': '\u22c8', + 'boxbox;': '\u29c9', + 'boxDL;': '\u2557', + 'boxDl;': '\u2556', + 'boxdL;': '\u2555', + 'boxdl;': '\u2510', + 'boxDR;': '\u2554', + 'boxDr;': '\u2553', + 'boxdR;': '\u2552', + 'boxdr;': '\u250c', + 'boxH;': '\u2550', + 'boxh;': '\u2500', + 'boxHD;': '\u2566', + 'boxHd;': '\u2564', + 'boxhD;': '\u2565', + 'boxhd;': '\u252c', + 'boxHU;': '\u2569', + 'boxHu;': '\u2567', + 'boxhU;': '\u2568', + 'boxhu;': '\u2534', + 'boxminus;': '\u229f', + 'boxplus;': '\u229e', + 'boxtimes;': '\u22a0', + 'boxUL;': '\u255d', + 'boxUl;': '\u255c', + 'boxuL;': '\u255b', + 'boxul;': '\u2518', + 'boxUR;': '\u255a', + 'boxUr;': '\u2559', + 'boxuR;': '\u2558', + 'boxur;': '\u2514', + 'boxV;': '\u2551', + 'boxv;': '\u2502', + 'boxVH;': '\u256c', + 'boxVh;': '\u256b', + 'boxvH;': '\u256a', + 'boxvh;': '\u253c', + 'boxVL;': '\u2563', + 'boxVl;': '\u2562', + 'boxvL;': '\u2561', + 'boxvl;': '\u2524', + 'boxVR;': '\u2560', + 'boxVr;': '\u255f', + 'boxvR;': '\u255e', + 'boxvr;': '\u251c', + 'bprime;': '\u2035', + 'Breve;': '\u02d8', + 'breve;': '\u02d8', + 'brvbar': '\xa6', + 'brvbar;': '\xa6', + 'Bscr;': '\u212c', + 'bscr;': '\U0001d4b7', + 'bsemi;': '\u204f', + 'bsim;': '\u223d', + 'bsime;': '\u22cd', + 'bsol;': '\\', + 'bsolb;': '\u29c5', + 'bsolhsub;': '\u27c8', + 'bull;': '\u2022', + 'bullet;': '\u2022', + 'bump;': '\u224e', + 'bumpE;': '\u2aae', + 'bumpe;': '\u224f', + 'Bumpeq;': '\u224e', + 'bumpeq;': '\u224f', + 'Cacute;': '\u0106', + 'cacute;': '\u0107', + 'Cap;': '\u22d2', + 'cap;': '\u2229', + 'capand;': '\u2a44', + 'capbrcup;': '\u2a49', + 'capcap;': '\u2a4b', + 'capcup;': '\u2a47', + 'capdot;': '\u2a40', + 'CapitalDifferentialD;': '\u2145', + 'caps;': '\u2229\ufe00', + 'caret;': '\u2041', + 'caron;': '\u02c7', + 'Cayleys;': '\u212d', + 'ccaps;': '\u2a4d', + 'Ccaron;': '\u010c', + 'ccaron;': '\u010d', + 'Ccedil': '\xc7', + 'ccedil': '\xe7', + 'Ccedil;': '\xc7', + 'ccedil;': '\xe7', + 'Ccirc;': '\u0108', + 'ccirc;': '\u0109', + 'Cconint;': '\u2230', + 'ccups;': '\u2a4c', + 'ccupssm;': '\u2a50', + 'Cdot;': '\u010a', + 'cdot;': '\u010b', + 'cedil': '\xb8', + 'cedil;': '\xb8', + 'Cedilla;': '\xb8', + 'cemptyv;': '\u29b2', + 'cent': '\xa2', + 'cent;': '\xa2', + 'CenterDot;': '\xb7', + 'centerdot;': '\xb7', + 'Cfr;': '\u212d', + 'cfr;': '\U0001d520', + 'CHcy;': '\u0427', + 'chcy;': '\u0447', + 'check;': '\u2713', + 'checkmark;': '\u2713', + 'Chi;': '\u03a7', + 'chi;': '\u03c7', + 'cir;': '\u25cb', + 'circ;': '\u02c6', + 'circeq;': '\u2257', + 'circlearrowleft;': '\u21ba', + 'circlearrowright;': '\u21bb', + 'circledast;': '\u229b', + 'circledcirc;': '\u229a', + 'circleddash;': '\u229d', + 'CircleDot;': '\u2299', + 'circledR;': '\xae', + 'circledS;': '\u24c8', + 'CircleMinus;': '\u2296', + 'CirclePlus;': '\u2295', + 'CircleTimes;': '\u2297', + 'cirE;': '\u29c3', + 'cire;': '\u2257', + 'cirfnint;': '\u2a10', + 'cirmid;': '\u2aef', + 'cirscir;': '\u29c2', + 'ClockwiseContourIntegral;': '\u2232', + 'CloseCurlyDoubleQuote;': '\u201d', + 'CloseCurlyQuote;': '\u2019', + 'clubs;': '\u2663', + 'clubsuit;': '\u2663', + 'Colon;': '\u2237', + 'colon;': ':', + 'Colone;': '\u2a74', + 'colone;': '\u2254', + 'coloneq;': '\u2254', + 'comma;': ',', + 'commat;': '@', + 'comp;': '\u2201', + 'compfn;': '\u2218', + 'complement;': '\u2201', + 'complexes;': '\u2102', + 'cong;': '\u2245', + 'congdot;': '\u2a6d', + 'Congruent;': '\u2261', + 'Conint;': '\u222f', + 'conint;': '\u222e', + 'ContourIntegral;': '\u222e', + 'Copf;': '\u2102', + 'copf;': '\U0001d554', + 'coprod;': '\u2210', + 'Coproduct;': '\u2210', + 'COPY': '\xa9', + 'copy': '\xa9', + 'COPY;': '\xa9', + 'copy;': '\xa9', + 'copysr;': '\u2117', + 'CounterClockwiseContourIntegral;': '\u2233', + 'crarr;': '\u21b5', + 'Cross;': '\u2a2f', + 'cross;': '\u2717', + 'Cscr;': '\U0001d49e', + '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;': '\u22d3', + 'cup;': '\u222a', + 'cupbrcap;': '\u2a48', + 'CupCap;': '\u224d', + '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', + 'Dagger;': '\u2021', + 'dagger;': '\u2020', + 'daleth;': '\u2138', + 'Darr;': '\u21a1', + 'dArr;': '\u21d3', + 'darr;': '\u2193', + 'dash;': '\u2010', + 'Dashv;': '\u2ae4', + 'dashv;': '\u22a3', + 'dbkarow;': '\u290f', + 'dblac;': '\u02dd', + 'Dcaron;': '\u010e', + 'dcaron;': '\u010f', + 'Dcy;': '\u0414', + 'dcy;': '\u0434', + 'DD;': '\u2145', + 'dd;': '\u2146', + 'ddagger;': '\u2021', + 'ddarr;': '\u21ca', + 'DDotrahd;': '\u2911', + 'ddotseq;': '\u2a77', + 'deg': '\xb0', + 'deg;': '\xb0', + 'Del;': '\u2207', + 'Delta;': '\u0394', + 'delta;': '\u03b4', + 'demptyv;': '\u29b1', + 'dfisht;': '\u297f', + 'Dfr;': '\U0001d507', + 'dfr;': '\U0001d521', + 'dHar;': '\u2965', + 'dharl;': '\u21c3', + 'dharr;': '\u21c2', + 'DiacriticalAcute;': '\xb4', + 'DiacriticalDot;': '\u02d9', + 'DiacriticalDoubleAcute;': '\u02dd', + 'DiacriticalGrave;': '`', + 'DiacriticalTilde;': '\u02dc', + 'diam;': '\u22c4', + 'Diamond;': '\u22c4', + 'diamond;': '\u22c4', + 'diamondsuit;': '\u2666', + 'diams;': '\u2666', + 'die;': '\xa8', + 'DifferentialD;': '\u2146', + 'digamma;': '\u03dd', + 'disin;': '\u22f2', + 'div;': '\xf7', + 'divide': '\xf7', + 'divide;': '\xf7', + 'divideontimes;': '\u22c7', + 'divonx;': '\u22c7', + 'DJcy;': '\u0402', + 'djcy;': '\u0452', + 'dlcorn;': '\u231e', + 'dlcrop;': '\u230d', + 'dollar;': '$', + 'Dopf;': '\U0001d53b', + 'dopf;': '\U0001d555', + 'Dot;': '\xa8', + 'dot;': '\u02d9', + 'DotDot;': '\u20dc', + 'doteq;': '\u2250', + 'doteqdot;': '\u2251', + 'DotEqual;': '\u2250', + 'dotminus;': '\u2238', + 'dotplus;': '\u2214', + 'dotsquare;': '\u22a1', + 'doublebarwedge;': '\u2306', + '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', + 'Downarrow;': '\u21d3', + 'downarrow;': '\u2193', + 'DownArrowBar;': '\u2913', + 'DownArrowUpArrow;': '\u21f5', + 'DownBreve;': '\u0311', + 'downdownarrows;': '\u21ca', + 'downharpoonleft;': '\u21c3', + 'downharpoonright;': '\u21c2', + 'DownLeftRightVector;': '\u2950', + 'DownLeftTeeVector;': '\u295e', + 'DownLeftVector;': '\u21bd', + 'DownLeftVectorBar;': '\u2956', + 'DownRightTeeVector;': '\u295f', + 'DownRightVector;': '\u21c1', + 'DownRightVectorBar;': '\u2957', + 'DownTee;': '\u22a4', + 'DownTeeArrow;': '\u21a7', + 'drbkarow;': '\u2910', + 'drcorn;': '\u231f', + 'drcrop;': '\u230c', + 'Dscr;': '\U0001d49f', + 'dscr;': '\U0001d4b9', + 'DScy;': '\u0405', + 'dscy;': '\u0455', + 'dsol;': '\u29f6', + 'Dstrok;': '\u0110', + 'dstrok;': '\u0111', + 'dtdot;': '\u22f1', + 'dtri;': '\u25bf', + 'dtrif;': '\u25be', + 'duarr;': '\u21f5', + 'duhar;': '\u296f', + 'dwangle;': '\u29a6', + 'DZcy;': '\u040f', + 'dzcy;': '\u045f', + 'dzigrarr;': '\u27ff', + 'Eacute': '\xc9', + 'eacute': '\xe9', + 'Eacute;': '\xc9', + 'eacute;': '\xe9', + 'easter;': '\u2a6e', + 'Ecaron;': '\u011a', + 'ecaron;': '\u011b', + 'ecir;': '\u2256', + 'Ecirc': '\xca', + 'ecirc': '\xea', + 'Ecirc;': '\xca', + 'ecirc;': '\xea', + 'ecolon;': '\u2255', + 'Ecy;': '\u042d', + 'ecy;': '\u044d', + 'eDDot;': '\u2a77', + 'Edot;': '\u0116', + 'eDot;': '\u2251', + 'edot;': '\u0117', + 'ee;': '\u2147', + 'efDot;': '\u2252', + 'Efr;': '\U0001d508', + 'efr;': '\U0001d522', + 'eg;': '\u2a9a', + 'Egrave': '\xc8', + 'egrave': '\xe8', + 'Egrave;': '\xc8', + 'egrave;': '\xe8', + 'egs;': '\u2a96', + 'egsdot;': '\u2a98', + 'el;': '\u2a99', + 'Element;': '\u2208', + 'elinters;': '\u23e7', + 'ell;': '\u2113', + 'els;': '\u2a95', + 'elsdot;': '\u2a97', + 'Emacr;': '\u0112', + 'emacr;': '\u0113', + 'empty;': '\u2205', + 'emptyset;': '\u2205', + 'EmptySmallSquare;': '\u25fb', + 'emptyv;': '\u2205', + 'EmptyVerySmallSquare;': '\u25ab', + 'emsp13;': '\u2004', + 'emsp14;': '\u2005', + 'emsp;': '\u2003', + 'ENG;': '\u014a', + 'eng;': '\u014b', + 'ensp;': '\u2002', + 'Eogon;': '\u0118', + 'eogon;': '\u0119', + 'Eopf;': '\U0001d53c', + 'eopf;': '\U0001d556', + 'epar;': '\u22d5', + 'eparsl;': '\u29e3', + 'eplus;': '\u2a71', + 'epsi;': '\u03b5', + 'Epsilon;': '\u0395', + 'epsilon;': '\u03b5', + 'epsiv;': '\u03f5', + 'eqcirc;': '\u2256', + 'eqcolon;': '\u2255', + 'eqsim;': '\u2242', + 'eqslantgtr;': '\u2a96', + 'eqslantless;': '\u2a95', + 'Equal;': '\u2a75', + 'equals;': '=', + 'EqualTilde;': '\u2242', + 'equest;': '\u225f', + 'Equilibrium;': '\u21cc', + 'equiv;': '\u2261', + 'equivDD;': '\u2a78', + 'eqvparsl;': '\u29e5', + 'erarr;': '\u2971', + 'erDot;': '\u2253', + 'Escr;': '\u2130', + 'escr;': '\u212f', + 'esdot;': '\u2250', + 'Esim;': '\u2a73', + 'esim;': '\u2242', + 'Eta;': '\u0397', + 'eta;': '\u03b7', + 'ETH': '\xd0', + 'eth': '\xf0', + 'ETH;': '\xd0', + 'eth;': '\xf0', + 'Euml': '\xcb', + 'euml': '\xeb', + 'Euml;': '\xcb', + 'euml;': '\xeb', + 'euro;': '\u20ac', + 'excl;': '!', + 'exist;': '\u2203', + 'Exists;': '\u2203', + 'expectation;': '\u2130', + 'ExponentialE;': '\u2147', + 'exponentiale;': '\u2147', + 'fallingdotseq;': '\u2252', + 'Fcy;': '\u0424', + 'fcy;': '\u0444', + 'female;': '\u2640', + 'ffilig;': '\ufb03', + 'fflig;': '\ufb00', + 'ffllig;': '\ufb04', + 'Ffr;': '\U0001d509', + 'ffr;': '\U0001d523', + 'filig;': '\ufb01', + 'FilledSmallSquare;': '\u25fc', + 'FilledVerySmallSquare;': '\u25aa', + 'fjlig;': 'fj', + 'flat;': '\u266d', + 'fllig;': '\ufb02', + 'fltns;': '\u25b1', + 'fnof;': '\u0192', + 'Fopf;': '\U0001d53d', + 'fopf;': '\U0001d557', + 'ForAll;': '\u2200', + 'forall;': '\u2200', + 'fork;': '\u22d4', + 'forkv;': '\u2ad9', + 'Fouriertrf;': '\u2131', + '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;': '\u2131', + 'fscr;': '\U0001d4bb', + 'gacute;': '\u01f5', + 'Gamma;': '\u0393', + 'gamma;': '\u03b3', + 'Gammad;': '\u03dc', + 'gammad;': '\u03dd', + 'gap;': '\u2a86', + 'Gbreve;': '\u011e', + 'gbreve;': '\u011f', + 'Gcedil;': '\u0122', + 'Gcirc;': '\u011c', + 'gcirc;': '\u011d', + 'Gcy;': '\u0413', + 'gcy;': '\u0433', + 'Gdot;': '\u0120', + 'gdot;': '\u0121', + 'gE;': '\u2267', + 'ge;': '\u2265', + 'gEl;': '\u2a8c', + 'gel;': '\u22db', + 'geq;': '\u2265', + 'geqq;': '\u2267', + 'geqslant;': '\u2a7e', + 'ges;': '\u2a7e', + 'gescc;': '\u2aa9', + 'gesdot;': '\u2a80', + 'gesdoto;': '\u2a82', + 'gesdotol;': '\u2a84', + 'gesl;': '\u22db\ufe00', + 'gesles;': '\u2a94', + 'Gfr;': '\U0001d50a', + 'gfr;': '\U0001d524', + 'Gg;': '\u22d9', + 'gg;': '\u226b', + 'ggg;': '\u22d9', + 'gimel;': '\u2137', + 'GJcy;': '\u0403', + 'gjcy;': '\u0453', + 'gl;': '\u2277', + 'gla;': '\u2aa5', + 'glE;': '\u2a92', + 'glj;': '\u2aa4', + 'gnap;': '\u2a8a', + 'gnapprox;': '\u2a8a', + 'gnE;': '\u2269', + 'gne;': '\u2a88', + 'gneq;': '\u2a88', + 'gneqq;': '\u2269', + 'gnsim;': '\u22e7', + 'Gopf;': '\U0001d53e', + 'gopf;': '\U0001d558', + 'grave;': '`', + 'GreaterEqual;': '\u2265', + 'GreaterEqualLess;': '\u22db', + 'GreaterFullEqual;': '\u2267', + 'GreaterGreater;': '\u2aa2', + 'GreaterLess;': '\u2277', + 'GreaterSlantEqual;': '\u2a7e', + 'GreaterTilde;': '\u2273', + 'Gscr;': '\U0001d4a2', + 'gscr;': '\u210a', + 'gsim;': '\u2273', + 'gsime;': '\u2a8e', + 'gsiml;': '\u2a90', + 'GT': '>', + 'gt': '>', + 'GT;': '>', + 'Gt;': '\u226b', + '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', + 'Hacek;': '\u02c7', + 'hairsp;': '\u200a', + 'half;': '\xbd', + 'hamilt;': '\u210b', + 'HARDcy;': '\u042a', + 'hardcy;': '\u044a', + 'hArr;': '\u21d4', + 'harr;': '\u2194', + 'harrcir;': '\u2948', + 'harrw;': '\u21ad', + 'Hat;': '^', + 'hbar;': '\u210f', + 'Hcirc;': '\u0124', + 'hcirc;': '\u0125', + 'hearts;': '\u2665', + 'heartsuit;': '\u2665', + 'hellip;': '\u2026', + 'hercon;': '\u22b9', + 'Hfr;': '\u210c', + 'hfr;': '\U0001d525', + 'HilbertSpace;': '\u210b', + 'hksearow;': '\u2925', + 'hkswarow;': '\u2926', + 'hoarr;': '\u21ff', + 'homtht;': '\u223b', + 'hookleftarrow;': '\u21a9', + 'hookrightarrow;': '\u21aa', + 'Hopf;': '\u210d', + 'hopf;': '\U0001d559', + 'horbar;': '\u2015', + 'HorizontalLine;': '\u2500', + 'Hscr;': '\u210b', + 'hscr;': '\U0001d4bd', + 'hslash;': '\u210f', + 'Hstrok;': '\u0126', + 'hstrok;': '\u0127', + 'HumpDownHump;': '\u224e', + 'HumpEqual;': '\u224f', + 'hybull;': '\u2043', + 'hyphen;': '\u2010', + 'Iacute': '\xcd', + 'iacute': '\xed', + 'Iacute;': '\xcd', + 'iacute;': '\xed', + 'ic;': '\u2063', + 'Icirc': '\xce', + 'icirc': '\xee', + 'Icirc;': '\xce', + 'icirc;': '\xee', + 'Icy;': '\u0418', + 'icy;': '\u0438', + 'Idot;': '\u0130', + 'IEcy;': '\u0415', + 'iecy;': '\u0435', + 'iexcl': '\xa1', + 'iexcl;': '\xa1', + 'iff;': '\u21d4', + 'Ifr;': '\u2111', + 'ifr;': '\U0001d526', + 'Igrave': '\xcc', + 'igrave': '\xec', + 'Igrave;': '\xcc', + 'igrave;': '\xec', + 'ii;': '\u2148', + 'iiiint;': '\u2a0c', + 'iiint;': '\u222d', + 'iinfin;': '\u29dc', + 'iiota;': '\u2129', + 'IJlig;': '\u0132', + 'ijlig;': '\u0133', + 'Im;': '\u2111', + 'Imacr;': '\u012a', + 'imacr;': '\u012b', + 'image;': '\u2111', + 'ImaginaryI;': '\u2148', + 'imagline;': '\u2110', + 'imagpart;': '\u2111', + 'imath;': '\u0131', + 'imof;': '\u22b7', + 'imped;': '\u01b5', + 'Implies;': '\u21d2', + 'in;': '\u2208', + 'incare;': '\u2105', + 'infin;': '\u221e', + 'infintie;': '\u29dd', + 'inodot;': '\u0131', + 'Int;': '\u222c', + 'int;': '\u222b', + 'intcal;': '\u22ba', + 'integers;': '\u2124', + 'Integral;': '\u222b', + 'intercal;': '\u22ba', + 'Intersection;': '\u22c2', + 'intlarhk;': '\u2a17', + 'intprod;': '\u2a3c', + 'InvisibleComma;': '\u2063', + 'InvisibleTimes;': '\u2062', + 'IOcy;': '\u0401', + 'iocy;': '\u0451', + 'Iogon;': '\u012e', + 'iogon;': '\u012f', + 'Iopf;': '\U0001d540', + 'iopf;': '\U0001d55a', + 'Iota;': '\u0399', + 'iota;': '\u03b9', + 'iprod;': '\u2a3c', + 'iquest': '\xbf', + 'iquest;': '\xbf', + 'Iscr;': '\u2110', + 'iscr;': '\U0001d4be', + 'isin;': '\u2208', + 'isindot;': '\u22f5', + 'isinE;': '\u22f9', + 'isins;': '\u22f4', + 'isinsv;': '\u22f3', + 'isinv;': '\u2208', + 'it;': '\u2062', + 'Itilde;': '\u0128', + 'itilde;': '\u0129', + 'Iukcy;': '\u0406', + 'iukcy;': '\u0456', + 'Iuml': '\xcf', + 'iuml': '\xef', + 'Iuml;': '\xcf', + 'iuml;': '\xef', + 'Jcirc;': '\u0134', + 'jcirc;': '\u0135', + 'Jcy;': '\u0419', + 'jcy;': '\u0439', + 'Jfr;': '\U0001d50d', + 'jfr;': '\U0001d527', + 'jmath;': '\u0237', + 'Jopf;': '\U0001d541', + 'jopf;': '\U0001d55b', + 'Jscr;': '\U0001d4a5', + 'jscr;': '\U0001d4bf', + 'Jsercy;': '\u0408', + 'jsercy;': '\u0458', + 'Jukcy;': '\u0404', + 'jukcy;': '\u0454', + 'Kappa;': '\u039a', + 'kappa;': '\u03ba', + 'kappav;': '\u03f0', + 'Kcedil;': '\u0136', + 'kcedil;': '\u0137', + 'Kcy;': '\u041a', + 'kcy;': '\u043a', + 'Kfr;': '\U0001d50e', + 'kfr;': '\U0001d528', + 'kgreen;': '\u0138', + 'KHcy;': '\u0425', + 'khcy;': '\u0445', + 'KJcy;': '\u040c', + 'kjcy;': '\u045c', + 'Kopf;': '\U0001d542', + 'kopf;': '\U0001d55c', + 'Kscr;': '\U0001d4a6', + 'kscr;': '\U0001d4c0', + 'lAarr;': '\u21da', + 'Lacute;': '\u0139', + 'lacute;': '\u013a', + 'laemptyv;': '\u29b4', + 'lagran;': '\u2112', + 'Lambda;': '\u039b', + 'lambda;': '\u03bb', + 'Lang;': '\u27ea', + 'lang;': '\u27e8', + 'langd;': '\u2991', + 'langle;': '\u27e8', + 'lap;': '\u2a85', + 'Laplacetrf;': '\u2112', + 'laquo': '\xab', + 'laquo;': '\xab', + 'Larr;': '\u219e', + 'lArr;': '\u21d0', + 'larr;': '\u2190', + 'larrb;': '\u21e4', + 'larrbfs;': '\u291f', + 'larrfs;': '\u291d', + 'larrhk;': '\u21a9', + 'larrlp;': '\u21ab', + 'larrpl;': '\u2939', + 'larrsim;': '\u2973', + 'larrtl;': '\u21a2', + 'lat;': '\u2aab', + 'lAtail;': '\u291b', + 'latail;': '\u2919', + 'late;': '\u2aad', + 'lates;': '\u2aad\ufe00', + 'lBarr;': '\u290e', + 'lbarr;': '\u290c', + 'lbbrk;': '\u2772', + 'lbrace;': '{', + 'lbrack;': '[', + 'lbrke;': '\u298b', + 'lbrksld;': '\u298f', + 'lbrkslu;': '\u298d', + 'Lcaron;': '\u013d', + 'lcaron;': '\u013e', + 'Lcedil;': '\u013b', + 'lcedil;': '\u013c', + 'lceil;': '\u2308', + 'lcub;': '{', + 'Lcy;': '\u041b', + 'lcy;': '\u043b', + 'ldca;': '\u2936', + 'ldquo;': '\u201c', + 'ldquor;': '\u201e', + 'ldrdhar;': '\u2967', + 'ldrushar;': '\u294b', + 'ldsh;': '\u21b2', + 'lE;': '\u2266', + 'le;': '\u2264', + 'LeftAngleBracket;': '\u27e8', + 'LeftArrow;': '\u2190', + 'Leftarrow;': '\u21d0', + 'leftarrow;': '\u2190', + 'LeftArrowBar;': '\u21e4', + 'LeftArrowRightArrow;': '\u21c6', + 'leftarrowtail;': '\u21a2', + 'LeftCeiling;': '\u2308', + 'LeftDoubleBracket;': '\u27e6', + 'LeftDownTeeVector;': '\u2961', + 'LeftDownVector;': '\u21c3', + 'LeftDownVectorBar;': '\u2959', + 'LeftFloor;': '\u230a', + 'leftharpoondown;': '\u21bd', + 'leftharpoonup;': '\u21bc', + 'leftleftarrows;': '\u21c7', + 'LeftRightArrow;': '\u2194', + 'Leftrightarrow;': '\u21d4', + 'leftrightarrow;': '\u2194', + 'leftrightarrows;': '\u21c6', + 'leftrightharpoons;': '\u21cb', + 'leftrightsquigarrow;': '\u21ad', + 'LeftRightVector;': '\u294e', + 'LeftTee;': '\u22a3', + 'LeftTeeArrow;': '\u21a4', + 'LeftTeeVector;': '\u295a', + 'leftthreetimes;': '\u22cb', + 'LeftTriangle;': '\u22b2', + 'LeftTriangleBar;': '\u29cf', + 'LeftTriangleEqual;': '\u22b4', + 'LeftUpDownVector;': '\u2951', + 'LeftUpTeeVector;': '\u2960', + 'LeftUpVector;': '\u21bf', + 'LeftUpVectorBar;': '\u2958', + 'LeftVector;': '\u21bc', + 'LeftVectorBar;': '\u2952', + 'lEg;': '\u2a8b', + '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', + 'LessEqualGreater;': '\u22da', + 'LessFullEqual;': '\u2266', + 'LessGreater;': '\u2276', + 'lessgtr;': '\u2276', + 'LessLess;': '\u2aa1', + 'lesssim;': '\u2272', + 'LessSlantEqual;': '\u2a7d', + 'LessTilde;': '\u2272', + 'lfisht;': '\u297c', + 'lfloor;': '\u230a', + 'Lfr;': '\U0001d50f', + 'lfr;': '\U0001d529', + 'lg;': '\u2276', + 'lgE;': '\u2a91', + 'lHar;': '\u2962', + 'lhard;': '\u21bd', + 'lharu;': '\u21bc', + 'lharul;': '\u296a', + 'lhblk;': '\u2584', + 'LJcy;': '\u0409', + 'ljcy;': '\u0459', + 'Ll;': '\u22d8', + 'll;': '\u226a', + 'llarr;': '\u21c7', + 'llcorner;': '\u231e', + 'Lleftarrow;': '\u21da', + 'llhard;': '\u296b', + 'lltri;': '\u25fa', + 'Lmidot;': '\u013f', + 'lmidot;': '\u0140', + 'lmoust;': '\u23b0', + 'lmoustache;': '\u23b0', + 'lnap;': '\u2a89', + 'lnapprox;': '\u2a89', + 'lnE;': '\u2268', + 'lne;': '\u2a87', + 'lneq;': '\u2a87', + 'lneqq;': '\u2268', + 'lnsim;': '\u22e6', + 'loang;': '\u27ec', + 'loarr;': '\u21fd', + 'lobrk;': '\u27e6', + 'LongLeftArrow;': '\u27f5', + 'Longleftarrow;': '\u27f8', + 'longleftarrow;': '\u27f5', + 'LongLeftRightArrow;': '\u27f7', + 'Longleftrightarrow;': '\u27fa', + 'longleftrightarrow;': '\u27f7', + 'longmapsto;': '\u27fc', + 'LongRightArrow;': '\u27f6', + 'Longrightarrow;': '\u27f9', + 'longrightarrow;': '\u27f6', + 'looparrowleft;': '\u21ab', + 'looparrowright;': '\u21ac', + 'lopar;': '\u2985', + 'Lopf;': '\U0001d543', + 'lopf;': '\U0001d55d', + 'loplus;': '\u2a2d', + 'lotimes;': '\u2a34', + 'lowast;': '\u2217', + 'lowbar;': '_', + 'LowerLeftArrow;': '\u2199', + 'LowerRightArrow;': '\u2198', + 'loz;': '\u25ca', + 'lozenge;': '\u25ca', + 'lozf;': '\u29eb', + 'lpar;': '(', + 'lparlt;': '\u2993', + 'lrarr;': '\u21c6', + 'lrcorner;': '\u231f', + 'lrhar;': '\u21cb', + 'lrhard;': '\u296d', + 'lrm;': '\u200e', + 'lrtri;': '\u22bf', + 'lsaquo;': '\u2039', + 'Lscr;': '\u2112', + 'lscr;': '\U0001d4c1', + 'Lsh;': '\u21b0', + 'lsh;': '\u21b0', + 'lsim;': '\u2272', + 'lsime;': '\u2a8d', + 'lsimg;': '\u2a8f', + 'lsqb;': '[', + 'lsquo;': '\u2018', + 'lsquor;': '\u201a', + 'Lstrok;': '\u0141', + 'lstrok;': '\u0142', + 'LT': '<', + 'lt': '<', + 'LT;': '<', + 'Lt;': '\u226a', + 'lt;': '<', + 'ltcc;': '\u2aa6', + 'ltcir;': '\u2a79', + 'ltdot;': '\u22d6', + 'lthree;': '\u22cb', + 'ltimes;': '\u22c9', + 'ltlarr;': '\u2976', + 'ltquest;': '\u2a7b', + 'ltri;': '\u25c3', + 'ltrie;': '\u22b4', + 'ltrif;': '\u25c2', + 'ltrPar;': '\u2996', + 'lurdshar;': '\u294a', + 'luruhar;': '\u2966', + 'lvertneqq;': '\u2268\ufe00', + 'lvnE;': '\u2268\ufe00', + 'macr': '\xaf', + 'macr;': '\xaf', + 'male;': '\u2642', + 'malt;': '\u2720', + 'maltese;': '\u2720', + 'Map;': '\u2905', + 'map;': '\u21a6', + 'mapsto;': '\u21a6', + 'mapstodown;': '\u21a7', + 'mapstoleft;': '\u21a4', + 'mapstoup;': '\u21a5', + 'marker;': '\u25ae', + 'mcomma;': '\u2a29', + 'Mcy;': '\u041c', + 'mcy;': '\u043c', + 'mdash;': '\u2014', + 'mDDot;': '\u223a', + 'measuredangle;': '\u2221', + 'MediumSpace;': '\u205f', + 'Mellintrf;': '\u2133', + 'Mfr;': '\U0001d510', + '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', + 'MinusPlus;': '\u2213', + 'mlcp;': '\u2adb', + 'mldr;': '\u2026', + 'mnplus;': '\u2213', + 'models;': '\u22a7', + 'Mopf;': '\U0001d544', + 'mopf;': '\U0001d55e', + 'mp;': '\u2213', + 'Mscr;': '\u2133', + 'mscr;': '\U0001d4c2', + 'mstpos;': '\u223e', + 'Mu;': '\u039c', + 'mu;': '\u03bc', + 'multimap;': '\u22b8', + 'mumap;': '\u22b8', + 'nabla;': '\u2207', + 'Nacute;': '\u0143', + '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;': '\u0147', + 'ncaron;': '\u0148', + 'Ncedil;': '\u0145', + 'ncedil;': '\u0146', + 'ncong;': '\u2247', + 'ncongdot;': '\u2a6d\u0338', + 'ncup;': '\u2a42', + 'Ncy;': '\u041d', + 'ncy;': '\u043d', + 'ndash;': '\u2013', + 'ne;': '\u2260', + 'nearhk;': '\u2924', + 'neArr;': '\u21d7', + 'nearr;': '\u2197', + 'nearrow;': '\u2197', + 'nedot;': '\u2250\u0338', + 'NegativeMediumSpace;': '\u200b', + 'NegativeThickSpace;': '\u200b', + 'NegativeThinSpace;': '\u200b', + 'NegativeVeryThinSpace;': '\u200b', + 'nequiv;': '\u2262', + 'nesear;': '\u2928', + 'nesim;': '\u2242\u0338', + 'NestedGreaterGreater;': '\u226b', + 'NestedLessLess;': '\u226a', + 'NewLine;': '\n', + 'nexist;': '\u2204', + 'nexists;': '\u2204', + 'Nfr;': '\U0001d511', + 'nfr;': '\U0001d52b', + 'ngE;': '\u2267\u0338', + 'nge;': '\u2271', + 'ngeq;': '\u2271', + 'ngeqq;': '\u2267\u0338', + 'ngeqslant;': '\u2a7e\u0338', + 'nges;': '\u2a7e\u0338', + 'nGg;': '\u22d9\u0338', + 'ngsim;': '\u2275', + 'nGt;': '\u226b\u20d2', + 'ngt;': '\u226f', + 'ngtr;': '\u226f', + 'nGtv;': '\u226b\u0338', + 'nhArr;': '\u21ce', + 'nharr;': '\u21ae', + 'nhpar;': '\u2af2', + 'ni;': '\u220b', + 'nis;': '\u22fc', + 'nisd;': '\u22fa', + 'niv;': '\u220b', + 'NJcy;': '\u040a', + 'njcy;': '\u045a', + 'nlArr;': '\u21cd', + 'nlarr;': '\u219a', + 'nldr;': '\u2025', + 'nlE;': '\u2266\u0338', + 'nle;': '\u2270', + 'nLeftarrow;': '\u21cd', + 'nleftarrow;': '\u219a', + 'nLeftrightarrow;': '\u21ce', + 'nleftrightarrow;': '\u21ae', + 'nleq;': '\u2270', + 'nleqq;': '\u2266\u0338', + 'nleqslant;': '\u2a7d\u0338', + 'nles;': '\u2a7d\u0338', + 'nless;': '\u226e', + 'nLl;': '\u22d8\u0338', + 'nlsim;': '\u2274', + 'nLt;': '\u226a\u20d2', + 'nlt;': '\u226e', + 'nltri;': '\u22ea', + 'nltrie;': '\u22ec', + 'nLtv;': '\u226a\u0338', + 'nmid;': '\u2224', + 'NoBreak;': '\u2060', + 'NonBreakingSpace;': '\xa0', + 'Nopf;': '\u2115', + 'nopf;': '\U0001d55f', + 'not': '\xac', + 'Not;': '\u2aec', + 'not;': '\xac', + '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', + 'notin;': '\u2209', + 'notindot;': '\u22f5\u0338', + 'notinE;': '\u22f9\u0338', + 'notinva;': '\u2209', + 'notinvb;': '\u22f7', + 'notinvc;': '\u22f6', + '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', + 'notni;': '\u220c', + 'notniva;': '\u220c', + 'notnivb;': '\u22fe', + 'notnivc;': '\u22fd', + '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', + '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;': '\u21cf', + 'nrightarrow;': '\u219b', + 'nrtri;': '\u22eb', + 'nrtrie;': '\u22ed', + 'nsc;': '\u2281', + 'nsccue;': '\u22e1', + 'nsce;': '\u2ab0\u0338', + 'Nscr;': '\U0001d4a9', + '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': '\xd1', + 'ntilde': '\xf1', + 'Ntilde;': '\xd1', + 'ntilde;': '\xf1', + 'ntlg;': '\u2278', + 'ntriangleleft;': '\u22ea', + 'ntrianglelefteq;': '\u22ec', + 'ntriangleright;': '\u22eb', + 'ntrianglerighteq;': '\u22ed', + 'Nu;': '\u039d', + 'nu;': '\u03bd', + 'num;': '#', + 'numero;': '\u2116', + 'numsp;': '\u2007', + 'nvap;': '\u224d\u20d2', + 'nVDash;': '\u22af', + 'nVdash;': '\u22ae', + 'nvDash;': '\u22ad', + 'nvdash;': '\u22ac', + 'nvge;': '\u2265\u20d2', + 'nvgt;': '>\u20d2', + 'nvHarr;': '\u2904', + 'nvinfin;': '\u29de', + 'nvlArr;': '\u2902', + 'nvle;': '\u2264\u20d2', + 'nvlt;': '<\u20d2', + 'nvltrie;': '\u22b4\u20d2', + 'nvrArr;': '\u2903', + 'nvrtrie;': '\u22b5\u20d2', + 'nvsim;': '\u223c\u20d2', + 'nwarhk;': '\u2923', + 'nwArr;': '\u21d6', + 'nwarr;': '\u2196', + 'nwarrow;': '\u2196', + 'nwnear;': '\u2927', + 'Oacute': '\xd3', + 'oacute': '\xf3', + 'Oacute;': '\xd3', + 'oacute;': '\xf3', + 'oast;': '\u229b', + 'ocir;': '\u229a', + 'Ocirc': '\xd4', + 'ocirc': '\xf4', + 'Ocirc;': '\xd4', + 'ocirc;': '\xf4', + 'Ocy;': '\u041e', + 'ocy;': '\u043e', + 'odash;': '\u229d', + 'Odblac;': '\u0150', + 'odblac;': '\u0151', + 'odiv;': '\u2a38', + 'odot;': '\u2299', + 'odsold;': '\u29bc', + 'OElig;': '\u0152', + 'oelig;': '\u0153', + 'ofcir;': '\u29bf', + 'Ofr;': '\U0001d512', + 'ofr;': '\U0001d52c', + 'ogon;': '\u02db', + 'Ograve': '\xd2', + 'ograve': '\xf2', + 'Ograve;': '\xd2', + 'ograve;': '\xf2', + 'ogt;': '\u29c1', + 'ohbar;': '\u29b5', + 'ohm;': '\u03a9', + 'oint;': '\u222e', + 'olarr;': '\u21ba', + 'olcir;': '\u29be', + 'olcross;': '\u29bb', + 'oline;': '\u203e', + 'olt;': '\u29c0', + 'Omacr;': '\u014c', + 'omacr;': '\u014d', + 'Omega;': '\u03a9', + 'omega;': '\u03c9', + 'Omicron;': '\u039f', + 'omicron;': '\u03bf', + 'omid;': '\u29b6', + 'ominus;': '\u2296', + 'Oopf;': '\U0001d546', + 'oopf;': '\U0001d560', + 'opar;': '\u29b7', + 'OpenCurlyDoubleQuote;': '\u201c', + 'OpenCurlyQuote;': '\u2018', + 'operp;': '\u29b9', + 'oplus;': '\u2295', + 'Or;': '\u2a54', + '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', + 'oS;': '\u24c8', + 'Oscr;': '\U0001d4aa', + 'oscr;': '\u2134', + 'Oslash': '\xd8', + 'oslash': '\xf8', + 'Oslash;': '\xd8', + 'oslash;': '\xf8', + 'osol;': '\u2298', + 'Otilde': '\xd5', + 'otilde': '\xf5', + 'Otilde;': '\xd5', + 'otilde;': '\xf5', + 'Otimes;': '\u2a37', + 'otimes;': '\u2297', + 'otimesas;': '\u2a36', + 'Ouml': '\xd6', + 'ouml': '\xf6', + 'Ouml;': '\xd6', + 'ouml;': '\xf6', + 'ovbar;': '\u233d', + 'OverBar;': '\u203e', + 'OverBrace;': '\u23de', + 'OverBracket;': '\u23b4', + 'OverParenthesis;': '\u23dc', + 'par;': '\u2225', + 'para': '\xb6', + 'para;': '\xb6', + 'parallel;': '\u2225', + 'parsim;': '\u2af3', + 'parsl;': '\u2afd', + 'part;': '\u2202', + 'PartialD;': '\u2202', + 'Pcy;': '\u041f', + 'pcy;': '\u043f', + 'percnt;': '%', + 'period;': '.', + 'permil;': '\u2030', + 'perp;': '\u22a5', + 'pertenk;': '\u2031', + 'Pfr;': '\U0001d513', + 'pfr;': '\U0001d52d', + 'Phi;': '\u03a6', + 'phi;': '\u03c6', + 'phiv;': '\u03d5', + 'phmmat;': '\u2133', + 'phone;': '\u260e', + 'Pi;': '\u03a0', + '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', + 'PlusMinus;': '\xb1', + 'plusmn': '\xb1', + 'plusmn;': '\xb1', + 'plussim;': '\u2a26', + 'plustwo;': '\u2a27', + 'pm;': '\xb1', + 'Poincareplane;': '\u210c', + 'pointint;': '\u2a15', + 'Popf;': '\u2119', + 'popf;': '\U0001d561', + 'pound': '\xa3', + 'pound;': '\xa3', + 'Pr;': '\u2abb', + 'pr;': '\u227a', + 'prap;': '\u2ab7', + 'prcue;': '\u227c', + 'prE;': '\u2ab3', + 'pre;': '\u2aaf', + 'prec;': '\u227a', + 'precapprox;': '\u2ab7', + 'preccurlyeq;': '\u227c', + 'Precedes;': '\u227a', + 'PrecedesEqual;': '\u2aaf', + 'PrecedesSlantEqual;': '\u227c', + 'PrecedesTilde;': '\u227e', + 'preceq;': '\u2aaf', + 'precnapprox;': '\u2ab9', + 'precneqq;': '\u2ab5', + 'precnsim;': '\u22e8', + 'precsim;': '\u227e', + 'Prime;': '\u2033', + 'prime;': '\u2032', + 'primes;': '\u2119', + 'prnap;': '\u2ab9', + 'prnE;': '\u2ab5', + 'prnsim;': '\u22e8', + 'prod;': '\u220f', + 'Product;': '\u220f', + 'profalar;': '\u232e', + 'profline;': '\u2312', + 'profsurf;': '\u2313', + 'prop;': '\u221d', + 'Proportion;': '\u2237', + 'Proportional;': '\u221d', + 'propto;': '\u221d', + 'prsim;': '\u227e', + 'prurel;': '\u22b0', + 'Pscr;': '\U0001d4ab', + 'pscr;': '\U0001d4c5', + 'Psi;': '\u03a8', + 'psi;': '\u03c8', + 'puncsp;': '\u2008', + 'Qfr;': '\U0001d514', + 'qfr;': '\U0001d52e', + 'qint;': '\u2a0c', + 'Qopf;': '\u211a', + 'qopf;': '\U0001d562', + 'qprime;': '\u2057', + 'Qscr;': '\U0001d4ac', + 'qscr;': '\U0001d4c6', + 'quaternions;': '\u210d', + 'quatint;': '\u2a16', + 'quest;': '?', + 'questeq;': '\u225f', + 'QUOT': '"', + 'quot': '"', + 'QUOT;': '"', + 'quot;': '"', + 'rAarr;': '\u21db', + 'race;': '\u223d\u0331', + 'Racute;': '\u0154', + 'racute;': '\u0155', + 'radic;': '\u221a', + 'raemptyv;': '\u29b3', + 'Rang;': '\u27eb', + 'rang;': '\u27e9', + 'rangd;': '\u2992', + 'range;': '\u29a5', + 'rangle;': '\u27e9', + 'raquo': '\xbb', + 'raquo;': '\xbb', + 'Rarr;': '\u21a0', + 'rArr;': '\u21d2', + 'rarr;': '\u2192', + 'rarrap;': '\u2975', + 'rarrb;': '\u21e5', + 'rarrbfs;': '\u2920', + 'rarrc;': '\u2933', + 'rarrfs;': '\u291e', + 'rarrhk;': '\u21aa', + 'rarrlp;': '\u21ac', + 'rarrpl;': '\u2945', + 'rarrsim;': '\u2974', + 'Rarrtl;': '\u2916', + 'rarrtl;': '\u21a3', + 'rarrw;': '\u219d', + 'rAtail;': '\u291c', + 'ratail;': '\u291a', + 'ratio;': '\u2236', + 'rationals;': '\u211a', + 'RBarr;': '\u2910', + 'rBarr;': '\u290f', + 'rbarr;': '\u290d', + 'rbbrk;': '\u2773', + 'rbrace;': '}', + 'rbrack;': ']', + 'rbrke;': '\u298c', + 'rbrksld;': '\u298e', + 'rbrkslu;': '\u2990', + 'Rcaron;': '\u0158', + 'rcaron;': '\u0159', + 'Rcedil;': '\u0156', + 'rcedil;': '\u0157', + 'rceil;': '\u2309', + 'rcub;': '}', + 'Rcy;': '\u0420', + 'rcy;': '\u0440', + 'rdca;': '\u2937', + 'rdldhar;': '\u2969', + 'rdquo;': '\u201d', + 'rdquor;': '\u201d', + 'rdsh;': '\u21b3', + 'Re;': '\u211c', + 'real;': '\u211c', + 'realine;': '\u211b', + 'realpart;': '\u211c', + 'reals;': '\u211d', + 'rect;': '\u25ad', + 'REG': '\xae', + 'reg': '\xae', + 'REG;': '\xae', + 'reg;': '\xae', + 'ReverseElement;': '\u220b', + 'ReverseEquilibrium;': '\u21cb', + 'ReverseUpEquilibrium;': '\u296f', + 'rfisht;': '\u297d', + 'rfloor;': '\u230b', + 'Rfr;': '\u211c', + 'rfr;': '\U0001d52f', + 'rHar;': '\u2964', + 'rhard;': '\u21c1', + 'rharu;': '\u21c0', + 'rharul;': '\u296c', + 'Rho;': '\u03a1', + 'rho;': '\u03c1', + 'rhov;': '\u03f1', + 'RightAngleBracket;': '\u27e9', + 'RightArrow;': '\u2192', + 'Rightarrow;': '\u21d2', + 'rightarrow;': '\u2192', + 'RightArrowBar;': '\u21e5', + 'RightArrowLeftArrow;': '\u21c4', + 'rightarrowtail;': '\u21a3', + 'RightCeiling;': '\u2309', + 'RightDoubleBracket;': '\u27e7', + 'RightDownTeeVector;': '\u295d', + 'RightDownVector;': '\u21c2', + 'RightDownVectorBar;': '\u2955', + 'RightFloor;': '\u230b', + 'rightharpoondown;': '\u21c1', + 'rightharpoonup;': '\u21c0', + 'rightleftarrows;': '\u21c4', + 'rightleftharpoons;': '\u21cc', + 'rightrightarrows;': '\u21c9', + 'rightsquigarrow;': '\u219d', + 'RightTee;': '\u22a2', + 'RightTeeArrow;': '\u21a6', + 'RightTeeVector;': '\u295b', + 'rightthreetimes;': '\u22cc', + 'RightTriangle;': '\u22b3', + 'RightTriangleBar;': '\u29d0', + 'RightTriangleEqual;': '\u22b5', + 'RightUpDownVector;': '\u294f', + 'RightUpTeeVector;': '\u295c', + 'RightUpVector;': '\u21be', + 'RightUpVectorBar;': '\u2954', + 'RightVector;': '\u21c0', + 'RightVectorBar;': '\u2953', + '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;': '\u211d', + 'ropf;': '\U0001d563', + 'roplus;': '\u2a2e', + 'rotimes;': '\u2a35', + 'RoundImplies;': '\u2970', + 'rpar;': ')', + 'rpargt;': '\u2994', + 'rppolint;': '\u2a12', + 'rrarr;': '\u21c9', + 'Rrightarrow;': '\u21db', + 'rsaquo;': '\u203a', + 'Rscr;': '\u211b', + 'rscr;': '\U0001d4c7', + 'Rsh;': '\u21b1', + 'rsh;': '\u21b1', + 'rsqb;': ']', + 'rsquo;': '\u2019', + 'rsquor;': '\u2019', + 'rthree;': '\u22cc', + 'rtimes;': '\u22ca', + 'rtri;': '\u25b9', + 'rtrie;': '\u22b5', + 'rtrif;': '\u25b8', + 'rtriltri;': '\u29ce', + 'RuleDelayed;': '\u29f4', + 'ruluhar;': '\u2968', + 'rx;': '\u211e', + 'Sacute;': '\u015a', + 'sacute;': '\u015b', + 'sbquo;': '\u201a', + 'Sc;': '\u2abc', + 'sc;': '\u227b', + 'scap;': '\u2ab8', + 'Scaron;': '\u0160', + 'scaron;': '\u0161', + 'sccue;': '\u227d', + 'scE;': '\u2ab4', + 'sce;': '\u2ab0', + 'Scedil;': '\u015e', + 'scedil;': '\u015f', + 'Scirc;': '\u015c', + 'scirc;': '\u015d', + 'scnap;': '\u2aba', + 'scnE;': '\u2ab6', + 'scnsim;': '\u22e9', + 'scpolint;': '\u2a13', + 'scsim;': '\u227f', + 'Scy;': '\u0421', + 'scy;': '\u0441', + 'sdot;': '\u22c5', + 'sdotb;': '\u22a1', + 'sdote;': '\u2a66', + 'searhk;': '\u2925', + 'seArr;': '\u21d8', + 'searr;': '\u2198', + 'searrow;': '\u2198', + 'sect': '\xa7', + 'sect;': '\xa7', + 'semi;': ';', + 'seswar;': '\u2929', + 'setminus;': '\u2216', + 'setmn;': '\u2216', + 'sext;': '\u2736', + 'Sfr;': '\U0001d516', + 'sfr;': '\U0001d530', + 'sfrown;': '\u2322', + 'sharp;': '\u266f', + 'SHCHcy;': '\u0429', + 'shchcy;': '\u0449', + 'SHcy;': '\u0428', + 'shcy;': '\u0448', + 'ShortDownArrow;': '\u2193', + 'ShortLeftArrow;': '\u2190', + 'shortmid;': '\u2223', + 'shortparallel;': '\u2225', + 'ShortRightArrow;': '\u2192', + 'ShortUpArrow;': '\u2191', + 'shy': '\xad', + 'shy;': '\xad', + 'Sigma;': '\u03a3', + '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', + 'SmallCircle;': '\u2218', + 'smallsetminus;': '\u2216', + 'smashp;': '\u2a33', + 'smeparsl;': '\u29e4', + 'smid;': '\u2223', + 'smile;': '\u2323', + 'smt;': '\u2aaa', + 'smte;': '\u2aac', + 'smtes;': '\u2aac\ufe00', + 'SOFTcy;': '\u042c', + 'softcy;': '\u044c', + 'sol;': '/', + 'solb;': '\u29c4', + 'solbar;': '\u233f', + 'Sopf;': '\U0001d54a', + 'sopf;': '\U0001d564', + 'spades;': '\u2660', + 'spadesuit;': '\u2660', + 'spar;': '\u2225', + 'sqcap;': '\u2293', + 'sqcaps;': '\u2293\ufe00', + 'sqcup;': '\u2294', + 'sqcups;': '\u2294\ufe00', + 'Sqrt;': '\u221a', + 'sqsub;': '\u228f', + 'sqsube;': '\u2291', + 'sqsubset;': '\u228f', + 'sqsubseteq;': '\u2291', + 'sqsup;': '\u2290', + 'sqsupe;': '\u2292', + 'sqsupset;': '\u2290', + 'sqsupseteq;': '\u2292', + 'squ;': '\u25a1', + 'Square;': '\u25a1', + 'square;': '\u25a1', + 'SquareIntersection;': '\u2293', + 'SquareSubset;': '\u228f', + 'SquareSubsetEqual;': '\u2291', + 'SquareSuperset;': '\u2290', + 'SquareSupersetEqual;': '\u2292', + 'SquareUnion;': '\u2294', + 'squarf;': '\u25aa', + 'squf;': '\u25aa', + 'srarr;': '\u2192', + 'Sscr;': '\U0001d4ae', + 'sscr;': '\U0001d4c8', + 'ssetmn;': '\u2216', + 'ssmile;': '\u2323', + 'sstarf;': '\u22c6', + 'Star;': '\u22c6', + 'star;': '\u2606', + 'starf;': '\u2605', + 'straightepsilon;': '\u03f5', + 'straightphi;': '\u03d5', + 'strns;': '\xaf', + 'Sub;': '\u22d0', + 'sub;': '\u2282', + 'subdot;': '\u2abd', + 'subE;': '\u2ac5', + 'sube;': '\u2286', + 'subedot;': '\u2ac3', + 'submult;': '\u2ac1', + 'subnE;': '\u2acb', + 'subne;': '\u228a', + 'subplus;': '\u2abf', + 'subrarr;': '\u2979', + 'Subset;': '\u22d0', + 'subset;': '\u2282', + 'subseteq;': '\u2286', + 'subseteqq;': '\u2ac5', + 'SubsetEqual;': '\u2286', + 'subsetneq;': '\u228a', + 'subsetneqq;': '\u2acb', + 'subsim;': '\u2ac7', + 'subsub;': '\u2ad5', + 'subsup;': '\u2ad3', + 'succ;': '\u227b', + 'succapprox;': '\u2ab8', + 'succcurlyeq;': '\u227d', + 'Succeeds;': '\u227b', + 'SucceedsEqual;': '\u2ab0', + 'SucceedsSlantEqual;': '\u227d', + 'SucceedsTilde;': '\u227f', + 'succeq;': '\u2ab0', + 'succnapprox;': '\u2aba', + 'succneqq;': '\u2ab6', + 'succnsim;': '\u22e9', + 'succsim;': '\u227f', + 'SuchThat;': '\u220b', + 'Sum;': '\u2211', + 'sum;': '\u2211', + 'sung;': '\u266a', + 'sup1': '\xb9', + 'sup1;': '\xb9', + 'sup2': '\xb2', + 'sup2;': '\xb2', + 'sup3': '\xb3', + 'sup3;': '\xb3', + 'Sup;': '\u22d1', + 'sup;': '\u2283', + 'supdot;': '\u2abe', + 'supdsub;': '\u2ad8', + 'supE;': '\u2ac6', + 'supe;': '\u2287', + 'supedot;': '\u2ac4', + 'Superset;': '\u2283', + 'SupersetEqual;': '\u2287', + 'suphsol;': '\u27c9', + 'suphsub;': '\u2ad7', + 'suplarr;': '\u297b', + 'supmult;': '\u2ac2', + 'supnE;': '\u2acc', + 'supne;': '\u228b', + 'supplus;': '\u2ac0', + 'Supset;': '\u22d1', + 'supset;': '\u2283', + 'supseteq;': '\u2287', + 'supseteqq;': '\u2ac6', + 'supsetneq;': '\u228b', + 'supsetneqq;': '\u2acc', + 'supsim;': '\u2ac8', + 'supsub;': '\u2ad4', + 'supsup;': '\u2ad6', + 'swarhk;': '\u2926', + 'swArr;': '\u21d9', + 'swarr;': '\u2199', + 'swarrow;': '\u2199', + 'swnwar;': '\u292a', + 'szlig': '\xdf', + 'szlig;': '\xdf', + 'Tab;': '\t', + 'target;': '\u2316', + 'Tau;': '\u03a4', + 'tau;': '\u03c4', + 'tbrk;': '\u23b4', + 'Tcaron;': '\u0164', + 'tcaron;': '\u0165', + 'Tcedil;': '\u0162', + 'tcedil;': '\u0163', + 'Tcy;': '\u0422', + 'tcy;': '\u0442', + 'tdot;': '\u20db', + 'telrec;': '\u2315', + 'Tfr;': '\U0001d517', + 'tfr;': '\U0001d531', + 'there4;': '\u2234', + 'Therefore;': '\u2234', + 'therefore;': '\u2234', + 'Theta;': '\u0398', + 'theta;': '\u03b8', + 'thetasym;': '\u03d1', + 'thetav;': '\u03d1', + 'thickapprox;': '\u2248', + 'thicksim;': '\u223c', + 'ThickSpace;': '\u205f\u200a', + 'thinsp;': '\u2009', + 'ThinSpace;': '\u2009', + 'thkap;': '\u2248', + 'thksim;': '\u223c', + 'THORN': '\xde', + 'thorn': '\xfe', + 'THORN;': '\xde', + 'thorn;': '\xfe', + 'Tilde;': '\u223c', + 'tilde;': '\u02dc', + 'TildeEqual;': '\u2243', + 'TildeFullEqual;': '\u2245', + 'TildeTilde;': '\u2248', + 'times': '\xd7', + 'times;': '\xd7', + 'timesb;': '\u22a0', + 'timesbar;': '\u2a31', + 'timesd;': '\u2a30', + 'tint;': '\u222d', + 'toea;': '\u2928', + 'top;': '\u22a4', + 'topbot;': '\u2336', + 'topcir;': '\u2af1', + 'Topf;': '\U0001d54b', + 'topf;': '\U0001d565', + 'topfork;': '\u2ada', + 'tosa;': '\u2929', + 'tprime;': '\u2034', + 'TRADE;': '\u2122', + 'trade;': '\u2122', + 'triangle;': '\u25b5', + 'triangledown;': '\u25bf', + 'triangleleft;': '\u25c3', + 'trianglelefteq;': '\u22b4', + 'triangleq;': '\u225c', + 'triangleright;': '\u25b9', + 'trianglerighteq;': '\u22b5', + 'tridot;': '\u25ec', + 'trie;': '\u225c', + 'triminus;': '\u2a3a', + 'TripleDot;': '\u20db', + 'triplus;': '\u2a39', + 'trisb;': '\u29cd', + 'tritime;': '\u2a3b', + 'trpezium;': '\u23e2', + 'Tscr;': '\U0001d4af', + 'tscr;': '\U0001d4c9', + 'TScy;': '\u0426', + 'tscy;': '\u0446', + 'TSHcy;': '\u040b', + 'tshcy;': '\u045b', + 'Tstrok;': '\u0166', + 'tstrok;': '\u0167', + 'twixt;': '\u226c', + 'twoheadleftarrow;': '\u219e', + 'twoheadrightarrow;': '\u21a0', + 'Uacute': '\xda', + 'uacute': '\xfa', + 'Uacute;': '\xda', + 'uacute;': '\xfa', + 'Uarr;': '\u219f', + 'uArr;': '\u21d1', + 'uarr;': '\u2191', + 'Uarrocir;': '\u2949', + 'Ubrcy;': '\u040e', + 'ubrcy;': '\u045e', + 'Ubreve;': '\u016c', + 'ubreve;': '\u016d', + 'Ucirc': '\xdb', + 'ucirc': '\xfb', + 'Ucirc;': '\xdb', + 'ucirc;': '\xfb', + 'Ucy;': '\u0423', + 'ucy;': '\u0443', + 'udarr;': '\u21c5', + 'Udblac;': '\u0170', + 'udblac;': '\u0171', + 'udhar;': '\u296e', + 'ufisht;': '\u297e', + 'Ufr;': '\U0001d518', + 'ufr;': '\U0001d532', + 'Ugrave': '\xd9', + 'ugrave': '\xf9', + 'Ugrave;': '\xd9', + 'ugrave;': '\xf9', + 'uHar;': '\u2963', + 'uharl;': '\u21bf', + 'uharr;': '\u21be', + 'uhblk;': '\u2580', + 'ulcorn;': '\u231c', + 'ulcorner;': '\u231c', + 'ulcrop;': '\u230f', + 'ultri;': '\u25f8', + 'Umacr;': '\u016a', + 'umacr;': '\u016b', + 'uml': '\xa8', + 'uml;': '\xa8', + 'UnderBar;': '_', + 'UnderBrace;': '\u23df', + 'UnderBracket;': '\u23b5', + 'UnderParenthesis;': '\u23dd', + 'Union;': '\u22c3', + 'UnionPlus;': '\u228e', + 'Uogon;': '\u0172', + 'uogon;': '\u0173', + 'Uopf;': '\U0001d54c', + 'uopf;': '\U0001d566', + 'UpArrow;': '\u2191', + 'Uparrow;': '\u21d1', + 'uparrow;': '\u2191', + 'UpArrowBar;': '\u2912', + 'UpArrowDownArrow;': '\u21c5', + 'UpDownArrow;': '\u2195', + 'Updownarrow;': '\u21d5', + 'updownarrow;': '\u2195', + 'UpEquilibrium;': '\u296e', + 'upharpoonleft;': '\u21bf', + 'upharpoonright;': '\u21be', + 'uplus;': '\u228e', + 'UpperLeftArrow;': '\u2196', + 'UpperRightArrow;': '\u2197', + 'Upsi;': '\u03d2', + 'upsi;': '\u03c5', + 'upsih;': '\u03d2', + 'Upsilon;': '\u03a5', + 'upsilon;': '\u03c5', + 'UpTee;': '\u22a5', + 'UpTeeArrow;': '\u21a5', + 'upuparrows;': '\u21c8', + 'urcorn;': '\u231d', + 'urcorner;': '\u231d', + 'urcrop;': '\u230e', + 'Uring;': '\u016e', + 'uring;': '\u016f', + 'urtri;': '\u25f9', + 'Uscr;': '\U0001d4b0', + 'uscr;': '\U0001d4ca', + 'utdot;': '\u22f0', + 'Utilde;': '\u0168', + 'utilde;': '\u0169', + 'utri;': '\u25b5', + 'utrif;': '\u25b4', + 'uuarr;': '\u21c8', + 'Uuml': '\xdc', + 'uuml': '\xfc', + 'Uuml;': '\xdc', + 'uuml;': '\xfc', + 'uwangle;': '\u29a7', + 'vangrt;': '\u299c', + 'varepsilon;': '\u03f5', + 'varkappa;': '\u03f0', + 'varnothing;': '\u2205', + 'varphi;': '\u03d5', + 'varpi;': '\u03d6', + 'varpropto;': '\u221d', + 'vArr;': '\u21d5', + 'varr;': '\u2195', + 'varrho;': '\u03f1', + 'varsigma;': '\u03c2', + 'varsubsetneq;': '\u228a\ufe00', + 'varsubsetneqq;': '\u2acb\ufe00', + 'varsupsetneq;': '\u228b\ufe00', + 'varsupsetneqq;': '\u2acc\ufe00', + 'vartheta;': '\u03d1', + 'vartriangleleft;': '\u22b2', + 'vartriangleright;': '\u22b3', + 'Vbar;': '\u2aeb', + 'vBar;': '\u2ae8', + 'vBarv;': '\u2ae9', + 'Vcy;': '\u0412', + 'vcy;': '\u0432', + 'VDash;': '\u22ab', + 'Vdash;': '\u22a9', + 'vDash;': '\u22a8', + 'vdash;': '\u22a2', + 'Vdashl;': '\u2ae6', + 'Vee;': '\u22c1', + 'vee;': '\u2228', + 'veebar;': '\u22bb', + 'veeeq;': '\u225a', + 'vellip;': '\u22ee', + 'Verbar;': '\u2016', + 'verbar;': '|', + 'Vert;': '\u2016', + 'vert;': '|', + 'VerticalBar;': '\u2223', + 'VerticalLine;': '|', + 'VerticalSeparator;': '\u2758', + 'VerticalTilde;': '\u2240', + 'VeryThinSpace;': '\u200a', + 'Vfr;': '\U0001d519', + 'vfr;': '\U0001d533', + 'vltri;': '\u22b2', + 'vnsub;': '\u2282\u20d2', + 'vnsup;': '\u2283\u20d2', + 'Vopf;': '\U0001d54d', + 'vopf;': '\U0001d567', + 'vprop;': '\u221d', + 'vrtri;': '\u22b3', + 'Vscr;': '\U0001d4b1', + 'vscr;': '\U0001d4cb', + 'vsubnE;': '\u2acb\ufe00', + 'vsubne;': '\u228a\ufe00', + 'vsupnE;': '\u2acc\ufe00', + 'vsupne;': '\u228b\ufe00', + 'Vvdash;': '\u22aa', + 'vzigzag;': '\u299a', + 'Wcirc;': '\u0174', + 'wcirc;': '\u0175', + 'wedbar;': '\u2a5f', + 'Wedge;': '\u22c0', + 'wedge;': '\u2227', + 'wedgeq;': '\u2259', + 'weierp;': '\u2118', + 'Wfr;': '\U0001d51a', + 'wfr;': '\U0001d534', + 'Wopf;': '\U0001d54e', + 'wopf;': '\U0001d568', + 'wp;': '\u2118', + 'wr;': '\u2240', + 'wreath;': '\u2240', + 'Wscr;': '\U0001d4b2', + 'wscr;': '\U0001d4cc', + 'xcap;': '\u22c2', + 'xcirc;': '\u25ef', + 'xcup;': '\u22c3', + 'xdtri;': '\u25bd', + 'Xfr;': '\U0001d51b', + 'xfr;': '\U0001d535', + 'xhArr;': '\u27fa', + 'xharr;': '\u27f7', + 'Xi;': '\u039e', + 'xi;': '\u03be', + 'xlArr;': '\u27f8', + 'xlarr;': '\u27f5', + 'xmap;': '\u27fc', + 'xnis;': '\u22fb', + 'xodot;': '\u2a00', + 'Xopf;': '\U0001d54f', + 'xopf;': '\U0001d569', + 'xoplus;': '\u2a01', + 'xotime;': '\u2a02', + 'xrArr;': '\u27f9', + 'xrarr;': '\u27f6', + 'Xscr;': '\U0001d4b3', + 'xscr;': '\U0001d4cd', + 'xsqcup;': '\u2a06', + 'xuplus;': '\u2a04', + 'xutri;': '\u25b3', + 'xvee;': '\u22c1', + 'xwedge;': '\u22c0', + 'Yacute': '\xdd', + 'yacute': '\xfd', + 'Yacute;': '\xdd', + 'yacute;': '\xfd', + 'YAcy;': '\u042f', + 'yacy;': '\u044f', + 'Ycirc;': '\u0176', + 'ycirc;': '\u0177', + 'Ycy;': '\u042b', + 'ycy;': '\u044b', + 'yen': '\xa5', + 'yen;': '\xa5', + 'Yfr;': '\U0001d51c', + 'yfr;': '\U0001d536', + 'YIcy;': '\u0407', + 'yicy;': '\u0457', + 'Yopf;': '\U0001d550', + 'yopf;': '\U0001d56a', + 'Yscr;': '\U0001d4b4', + 'yscr;': '\U0001d4ce', + 'YUcy;': '\u042e', + 'yucy;': '\u044e', + 'yuml': '\xff', + 'Yuml;': '\u0178', + 'yuml;': '\xff', + 'Zacute;': '\u0179', + 'zacute;': '\u017a', + 'Zcaron;': '\u017d', + 'zcaron;': '\u017e', + 'Zcy;': '\u0417', + 'zcy;': '\u0437', + 'Zdot;': '\u017b', + 'zdot;': '\u017c', + 'zeetrf;': '\u2128', + 'ZeroWidthSpace;': '\u200b', + 'Zeta;': '\u0396', + 'zeta;': '\u03b6', + 'Zfr;': '\u2128', + 'zfr;': '\U0001d537', + 'ZHcy;': '\u0416', + 'zhcy;': '\u0436', + 'zigrarr;': '\u21dd', + 'Zopf;': '\u2124', + 'zopf;': '\U0001d56b', + 'Zscr;': '\U0001d4b5', + 'zscr;': '\U0001d4cf', + 'zwj;': '\u200d', + 'zwnj;': '\u200c', +} + + +class EntitySubstitution(object): + """The ability to substitute XML or HTML entities for certain characters.""" + + def _populate_class_variables(): + """Initialize variables used by this class to manage the plethora of + HTML5 named entities. + + This function returns a 3-tuple containing two dictionaries + and a regular expression: + + unicode_to_name - A mapping of Unicode strings like "⦨" to + entity names like "angmsdaa". When a single Unicode string has + multiple entity names, we try to choose the most commonly-used + name. + + name_to_unicode: A mapping of entity names like "angmsdaa" to + Unicode strings like "⦨". + + named_entity_re: A regular expression matching (almost) any + Unicode string that corresponds to an HTML5 named entity. + """ + unicode_to_name = {} + name_to_unicode = {} + + short_entities = set() + long_entities_by_first_character = defaultdict(set) + + for name_with_semicolon, character in sorted(html5.items()): + # "It is intentional, for legacy compatibility, that many + # code points have multiple character reference names. For + # example, some appear both with and without the trailing + # semicolon, or with different capitalizations." + # - https://html.spec.whatwg.org/multipage/named-characters.html#named-character-references + # + # The parsers are in charge of handling (or not) character + # references with no trailing semicolon, so we remove the + # semicolon whenever it appears. + if name_with_semicolon.endswith(';'): + name = name_with_semicolon[:-1] + else: + name = name_with_semicolon + + # When parsing HTML, we want to recognize any known named + # entity and convert it to a sequence of Unicode + # characters. + if name not in name_to_unicode: + name_to_unicode[name] = character + + # When _generating_ HTML, we want to recognize special + # character sequences that _could_ be converted to named + # entities. + unicode_to_name[character] = name + + # We also need to build a regular expression that lets us + # _find_ those characters in output strings so we can + # replace them. + # + # This is tricky, for two reasons. + + if (len(character) == 1 and ord(character) < 128 + and character not in '<>&'): + # First, it would be annoying to turn single ASCII + # characters like | into named entities like + # |. The exceptions are <>&, which we _must_ + # turn into named entities to produce valid HTML. + continue + + if len(character) > 1 and all(ord(x) < 128 for x in character): + # We also do not want to turn _combinations_ of ASCII + # characters like 'fj' into named entities like 'fj', + # though that's more debateable. + continue + + # Second, some named entities have a Unicode value that's + # a subset of the Unicode value for some _other_ named + # entity. As an example, \u2267' is ≧, + # but '\u2267\u0338' is ≧̸. Our regular + # expression needs to match the first two characters of + # "\u2267\u0338foo", but only the first character of + # "\u2267foo". + # + # In this step, we build two sets of characters that + # _eventually_ need to go into the regular expression. But + # we won't know exactly what the regular expression needs + # to look like until we've gone through the entire list of + # named entities. + if len(character) == 1: + short_entities.add(character) + else: + long_entities_by_first_character[character[0]].add(character) + + # Now that we've been through the entire list of entities, we + # can create a regular expression that matches any of them. + particles = set() + for short in short_entities: + long_versions = long_entities_by_first_character[short] + if not long_versions: + particles.add(short) + else: + ignore = "".join([x[1] for x in long_versions]) + # This finds, e.g. \u2267 but only if it is _not_ + # followed by \u0338. + particles.add("%s(?![%s])" % (short, ignore)) + + for long_entities in list(long_entities_by_first_character.values()): + for long_entity in long_entities: + particles.add(long_entity) + + re_definition = "(%s)" % "|".join(particles) + + # If an entity shows up in both html5 and codepoint2name, it's + # likely that HTML5 gives it several different names, such as + # 'rsquo' and 'rsquor'. When converting Unicode characters to + # named entities, the codepoint2name name should take + # precedence where possible, since that's the more easily + # recognizable one. + for codepoint, name in list(codepoint2name.items()): + character = chr(codepoint) + unicode_to_name[character] = name + + return unicode_to_name, name_to_unicode, re.compile(re_definition) + (CHARACTER_TO_HTML_ENTITY, HTML_ENTITY_TO_CHARACTER, + CHARACTER_TO_HTML_ENTITY_RE) = _populate_class_variables() + + CHARACTER_TO_XML_ENTITY = { + "'": "apos", + '"': "quot", + "&": "amp", + "<": "lt", + ">": "gt", + } + + BARE_AMPERSAND_OR_BRACKET = re.compile("([<>]|" + "&(?!#\\d+;|#x[0-9a-fA-F]+;|\\w+;)" + ")") + + AMPERSAND_OR_BRACKET = re.compile("([<>&])") + + @classmethod + def _substitute_html_entity(cls, matchobj): + """Used with a regular expression to substitute the + appropriate HTML entity for a special character string.""" + entity = cls.CHARACTER_TO_HTML_ENTITY.get(matchobj.group(0)) + return "&%s;" % entity + + @classmethod + def _substitute_xml_entity(cls, matchobj): + """Used with a regular expression to substitute the + appropriate XML entity for a special character string.""" + entity = cls.CHARACTER_TO_XML_ENTITY[matchobj.group(0)] + return "&%s;" % entity + + @classmethod + def quoted_attribute_value(self, value): + """Make a value into a quoted XML attribute, possibly escaping it. + + Most strings will be quoted using double quotes. + + Bob's Bar -> "Bob's Bar" + + If a string contains double quotes, it will be quoted using + single quotes. + + Welcome to "my bar" -> 'Welcome to "my bar"' + + If a string contains both single and double quotes, the + double quotes will be escaped, and the string will be quoted + using double quotes. + + Welcome to "Bob's Bar" -> "Welcome to "Bob's bar" + """ + quote_with = '"' + if '"' in value: + if "'" in value: + # The string contains both single and double + # quotes. Turn the double quotes into + # entities. We quote the double quotes rather than + # the single quotes because the entity name is + # """ whether this is HTML or XML. If we + # quoted the single quotes, we'd have to decide + # between ' and &squot;. + replace_with = """ + value = value.replace('"', replace_with) + else: + # There are double quotes but no single quotes. + # We can use single quotes to quote the attribute. + quote_with = "'" + return quote_with + value + quote_with + + @classmethod + def substitute_xml(cls, value, make_quoted_attribute=False): + """Substitute XML entities for special XML characters. + + :param value: A string to be substituted. The less-than sign + will become <, the greater-than sign will become >, + and any ampersands will become &. If you want ampersands + that appear to be part of an entity definition to be left + alone, use substitute_xml_containing_entities() instead. + + :param make_quoted_attribute: If True, then the string will be + quoted, as befits an attribute value. + """ + # Escape angle brackets and ampersands. + value = cls.AMPERSAND_OR_BRACKET.sub( + cls._substitute_xml_entity, value) + + if make_quoted_attribute: + value = cls.quoted_attribute_value(value) + return value + + @classmethod + def substitute_xml_containing_entities( + cls, value, make_quoted_attribute=False): + """Substitute XML entities for special XML characters. + + :param value: A string to be substituted. The less-than sign will + become <, the greater-than sign will become >, and any + ampersands that are not part of an entity defition will + become &. + + :param make_quoted_attribute: If True, then the string will be + quoted, as befits an attribute value. + """ + # Escape angle brackets, and ampersands that aren't part of + # entities. + value = cls.BARE_AMPERSAND_OR_BRACKET.sub( + cls._substitute_xml_entity, value) + + if make_quoted_attribute: + value = cls.quoted_attribute_value(value) + return value + + @classmethod + def substitute_html(cls, s): + """Replace certain Unicode characters with named HTML entities. + + This differs from data.encode(encoding, 'xmlcharrefreplace') + in that the goal is to make the result more readable (to those + with ASCII displays) rather than to recover from + errors. There's absolutely nothing wrong with a UTF-8 string + containg a LATIN SMALL LETTER E WITH ACUTE, but replacing that + character with "é" will make it more readable to some + people. + + :param s: A Unicode string. + """ + return cls.CHARACTER_TO_HTML_ENTITY_RE.sub( + cls._substitute_html_entity, s) + + +class EncodingDetector: + """Suggests a number of possible encodings for a bytestring. + + Order of precedence: + + 1. Encodings you specifically tell EncodingDetector to try first + (the known_definite_encodings argument to the constructor). + + 2. An encoding determined by sniffing the document's byte-order mark. + + 3. Encodings you specifically tell EncodingDetector to try if + byte-order mark sniffing fails (the user_encodings argument to the + constructor). + + 4. An encoding declared within the bytestring itself, either in an + XML declaration (if the bytestring is to be interpreted as an XML + document), or in a tag (if the bytestring is to be + interpreted as an HTML document.) + + 5. An encoding detected through textual analysis by chardet, + cchardet, or a similar external library. + + 4. UTF-8. + + 5. Windows-1252. + + """ + def __init__(self, markup, known_definite_encodings=None, + is_html=False, exclude_encodings=None, + user_encodings=None, override_encodings=None): + """Constructor. + + :param markup: Some markup in an unknown encoding. + + :param known_definite_encodings: When determining the encoding + of `markup`, these encodings will be tried first, in + order. In HTML terms, this corresponds to the "known + definite encoding" step defined here: + https://html.spec.whatwg.org/multipage/parsing.html#parsing-with-a-known-character-encoding + + :param user_encodings: These encodings will be tried after the + `known_definite_encodings` have been tried and failed, and + after an attempt to sniff the encoding by looking at a + byte order mark has failed. In HTML terms, this + corresponds to the step "user has explicitly instructed + the user agent to override the document's character + encoding", defined here: + https://html.spec.whatwg.org/multipage/parsing.html#determining-the-character-encoding + + :param override_encodings: A deprecated alias for + known_definite_encodings. Any encodings here will be tried + immediately after the encodings in + known_definite_encodings. + + :param is_html: If True, this markup is considered to be + HTML. Otherwise it's assumed to be XML. + + :param exclude_encodings: These encodings will not be tried, + even if they otherwise would be. + + """ + self.known_definite_encodings = list(known_definite_encodings or []) + if override_encodings: + self.known_definite_encodings += override_encodings + self.user_encodings = user_encodings or [] + exclude_encodings = exclude_encodings or [] + self.exclude_encodings = set([x.lower() for x in exclude_encodings]) + self.chardet_encoding = None + self.is_html = is_html + self.declared_encoding = None + + # First order of business: strip a byte-order mark. + self.markup, self.sniffed_encoding = self.strip_byte_order_mark(markup) + + def _usable(self, encoding, tried): + """Should we even bother to try this encoding? + + :param encoding: Name of an encoding. + :param tried: Encodings that have already been tried. This will be modified + as a side effect. + """ + if encoding is not None: + encoding = encoding.lower() + if encoding in self.exclude_encodings: + return False + if encoding not in tried: + tried.add(encoding) + return True + return False + + @property + def encodings(self): + """Yield a number of encodings that might work for this markup. + + :yield: A sequence of strings. + """ + tried = set() + + # First, try the known definite encodings + for e in self.known_definite_encodings: + if self._usable(e, tried): + yield e + + # Did the document originally start with a byte-order mark + # that indicated its encoding? + if self._usable(self.sniffed_encoding, tried): + yield self.sniffed_encoding + + # Sniffing the byte-order mark did nothing; try the user + # encodings. + for e in self.user_encodings: + if self._usable(e, tried): + yield e + + # Look within the document for an XML or HTML encoding + # declaration. + if self.declared_encoding is None: + self.declared_encoding = self.find_declared_encoding( + self.markup, self.is_html) + if self._usable(self.declared_encoding, tried): + yield self.declared_encoding + + # Use third-party character set detection to guess at the + # encoding. + if self.chardet_encoding is None: + self.chardet_encoding = chardet_dammit(self.markup) + if self._usable(self.chardet_encoding, tried): + yield self.chardet_encoding + + # As a last-ditch effort, try utf-8 and windows-1252. + for e in ('utf-8', 'windows-1252'): + if self._usable(e, tried): + yield e + + @classmethod + def strip_byte_order_mark(cls, data): + """If a byte-order mark is present, strip it and return the encoding it implies. + + :param data: Some markup. + :return: A 2-tuple (modified data, implied encoding) + """ + encoding = None + if isinstance(data, str): + # Unicode data cannot have a byte-order mark. + return data, encoding + if (len(data) >= 4) and (data[:2] == b'\xfe\xff') \ + and (data[2:4] != '\x00\x00'): + encoding = 'utf-16be' + data = data[2:] + elif (len(data) >= 4) and (data[:2] == b'\xff\xfe') \ + and (data[2:4] != '\x00\x00'): + encoding = 'utf-16le' + data = data[2:] + elif data[:3] == b'\xef\xbb\xbf': + encoding = 'utf-8' + data = data[3:] + elif data[:4] == b'\x00\x00\xfe\xff': + encoding = 'utf-32be' + data = data[4:] + elif data[:4] == b'\xff\xfe\x00\x00': + encoding = 'utf-32le' + data = data[4:] + return data, encoding + + @classmethod + def find_declared_encoding(cls, markup, is_html=False, search_entire_document=False): + """Given a document, tries to find its declared encoding. + + An XML encoding is declared at the beginning of the document. + + An HTML encoding is declared in a tag, hopefully near the + beginning of the document. + + :param markup: Some markup. + :param is_html: If True, this markup is considered to be HTML. Otherwise + it's assumed to be XML. + :param search_entire_document: Since an encoding is supposed to declared near the beginning + of the document, most of the time it's only necessary to search a few kilobytes of data. + Set this to True to force this method to search the entire document. + """ + if search_entire_document: + xml_endpos = html_endpos = len(markup) + else: + xml_endpos = 1024 + html_endpos = max(2048, int(len(markup) * 0.05)) + + if isinstance(markup, bytes): + res = encoding_res[bytes] + else: + res = encoding_res[str] + + xml_re = res['xml'] + html_re = res['html'] + declared_encoding = None + declared_encoding_match = xml_re.search(markup, endpos=xml_endpos) + if not declared_encoding_match and is_html: + declared_encoding_match = html_re.search(markup, endpos=html_endpos) + if declared_encoding_match is not None: + declared_encoding = declared_encoding_match.groups()[0] + if declared_encoding: + if isinstance(declared_encoding, bytes): + declared_encoding = declared_encoding.decode('ascii', 'replace') + return declared_encoding.lower() + return None + +class UnicodeDammit: + """A class for detecting the encoding of a *ML document and + converting it to a Unicode string. If the source encoding is + windows-1252, can replace MS smart quotes with their HTML or XML + equivalents.""" + + # This dictionary maps commonly seen values for "charset" in HTML + # meta tags to the corresponding Python codec names. It only covers + # values that aren't in Python's aliases and can't be determined + # by the heuristics in find_codec. + CHARSET_ALIASES = {"macintosh": "mac-roman", + "x-sjis": "shift-jis"} + + ENCODINGS_WITH_SMART_QUOTES = [ + "windows-1252", + "iso-8859-1", + "iso-8859-2", + ] + + def __init__(self, markup, known_definite_encodings=[], + smart_quotes_to=None, is_html=False, exclude_encodings=[], + user_encodings=None, override_encodings=None + ): + """Constructor. + + :param markup: A bytestring representing markup in an unknown encoding. + + :param known_definite_encodings: When determining the encoding + of `markup`, these encodings will be tried first, in + order. In HTML terms, this corresponds to the "known + definite encoding" step defined here: + https://html.spec.whatwg.org/multipage/parsing.html#parsing-with-a-known-character-encoding + + :param user_encodings: These encodings will be tried after the + `known_definite_encodings` have been tried and failed, and + after an attempt to sniff the encoding by looking at a + byte order mark has failed. In HTML terms, this + corresponds to the step "user has explicitly instructed + the user agent to override the document's character + encoding", defined here: + https://html.spec.whatwg.org/multipage/parsing.html#determining-the-character-encoding + + :param override_encodings: A deprecated alias for + known_definite_encodings. Any encodings here will be tried + immediately after the encodings in + known_definite_encodings. + + :param smart_quotes_to: By default, Microsoft smart quotes will, like all other characters, be converted + to Unicode characters. Setting this to 'ascii' will convert them to ASCII quotes instead. + Setting it to 'xml' will convert them to XML entity references, and setting it to 'html' + will convert them to HTML entity references. + :param is_html: If True, this markup is considered to be HTML. Otherwise + it's assumed to be XML. + :param exclude_encodings: These encodings will not be considered, even + if the sniffing code thinks they might make sense. + + """ + self.smart_quotes_to = smart_quotes_to + self.tried_encodings = [] + self.contains_replacement_characters = False + self.is_html = is_html + self.log = logging.getLogger(__name__) + self.detector = EncodingDetector( + markup, known_definite_encodings, is_html, exclude_encodings, + user_encodings, override_encodings + ) + + # Short-circuit if the data is in Unicode to begin with. + if isinstance(markup, str) or markup == '': + self.markup = markup + self.unicode_markup = str(markup) + self.original_encoding = None + return + + # The encoding detector may have stripped a byte-order mark. + # Use the stripped markup from this point on. + self.markup = self.detector.markup + + u = None + for encoding in self.detector.encodings: + markup = self.detector.markup + u = self._convert_from(encoding) + if u is not None: + break + + if not u: + # None of the encodings worked. As an absolute last resort, + # try them again with character replacement. + + for encoding in self.detector.encodings: + if encoding != "ascii": + u = self._convert_from(encoding, "replace") + if u is not None: + self.log.warning( + "Some characters could not be decoded, and were " + "replaced with REPLACEMENT CHARACTER." + ) + self.contains_replacement_characters = True + break + + # If none of that worked, we could at this point force it to + # ASCII, but that would destroy so much data that I think + # giving up is better. + self.unicode_markup = u + if not u: + self.original_encoding = None + + def _sub_ms_char(self, match): + """Changes a MS smart quote character to an XML or HTML + entity, or an ASCII character.""" + orig = match.group(1) + if self.smart_quotes_to == 'ascii': + sub = self.MS_CHARS_TO_ASCII.get(orig).encode() + else: + sub = self.MS_CHARS.get(orig) + if type(sub) == tuple: + if self.smart_quotes_to == 'xml': + sub = '&#x'.encode() + sub[1].encode() + ';'.encode() + else: + sub = '&'.encode() + sub[0].encode() + ';'.encode() + else: + sub = sub.encode() + return sub + + def _convert_from(self, proposed, errors="strict"): + """Attempt to convert the markup to the proposed encoding. + + :param proposed: The name of a character encoding. + """ + proposed = self.find_codec(proposed) + if not proposed or (proposed, errors) in self.tried_encodings: + return None + self.tried_encodings.append((proposed, errors)) + markup = self.markup + # Convert smart quotes to HTML if coming from an encoding + # that might have them. + if (self.smart_quotes_to is not None + and proposed in self.ENCODINGS_WITH_SMART_QUOTES): + smart_quotes_re = b"([\x80-\x9f])" + smart_quotes_compiled = re.compile(smart_quotes_re) + markup = smart_quotes_compiled.sub(self._sub_ms_char, markup) + + try: + #print("Trying to convert document to %s (errors=%s)" % ( + # proposed, errors)) + u = self._to_unicode(markup, proposed, errors) + self.markup = u + self.original_encoding = proposed + except Exception as e: + #print("That didn't work!") + #print(e) + return None + #print("Correct encoding: %s" % proposed) + return self.markup + + def _to_unicode(self, data, encoding, errors="strict"): + """Given a string and its encoding, decodes the string into Unicode. + + :param encoding: The name of an encoding. + """ + return str(data, encoding, errors) + + @property + def declared_html_encoding(self): + """If the markup is an HTML document, returns the encoding declared _within_ + the document. + """ + if not self.is_html: + return None + return self.detector.declared_encoding + + def find_codec(self, charset): + """Convert the name of a character set to a codec name. + + :param charset: The name of a character set. + :return: The name of a codec. + """ + value = (self._codec(self.CHARSET_ALIASES.get(charset, charset)) + or (charset and self._codec(charset.replace("-", ""))) + or (charset and self._codec(charset.replace("-", "_"))) + or (charset and charset.lower()) + or charset + ) + if value: + return value.lower() + return None + + def _codec(self, charset): + if not charset: + return charset + codec = None + try: + codecs.lookup(charset) + codec = charset + except (LookupError, ValueError): + pass + return codec + + + # A partial mapping of ISO-Latin-1 to HTML entities/XML numeric entities. + MS_CHARS = {b'\x80': ('euro', '20AC'), + b'\x81': ' ', + b'\x82': ('sbquo', '201A'), + b'\x83': ('fnof', '192'), + b'\x84': ('bdquo', '201E'), + b'\x85': ('hellip', '2026'), + b'\x86': ('dagger', '2020'), + b'\x87': ('Dagger', '2021'), + b'\x88': ('circ', '2C6'), + b'\x89': ('permil', '2030'), + b'\x8A': ('Scaron', '160'), + b'\x8B': ('lsaquo', '2039'), + b'\x8C': ('OElig', '152'), + b'\x8D': '?', + b'\x8E': ('#x17D', '17D'), + b'\x8F': '?', + b'\x90': '?', + b'\x91': ('lsquo', '2018'), + b'\x92': ('rsquo', '2019'), + b'\x93': ('ldquo', '201C'), + b'\x94': ('rdquo', '201D'), + b'\x95': ('bull', '2022'), + b'\x96': ('ndash', '2013'), + b'\x97': ('mdash', '2014'), + b'\x98': ('tilde', '2DC'), + b'\x99': ('trade', '2122'), + b'\x9a': ('scaron', '161'), + b'\x9b': ('rsaquo', '203A'), + b'\x9c': ('oelig', '153'), + b'\x9d': '?', + b'\x9e': ('#x17E', '17E'), + b'\x9f': ('Yuml', ''),} + + # A parochial partial mapping of ISO-Latin-1 to ASCII. Contains + # horrors like stripping diacritical marks to turn á into a, but also + # contains non-horrors like turning “ into ". + MS_CHARS_TO_ASCII = { + b'\x80' : 'EUR', + b'\x81' : ' ', + b'\x82' : ',', + b'\x83' : 'f', + b'\x84' : ',,', + b'\x85' : '...', + b'\x86' : '+', + b'\x87' : '++', + b'\x88' : '^', + b'\x89' : '%', + b'\x8a' : 'S', + b'\x8b' : '<', + b'\x8c' : 'OE', + b'\x8d' : '?', + b'\x8e' : 'Z', + b'\x8f' : '?', + b'\x90' : '?', + b'\x91' : "'", + b'\x92' : "'", + b'\x93' : '"', + b'\x94' : '"', + b'\x95' : '*', + b'\x96' : '-', + b'\x97' : '--', + b'\x98' : '~', + b'\x99' : '(TM)', + b'\x9a' : 's', + b'\x9b' : '>', + b'\x9c' : 'oe', + b'\x9d' : '?', + b'\x9e' : 'z', + b'\x9f' : 'Y', + b'\xa0' : ' ', + b'\xa1' : '!', + b'\xa2' : 'c', + b'\xa3' : 'GBP', + b'\xa4' : '$', #This approximation is especially parochial--this is the + #generic currency symbol. + b'\xa5' : 'YEN', + b'\xa6' : '|', + b'\xa7' : 'S', + b'\xa8' : '..', + b'\xa9' : '', + b'\xaa' : '(th)', + b'\xab' : '<<', + b'\xac' : '!', + b'\xad' : ' ', + b'\xae' : '(R)', + b'\xaf' : '-', + b'\xb0' : 'o', + b'\xb1' : '+-', + b'\xb2' : '2', + b'\xb3' : '3', + b'\xb4' : ("'", 'acute'), + b'\xb5' : 'u', + b'\xb6' : 'P', + b'\xb7' : '*', + b'\xb8' : ',', + b'\xb9' : '1', + b'\xba' : '(th)', + b'\xbb' : '>>', + b'\xbc' : '1/4', + b'\xbd' : '1/2', + b'\xbe' : '3/4', + b'\xbf' : '?', + b'\xc0' : 'A', + b'\xc1' : 'A', + b'\xc2' : 'A', + b'\xc3' : 'A', + b'\xc4' : 'A', + b'\xc5' : 'A', + b'\xc6' : 'AE', + b'\xc7' : 'C', + b'\xc8' : 'E', + b'\xc9' : 'E', + b'\xca' : 'E', + b'\xcb' : 'E', + b'\xcc' : 'I', + b'\xcd' : 'I', + b'\xce' : 'I', + b'\xcf' : 'I', + b'\xd0' : 'D', + b'\xd1' : 'N', + b'\xd2' : 'O', + b'\xd3' : 'O', + b'\xd4' : 'O', + b'\xd5' : 'O', + b'\xd6' : 'O', + b'\xd7' : '*', + b'\xd8' : 'O', + b'\xd9' : 'U', + b'\xda' : 'U', + b'\xdb' : 'U', + b'\xdc' : 'U', + b'\xdd' : 'Y', + b'\xde' : 'b', + b'\xdf' : 'B', + b'\xe0' : 'a', + b'\xe1' : 'a', + b'\xe2' : 'a', + b'\xe3' : 'a', + b'\xe4' : 'a', + b'\xe5' : 'a', + b'\xe6' : 'ae', + b'\xe7' : 'c', + b'\xe8' : 'e', + b'\xe9' : 'e', + b'\xea' : 'e', + b'\xeb' : 'e', + b'\xec' : 'i', + b'\xed' : 'i', + b'\xee' : 'i', + b'\xef' : 'i', + b'\xf0' : 'o', + b'\xf1' : 'n', + b'\xf2' : 'o', + b'\xf3' : 'o', + b'\xf4' : 'o', + b'\xf5' : 'o', + b'\xf6' : 'o', + b'\xf7' : '/', + b'\xf8' : 'o', + b'\xf9' : 'u', + b'\xfa' : 'u', + b'\xfb' : 'u', + b'\xfc' : 'u', + b'\xfd' : 'y', + b'\xfe' : 'b', + b'\xff' : 'y', + } + + # A map used when removing rogue Windows-1252/ISO-8859-1 + # characters in otherwise UTF-8 documents. + # + # Note that \x81, \x8d, \x8f, \x90, and \x9d are undefined in + # Windows-1252. + WINDOWS_1252_TO_UTF8 = { + 0x80 : b'\xe2\x82\xac', # € + 0x82 : b'\xe2\x80\x9a', # ‚ + 0x83 : b'\xc6\x92', # Æ’ + 0x84 : b'\xe2\x80\x9e', # „ + 0x85 : b'\xe2\x80\xa6', # … + 0x86 : b'\xe2\x80\xa0', # † + 0x87 : b'\xe2\x80\xa1', # ‡ + 0x88 : b'\xcb\x86', # ˆ + 0x89 : b'\xe2\x80\xb0', # ‰ + 0x8a : b'\xc5\xa0', # Å  + 0x8b : b'\xe2\x80\xb9', # ‹ + 0x8c : b'\xc5\x92', # Å’ + 0x8e : b'\xc5\xbd', # Ž + 0x91 : b'\xe2\x80\x98', # ‘ + 0x92 : b'\xe2\x80\x99', # ’ + 0x93 : b'\xe2\x80\x9c', # “ + 0x94 : b'\xe2\x80\x9d', # †+ 0x95 : b'\xe2\x80\xa2', # • + 0x96 : b'\xe2\x80\x93', # – + 0x97 : b'\xe2\x80\x94', # — + 0x98 : b'\xcb\x9c', # Ëœ + 0x99 : b'\xe2\x84\xa2', # â„¢ + 0x9a : b'\xc5\xa1', # Å¡ + 0x9b : b'\xe2\x80\xba', # › + 0x9c : b'\xc5\x93', # Å“ + 0x9e : b'\xc5\xbe', # ž + 0x9f : b'\xc5\xb8', # Ÿ + 0xa0 : b'\xc2\xa0', #   + 0xa1 : b'\xc2\xa1', # ¡ + 0xa2 : b'\xc2\xa2', # ¢ + 0xa3 : b'\xc2\xa3', # £ + 0xa4 : b'\xc2\xa4', # ¤ + 0xa5 : b'\xc2\xa5', # Â¥ + 0xa6 : b'\xc2\xa6', # ¦ + 0xa7 : b'\xc2\xa7', # § + 0xa8 : b'\xc2\xa8', # ¨ + 0xa9 : b'\xc2\xa9', # © + 0xaa : b'\xc2\xaa', # ª + 0xab : b'\xc2\xab', # « + 0xac : b'\xc2\xac', # ¬ + 0xad : b'\xc2\xad', # ­ + 0xae : b'\xc2\xae', # ® + 0xaf : b'\xc2\xaf', # ¯ + 0xb0 : b'\xc2\xb0', # ° + 0xb1 : b'\xc2\xb1', # ± + 0xb2 : b'\xc2\xb2', # ² + 0xb3 : b'\xc2\xb3', # ³ + 0xb4 : b'\xc2\xb4', # ´ + 0xb5 : b'\xc2\xb5', # µ + 0xb6 : b'\xc2\xb6', # ¶ + 0xb7 : b'\xc2\xb7', # · + 0xb8 : b'\xc2\xb8', # ¸ + 0xb9 : b'\xc2\xb9', # ¹ + 0xba : b'\xc2\xba', # º + 0xbb : b'\xc2\xbb', # » + 0xbc : b'\xc2\xbc', # ¼ + 0xbd : b'\xc2\xbd', # ½ + 0xbe : b'\xc2\xbe', # ¾ + 0xbf : b'\xc2\xbf', # ¿ + 0xc0 : b'\xc3\x80', # À + 0xc1 : b'\xc3\x81', # à + 0xc2 : b'\xc3\x82', #  + 0xc3 : b'\xc3\x83', # à + 0xc4 : b'\xc3\x84', # Ä + 0xc5 : b'\xc3\x85', # Ã… + 0xc6 : b'\xc3\x86', # Æ + 0xc7 : b'\xc3\x87', # Ç + 0xc8 : b'\xc3\x88', # È + 0xc9 : b'\xc3\x89', # É + 0xca : b'\xc3\x8a', # Ê + 0xcb : b'\xc3\x8b', # Ë + 0xcc : b'\xc3\x8c', # ÃŒ + 0xcd : b'\xc3\x8d', # à + 0xce : b'\xc3\x8e', # ÃŽ + 0xcf : b'\xc3\x8f', # à + 0xd0 : b'\xc3\x90', # à + 0xd1 : b'\xc3\x91', # Ñ + 0xd2 : b'\xc3\x92', # Ã’ + 0xd3 : b'\xc3\x93', # Ó + 0xd4 : b'\xc3\x94', # Ô + 0xd5 : b'\xc3\x95', # Õ + 0xd6 : b'\xc3\x96', # Ö + 0xd7 : b'\xc3\x97', # × + 0xd8 : b'\xc3\x98', # Ø + 0xd9 : b'\xc3\x99', # Ù + 0xda : b'\xc3\x9a', # Ú + 0xdb : b'\xc3\x9b', # Û + 0xdc : b'\xc3\x9c', # Ãœ + 0xdd : b'\xc3\x9d', # à + 0xde : b'\xc3\x9e', # Þ + 0xdf : b'\xc3\x9f', # ß + 0xe0 : b'\xc3\xa0', # à + 0xe1 : b'\xa1', # á + 0xe2 : b'\xc3\xa2', # â + 0xe3 : b'\xc3\xa3', # ã + 0xe4 : b'\xc3\xa4', # ä + 0xe5 : b'\xc3\xa5', # Ã¥ + 0xe6 : b'\xc3\xa6', # æ + 0xe7 : b'\xc3\xa7', # ç + 0xe8 : b'\xc3\xa8', # è + 0xe9 : b'\xc3\xa9', # é + 0xea : b'\xc3\xaa', # ê + 0xeb : b'\xc3\xab', # ë + 0xec : b'\xc3\xac', # ì + 0xed : b'\xc3\xad', # í + 0xee : b'\xc3\xae', # î + 0xef : b'\xc3\xaf', # ï + 0xf0 : b'\xc3\xb0', # ð + 0xf1 : b'\xc3\xb1', # ñ + 0xf2 : b'\xc3\xb2', # ò + 0xf3 : b'\xc3\xb3', # ó + 0xf4 : b'\xc3\xb4', # ô + 0xf5 : b'\xc3\xb5', # õ + 0xf6 : b'\xc3\xb6', # ö + 0xf7 : b'\xc3\xb7', # ÷ + 0xf8 : b'\xc3\xb8', # ø + 0xf9 : b'\xc3\xb9', # ù + 0xfa : b'\xc3\xba', # ú + 0xfb : b'\xc3\xbb', # û + 0xfc : b'\xc3\xbc', # ü + 0xfd : b'\xc3\xbd', # ý + 0xfe : b'\xc3\xbe', # þ + } + + MULTIBYTE_MARKERS_AND_SIZES = [ + (0xc2, 0xdf, 2), # 2-byte characters start with a byte C2-DF + (0xe0, 0xef, 3), # 3-byte characters start with E0-EF + (0xf0, 0xf4, 4), # 4-byte characters start with F0-F4 + ] + + FIRST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[0][0] + LAST_MULTIBYTE_MARKER = MULTIBYTE_MARKERS_AND_SIZES[-1][1] + + @classmethod + def detwingle(cls, in_bytes, main_encoding="utf8", + embedded_encoding="windows-1252"): + """Fix characters from one encoding embedded in some other encoding. + + Currently the only situation supported is Windows-1252 (or its + subset ISO-8859-1), embedded in UTF-8. + + :param in_bytes: A bytestring that you suspect contains + characters from multiple encodings. Note that this _must_ + be a bytestring. If you've already converted the document + to Unicode, you're too late. + :param main_encoding: The primary encoding of `in_bytes`. + :param embedded_encoding: The encoding that was used to embed characters + in the main document. + :return: A bytestring in which `embedded_encoding` + characters have been converted to their `main_encoding` + equivalents. + """ + if embedded_encoding.replace('_', '-').lower() not in ( + 'windows-1252', 'windows_1252'): + raise NotImplementedError( + "Windows-1252 and ISO-8859-1 are the only currently supported " + "embedded encodings.") + + if main_encoding.lower() not in ('utf8', 'utf-8'): + raise NotImplementedError( + "UTF-8 is the only currently supported main encoding.") + + byte_chunks = [] + + chunk_start = 0 + pos = 0 + while pos < len(in_bytes): + byte = in_bytes[pos] + if not isinstance(byte, int): + # Python 2.x + byte = ord(byte) + if (byte >= cls.FIRST_MULTIBYTE_MARKER + and byte <= cls.LAST_MULTIBYTE_MARKER): + # This is the start of a UTF-8 multibyte character. Skip + # to the end. + for start, end, size in cls.MULTIBYTE_MARKERS_AND_SIZES: + if byte >= start and byte <= end: + pos += size + break + elif byte >= 0x80 and byte in cls.WINDOWS_1252_TO_UTF8: + # We found a Windows-1252 character! + # Save the string up to this point as a chunk. + byte_chunks.append(in_bytes[chunk_start:pos]) + + # Now translate the Windows-1252 character into UTF-8 + # and add it as another, one-byte chunk. + byte_chunks.append(cls.WINDOWS_1252_TO_UTF8[byte]) + pos += 1 + chunk_start = pos + else: + # Go on to the next character. + pos += 1 + if chunk_start == 0: + # The string is unchanged. + return in_bytes + else: + # Store the final chunk. + byte_chunks.append(in_bytes[chunk_start:]) + return b''.join(byte_chunks) + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/diagnose.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/diagnose.py new file mode 100644 index 00000000..500e92df --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/diagnose.py @@ -0,0 +1,242 @@ +"""Diagnostic functions, mainly for use when doing tech support.""" + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +import cProfile +from io import StringIO +from html.parser import HTMLParser +import bs4 +from bs4 import BeautifulSoup, __version__ +from bs4.builder import builder_registry + +import os +import pstats +import random +import tempfile +import time +import traceback +import sys +import cProfile + +def diagnose(data): + """Diagnostic suite for isolating common problems. + + :param data: A string containing markup that needs to be explained. + :return: None; diagnostics are printed to standard output. + """ + print(("Diagnostic running on Beautiful Soup %s" % __version__)) + print(("Python version %s" % sys.version)) + + basic_parsers = ["html.parser", "html5lib", "lxml"] + for name in basic_parsers: + for builder in builder_registry.builders: + if name in builder.features: + break + else: + basic_parsers.remove(name) + print(( + "I noticed that %s is not installed. Installing it may help." % + name)) + + if 'lxml' in basic_parsers: + basic_parsers.append("lxml-xml") + try: + from lxml import etree + print(("Found lxml version %s" % ".".join(map(str,etree.LXML_VERSION)))) + except ImportError as e: + print( + "lxml is not installed or couldn't be imported.") + + + if 'html5lib' in basic_parsers: + try: + import html5lib + print(("Found html5lib version %s" % html5lib.__version__)) + except ImportError as e: + print( + "html5lib is not installed or couldn't be imported.") + + if hasattr(data, 'read'): + data = data.read() + elif data.startswith("http:") or data.startswith("https:"): + print(('"%s" looks like a URL. Beautiful Soup is not an HTTP client.' % data)) + print("You need to use some other library to get the document behind the URL, and feed that document to Beautiful Soup.") + return + else: + try: + if os.path.exists(data): + print(('"%s" looks like a filename. Reading data from the file.' % data)) + with open(data) as fp: + data = fp.read() + except ValueError: + # This can happen on some platforms when the 'filename' is + # too long. Assume it's data and not a filename. + pass + print("") + + for parser in basic_parsers: + print(("Trying to parse your markup with %s" % parser)) + success = False + try: + soup = BeautifulSoup(data, features=parser) + success = True + except Exception as e: + print(("%s could not parse the markup." % parser)) + traceback.print_exc() + if success: + print(("Here's what %s did with the markup:" % parser)) + print((soup.prettify())) + + print(("-" * 80)) + +def lxml_trace(data, html=True, **kwargs): + """Print out the lxml events that occur during parsing. + + This lets you see how lxml parses a document when no Beautiful + Soup code is running. You can use this to determine whether + an lxml-specific problem is in Beautiful Soup's lxml tree builders + or in lxml itself. + + :param data: Some markup. + :param html: If True, markup will be parsed with lxml's HTML parser. + if False, lxml's XML parser will be used. + """ + from lxml import etree + for event, element in etree.iterparse(StringIO(data), html=html, **kwargs): + print(("%s, %4s, %s" % (event, element.tag, element.text))) + +class AnnouncingParser(HTMLParser): + """Subclass of HTMLParser that announces parse events, without doing + anything else. + + You can use this to get a picture of how html.parser sees a given + document. The easiest way to do this is to call `htmlparser_trace`. + """ + + def _p(self, s): + print(s) + + def handle_starttag(self, name, attrs): + self._p("%s START" % name) + + def handle_endtag(self, name): + self._p("%s END" % name) + + def handle_data(self, data): + self._p("%s DATA" % data) + + def handle_charref(self, name): + self._p("%s CHARREF" % name) + + def handle_entityref(self, name): + self._p("%s ENTITYREF" % name) + + def handle_comment(self, data): + self._p("%s COMMENT" % data) + + def handle_decl(self, data): + self._p("%s DECL" % data) + + def unknown_decl(self, data): + self._p("%s UNKNOWN-DECL" % data) + + def handle_pi(self, data): + self._p("%s PI" % data) + +def htmlparser_trace(data): + """Print out the HTMLParser events that occur during parsing. + + This lets you see how HTMLParser parses a document when no + Beautiful Soup code is running. + + :param data: Some markup. + """ + parser = AnnouncingParser() + parser.feed(data) + +_vowels = "aeiou" +_consonants = "bcdfghjklmnpqrstvwxyz" + +def rword(length=5): + "Generate a random word-like string." + s = '' + for i in range(length): + if i % 2 == 0: + t = _consonants + else: + t = _vowels + s += random.choice(t) + return s + +def rsentence(length=4): + "Generate a random sentence-like string." + return " ".join(rword(random.randint(4,9)) for i in range(length)) + +def rdoc(num_elements=1000): + """Randomly generate an invalid HTML document.""" + tag_names = ['p', 'div', 'span', 'i', 'b', 'script', 'table'] + elements = [] + for i in range(num_elements): + choice = random.randint(0,3) + if choice == 0: + # New tag. + tag_name = random.choice(tag_names) + elements.append("<%s>" % tag_name) + elif choice == 1: + elements.append(rsentence(random.randint(1,4))) + elif choice == 2: + # Close a tag. + tag_name = random.choice(tag_names) + elements.append("" % tag_name) + return "" + "\n".join(elements) + "" + +def benchmark_parsers(num_elements=100000): + """Very basic head-to-head performance benchmark.""" + print(("Comparative parser benchmark on Beautiful Soup %s" % __version__)) + data = rdoc(num_elements) + print(("Generated a large invalid HTML document (%d bytes)." % len(data))) + + for parser in ["lxml", ["lxml", "html"], "html5lib", "html.parser"]: + success = False + try: + a = time.time() + soup = BeautifulSoup(data, parser) + b = time.time() + success = True + except Exception as e: + print(("%s could not parse the markup." % parser)) + traceback.print_exc() + if success: + print(("BS4+%s parsed the markup in %.2fs." % (parser, b-a))) + + from lxml import etree + a = time.time() + etree.HTML(data) + b = time.time() + print(("Raw lxml parsed the markup in %.2fs." % (b-a))) + + import html5lib + parser = html5lib.HTMLParser() + a = time.time() + parser.parse(data) + b = time.time() + print(("Raw html5lib parsed the markup in %.2fs." % (b-a))) + +def profile(num_elements=100000, parser="lxml"): + """Use Python's profiler on a randomly generated document.""" + filehandle = tempfile.NamedTemporaryFile() + filename = filehandle.name + + data = rdoc(num_elements) + vars = dict(bs4=bs4, data=data, parser=parser) + cProfile.runctx('bs4.BeautifulSoup(data, parser)' , vars, vars, filename) + + stats = pstats.Stats(filename) + # stats.strip_dirs() + stats.sort_stats("cumulative") + stats.print_stats('_html5lib|bs4', 50) + +# If this file is run as a script, standard input is diagnosed. +if __name__ == '__main__': + diagnose(sys.stdin.read()) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/element.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/element.py new file mode 100644 index 00000000..82a986e4 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/element.py @@ -0,0 +1,2255 @@ +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +try: + from collections.abc import Callable # Python 3.6 +except ImportError as e: + from collections import Callable +import re +import sys +import warnings +try: + import soupsieve +except ImportError as e: + soupsieve = None + warnings.warn( + 'The soupsieve package is not installed. CSS selectors cannot be used.' + ) + +from bs4.formatter import ( + Formatter, + HTMLFormatter, + XMLFormatter, +) + +DEFAULT_OUTPUT_ENCODING = "utf-8" +PY3K = (sys.version_info[0] > 2) + +nonwhitespace_re = re.compile(r"\S+") + +# NOTE: This isn't used as of 4.7.0. I'm leaving it for a little bit on +# the off chance someone imported it for their own use. +whitespace_re = re.compile(r"\s+") + +def _alias(attr): + """Alias one attribute name to another for backward compatibility""" + @property + def alias(self): + return getattr(self, attr) + + @alias.setter + def alias(self): + return setattr(self, attr) + return alias + + +# These encodings are recognized by Python (so PageElement.encode +# could theoretically support them) but XML and HTML don't recognize +# them (so they should not show up in an XML or HTML document as that +# document's encoding). +# +# If an XML document is encoded in one of these encodings, no encoding +# will be mentioned in the XML declaration. If an HTML document is +# encoded in one of these encodings, and the HTML document has a +# tag that mentions an encoding, the encoding will be given as +# the empty string. +# +# Source: +# https://docs.python.org/3/library/codecs.html#python-specific-encodings +PYTHON_SPECIFIC_ENCODINGS = set([ + "idna", + "mbcs", + "oem", + "palmos", + "punycode", + "raw_unicode_escape", + "undefined", + "unicode_escape", + "raw-unicode-escape", + "unicode-escape", + "string-escape", + "string_escape", +]) + + +class NamespacedAttribute(str): + """A namespaced string (e.g. 'xml:lang') that remembers the namespace + ('xml') and the name ('lang') that were used to create it. + """ + + def __new__(cls, prefix, name=None, namespace=None): + if not name: + # This is the default namespace. Its name "has no value" + # per https://www.w3.org/TR/xml-names/#defaulting + name = None + + if not name: + obj = str.__new__(cls, prefix) + elif not prefix: + # Not really namespaced. + obj = str.__new__(cls, name) + else: + obj = str.__new__(cls, prefix + ":" + name) + obj.prefix = prefix + obj.name = name + obj.namespace = namespace + return obj + +class AttributeValueWithCharsetSubstitution(str): + """A stand-in object for a character encoding specified in HTML.""" + +class CharsetMetaAttributeValue(AttributeValueWithCharsetSubstitution): + """A generic stand-in for the value of a meta tag's 'charset' attribute. + + When Beautiful Soup parses the markup '', the + value of the 'charset' attribute will be one of these objects. + """ + + def __new__(cls, original_value): + obj = str.__new__(cls, original_value) + obj.original_value = original_value + return obj + + def encode(self, encoding): + """When an HTML document is being encoded to a given encoding, the + value of a meta tag's 'charset' is the name of the encoding. + """ + if encoding in PYTHON_SPECIFIC_ENCODINGS: + return '' + return encoding + + +class ContentMetaAttributeValue(AttributeValueWithCharsetSubstitution): + """A generic stand-in for the value of a meta tag's 'content' attribute. + + When Beautiful Soup parses the markup: + + + The value of the 'content' attribute will be one of these objects. + """ + + CHARSET_RE = re.compile(r"((^|;)\s*charset=)([^;]*)", re.M) + + def __new__(cls, original_value): + match = cls.CHARSET_RE.search(original_value) + if match is None: + # No substitution necessary. + return str.__new__(str, original_value) + + obj = str.__new__(cls, original_value) + obj.original_value = original_value + return obj + + def encode(self, encoding): + if encoding in PYTHON_SPECIFIC_ENCODINGS: + return '' + def rewrite(match): + return match.group(1) + encoding + return self.CHARSET_RE.sub(rewrite, self.original_value) + + +class PageElement(object): + """Contains the navigational information for some part of the page: + that is, its current location in the parse tree. + + NavigableString, Tag, etc. are all subclasses of PageElement. + """ + + def setup(self, parent=None, previous_element=None, next_element=None, + previous_sibling=None, next_sibling=None): + """Sets up the initial relations between this element and + other elements. + + :param parent: The parent of this element. + + :param previous_element: The element parsed immediately before + this one. + + :param next_element: The element parsed immediately before + this one. + + :param previous_sibling: The most recently encountered element + on the same level of the parse tree as this one. + + :param previous_sibling: The next element to be encountered + on the same level of the parse tree as this one. + """ + self.parent = parent + + self.previous_element = previous_element + if previous_element is not None: + self.previous_element.next_element = self + + self.next_element = next_element + if self.next_element is not None: + self.next_element.previous_element = self + + self.next_sibling = next_sibling + if self.next_sibling is not None: + self.next_sibling.previous_sibling = self + + if (previous_sibling is None + and self.parent is not None and self.parent.contents): + previous_sibling = self.parent.contents[-1] + + self.previous_sibling = previous_sibling + if previous_sibling is not None: + self.previous_sibling.next_sibling = self + + def format_string(self, s, formatter): + """Format the given string using the given formatter. + + :param s: A string. + :param formatter: A Formatter object, or a string naming one of the standard formatters. + """ + if formatter is None: + return s + if not isinstance(formatter, Formatter): + formatter = self.formatter_for_name(formatter) + output = formatter.substitute(s) + return output + + def formatter_for_name(self, formatter): + """Look up or create a Formatter for the given identifier, + if necessary. + + :param formatter: Can be a Formatter object (used as-is), a + function (used as the entity substitution hook for an + XMLFormatter or HTMLFormatter), or a string (used to look + up an XMLFormatter or HTMLFormatter in the appropriate + registry. + """ + if isinstance(formatter, Formatter): + return formatter + if self._is_xml: + c = XMLFormatter + else: + c = HTMLFormatter + if isinstance(formatter, Callable): + return c(entity_substitution=formatter) + return c.REGISTRY[formatter] + + @property + def _is_xml(self): + """Is this element part of an XML tree or an HTML tree? + + This is used in formatter_for_name, when deciding whether an + XMLFormatter or HTMLFormatter is more appropriate. It can be + inefficient, but it should be called very rarely. + """ + if self.known_xml is not None: + # Most of the time we will have determined this when the + # document is parsed. + return self.known_xml + + # Otherwise, it's likely that this element was created by + # direct invocation of the constructor from within the user's + # Python code. + if self.parent is None: + # This is the top-level object. It should have .known_xml set + # from tree creation. If not, take a guess--BS is usually + # used on HTML markup. + return getattr(self, 'is_xml', False) + return self.parent._is_xml + + nextSibling = _alias("next_sibling") # BS3 + previousSibling = _alias("previous_sibling") # BS3 + + default = object() + def _all_strings(self, strip=False, types=default): + """Yield all strings of certain classes, possibly stripping them. + + This is implemented differently in Tag and NavigableString. + """ + raise NotImplementedError() + + @property + def stripped_strings(self): + """Yield all strings in this PageElement, stripping them first. + + :yield: A sequence of stripped strings. + """ + for string in self._all_strings(True): + yield string + + def get_text(self, separator="", strip=False, + types=default): + """Get all child strings of this PageElement, concatenated using the + given separator. + + :param separator: Strings will be concatenated using this separator. + + :param strip: If True, strings will be stripped before being + concatenated. + + :param types: A tuple of NavigableString subclasses. Any + strings of a subclass not found in this list will be + ignored. Although there are exceptions, the default + behavior in most cases is to consider only NavigableString + and CData objects. That means no comments, processing + instructions, etc. + + :return: A string. + """ + return separator.join([s for s in self._all_strings( + strip, types=types)]) + getText = get_text + text = property(get_text) + + def replace_with(self, *args): + """Replace this PageElement with one or more PageElements, keeping the + rest of the tree the same. + + :param args: One or more PageElements. + :return: `self`, no longer part of the tree. + """ + if self.parent is None: + raise ValueError( + "Cannot replace one element with another when the " + "element to be replaced is not part of a tree.") + if len(args) == 1 and args[0] is self: + return + if any(x is self.parent for x in args): + raise ValueError("Cannot replace a Tag with its parent.") + old_parent = self.parent + my_index = self.parent.index(self) + self.extract(_self_index=my_index) + for idx, replace_with in enumerate(args, start=my_index): + old_parent.insert(idx, replace_with) + return self + replaceWith = replace_with # BS3 + + def unwrap(self): + """Replace this PageElement with its contents. + + :return: `self`, no longer part of the tree. + """ + my_parent = self.parent + if self.parent is None: + raise ValueError( + "Cannot replace an element with its contents when that" + "element is not part of a tree.") + my_index = self.parent.index(self) + self.extract(_self_index=my_index) + for child in reversed(self.contents[:]): + my_parent.insert(my_index, child) + return self + replace_with_children = unwrap + replaceWithChildren = unwrap # BS3 + + def wrap(self, wrap_inside): + """Wrap this PageElement inside another one. + + :param wrap_inside: A PageElement. + :return: `wrap_inside`, occupying the position in the tree that used + to be occupied by `self`, and with `self` inside it. + """ + me = self.replace_with(wrap_inside) + wrap_inside.append(me) + return wrap_inside + + def extract(self, _self_index=None): + """Destructively rips this element out of the tree. + + :param _self_index: The location of this element in its parent's + .contents, if known. Passing this in allows for a performance + optimization. + + :return: `self`, no longer part of the tree. + """ + if self.parent is not None: + if _self_index is None: + _self_index = self.parent.index(self) + del self.parent.contents[_self_index] + + #Find the two elements that would be next to each other if + #this element (and any children) hadn't been parsed. Connect + #the two. + last_child = self._last_descendant() + next_element = last_child.next_element + + if (self.previous_element is not None and + self.previous_element is not next_element): + self.previous_element.next_element = next_element + if next_element is not None and next_element is not self.previous_element: + next_element.previous_element = self.previous_element + self.previous_element = None + last_child.next_element = None + + self.parent = None + if (self.previous_sibling is not None + and self.previous_sibling is not self.next_sibling): + self.previous_sibling.next_sibling = self.next_sibling + if (self.next_sibling is not None + and self.next_sibling is not self.previous_sibling): + self.next_sibling.previous_sibling = self.previous_sibling + self.previous_sibling = self.next_sibling = None + return self + + def _last_descendant(self, is_initialized=True, accept_self=True): + """Finds the last element beneath this object to be parsed. + + :param is_initialized: Has `setup` been called on this PageElement + yet? + :param accept_self: Is `self` an acceptable answer to the question? + """ + if is_initialized and self.next_sibling is not None: + last_child = self.next_sibling.previous_element + else: + last_child = self + while isinstance(last_child, Tag) and last_child.contents: + last_child = last_child.contents[-1] + if not accept_self and last_child is self: + last_child = None + return last_child + # BS3: Not part of the API! + _lastRecursiveChild = _last_descendant + + def insert(self, position, new_child): + """Insert a new PageElement in the list of this PageElement's children. + + This works the same way as `list.insert`. + + :param position: The numeric position that should be occupied + in `self.children` by the new PageElement. + :param new_child: A PageElement. + """ + if new_child is None: + raise ValueError("Cannot insert None into a tag.") + if new_child is self: + raise ValueError("Cannot insert a tag into itself.") + if (isinstance(new_child, str) + and not isinstance(new_child, NavigableString)): + new_child = NavigableString(new_child) + + from bs4 import BeautifulSoup + if isinstance(new_child, BeautifulSoup): + # We don't want to end up with a situation where one BeautifulSoup + # object contains another. Insert the children one at a time. + for subchild in list(new_child.contents): + self.insert(position, subchild) + position += 1 + return + position = min(position, len(self.contents)) + if hasattr(new_child, 'parent') and new_child.parent is not None: + # We're 'inserting' an element that's already one + # of this object's children. + if new_child.parent is self: + current_index = self.index(new_child) + if current_index < position: + # We're moving this element further down the list + # of this object's children. That means that when + # we extract this element, our target index will + # jump down one. + position -= 1 + new_child.extract() + + new_child.parent = self + previous_child = None + if position == 0: + new_child.previous_sibling = None + new_child.previous_element = self + else: + previous_child = self.contents[position - 1] + new_child.previous_sibling = previous_child + new_child.previous_sibling.next_sibling = new_child + new_child.previous_element = previous_child._last_descendant(False) + if new_child.previous_element is not None: + new_child.previous_element.next_element = new_child + + new_childs_last_element = new_child._last_descendant(False) + + if position >= len(self.contents): + new_child.next_sibling = None + + parent = self + parents_next_sibling = None + while parents_next_sibling is None and parent is not None: + parents_next_sibling = parent.next_sibling + parent = parent.parent + if parents_next_sibling is not None: + # We found the element that comes next in the document. + break + if parents_next_sibling is not None: + new_childs_last_element.next_element = parents_next_sibling + else: + # The last element of this tag is the last element in + # the document. + new_childs_last_element.next_element = None + else: + next_child = self.contents[position] + new_child.next_sibling = next_child + if new_child.next_sibling is not None: + new_child.next_sibling.previous_sibling = new_child + new_childs_last_element.next_element = next_child + + if new_childs_last_element.next_element is not None: + new_childs_last_element.next_element.previous_element = new_childs_last_element + self.contents.insert(position, new_child) + + def append(self, tag): + """Appends the given PageElement to the contents of this one. + + :param tag: A PageElement. + """ + self.insert(len(self.contents), tag) + + def extend(self, tags): + """Appends the given PageElements to this one's contents. + + :param tags: A list of PageElements. + """ + if isinstance(tags, Tag): + # Calling self.append() on another tag's contents will change + # the list we're iterating over. Make a list that won't + # change. + tags = list(tags.contents) + for tag in tags: + self.append(tag) + + def insert_before(self, *args): + """Makes the given element(s) the immediate predecessor of this one. + + All the elements will have the same parent, and the given elements + will be immediately before this one. + + :param args: One or more PageElements. + """ + parent = self.parent + if parent is None: + raise ValueError( + "Element has no parent, so 'before' has no meaning.") + if any(x is self for x in args): + raise ValueError("Can't insert an element before itself.") + for predecessor in args: + # Extract first so that the index won't be screwed up if they + # are siblings. + if isinstance(predecessor, PageElement): + predecessor.extract() + index = parent.index(self) + parent.insert(index, predecessor) + + def insert_after(self, *args): + """Makes the given element(s) the immediate successor of this one. + + The elements will have the same parent, and the given elements + will be immediately after this one. + + :param args: One or more PageElements. + """ + # Do all error checking before modifying the tree. + parent = self.parent + if parent is None: + raise ValueError( + "Element has no parent, so 'after' has no meaning.") + if any(x is self for x in args): + raise ValueError("Can't insert an element after itself.") + + offset = 0 + for successor in args: + # Extract first so that the index won't be screwed up if they + # are siblings. + if isinstance(successor, PageElement): + successor.extract() + index = parent.index(self) + parent.insert(index+1+offset, successor) + offset += 1 + + def find_next(self, name=None, attrs={}, text=None, **kwargs): + """Find the first PageElement that matches the given criteria and + appears later in the document than this PageElement. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_all_next, name, attrs, text, **kwargs) + findNext = find_next # BS3 + + def find_all_next(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Find all PageElements that match the given criteria and appear + later in the document than this PageElement. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet containing PageElements. + """ + return self._find_all(name, attrs, text, limit, self.next_elements, + **kwargs) + findAllNext = find_all_next # BS3 + + def find_next_sibling(self, name=None, attrs={}, text=None, **kwargs): + """Find the closest sibling to this PageElement that matches the + given criteria and appears later in the document. + + All find_* methods take a common set of arguments. See the + online documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_next_siblings, name, attrs, text, + **kwargs) + findNextSibling = find_next_sibling # BS3 + + def find_next_siblings(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Find all siblings of this PageElement that match the given criteria + and appear later in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + return self._find_all(name, attrs, text, limit, + self.next_siblings, **kwargs) + findNextSiblings = find_next_siblings # BS3 + fetchNextSiblings = find_next_siblings # BS2 + + def find_previous(self, name=None, attrs={}, text=None, **kwargs): + """Look backwards in the document from this PageElement and find the + first PageElement that matches the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one( + self.find_all_previous, name, attrs, text, **kwargs) + findPrevious = find_previous # BS3 + + def find_all_previous(self, name=None, attrs={}, text=None, limit=None, + **kwargs): + """Look backwards in the document from this PageElement and find all + PageElements that match the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + return self._find_all(name, attrs, text, limit, self.previous_elements, + **kwargs) + findAllPrevious = find_all_previous # BS3 + fetchPrevious = find_all_previous # BS2 + + def find_previous_sibling(self, name=None, attrs={}, text=None, **kwargs): + """Returns the closest sibling to this PageElement that matches the + given criteria and appears earlier in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :kwargs: A dictionary of filters on attribute values. + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_one(self.find_previous_siblings, name, attrs, text, + **kwargs) + findPreviousSibling = find_previous_sibling # BS3 + + def find_previous_siblings(self, name=None, attrs={}, text=None, + limit=None, **kwargs): + """Returns all siblings to this PageElement that match the + given criteria and appear earlier in the document. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param text: A filter for a NavigableString with specific text. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + :return: A ResultSet of PageElements. + :rtype: bs4.element.ResultSet + """ + return self._find_all(name, attrs, text, limit, + self.previous_siblings, **kwargs) + findPreviousSiblings = find_previous_siblings # BS3 + fetchPreviousSiblings = find_previous_siblings # BS2 + + def find_parent(self, name=None, attrs={}, **kwargs): + """Find the closest parent of this PageElement that matches the given + criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :kwargs: A dictionary of filters on attribute values. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + # NOTE: We can't use _find_one because findParents takes a different + # set of arguments. + r = None + l = self.find_parents(name, attrs, 1, **kwargs) + if l: + r = l[0] + return r + findParent = find_parent # BS3 + + def find_parents(self, name=None, attrs={}, limit=None, **kwargs): + """Find all parents of this PageElement that match the given criteria. + + All find_* methods take a common set of arguments. See the online + documentation for detailed explanations. + + :param name: A filter on tag name. + :param attrs: A dictionary of filters on attribute values. + :param limit: Stop looking after finding this many results. + :kwargs: A dictionary of filters on attribute values. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self._find_all(name, attrs, None, limit, self.parents, + **kwargs) + findParents = find_parents # BS3 + fetchParents = find_parents # BS2 + + @property + def next(self): + """The PageElement, if any, that was parsed just after this one. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self.next_element + + @property + def previous(self): + """The PageElement, if any, that was parsed just before this one. + + :return: A PageElement. + :rtype: bs4.element.Tag | bs4.element.NavigableString + """ + return self.previous_element + + #These methods do the real heavy lifting. + + def _find_one(self, method, name, attrs, text, **kwargs): + r = None + l = method(name, attrs, text, 1, **kwargs) + if l: + r = l[0] + return r + + def _find_all(self, name, attrs, text, limit, generator, **kwargs): + "Iterates over a generator looking for things that match." + + if text is None and 'string' in kwargs: + text = kwargs['string'] + del kwargs['string'] + + if isinstance(name, SoupStrainer): + strainer = name + else: + strainer = SoupStrainer(name, attrs, text, **kwargs) + + if text is None and not limit and not attrs and not kwargs: + if name is True or name is None: + # Optimization to find all tags. + result = (element for element in generator + if isinstance(element, Tag)) + return ResultSet(strainer, result) + elif isinstance(name, str): + # Optimization to find all tags with a given name. + if name.count(':') == 1: + # This is a name with a prefix. If this is a namespace-aware document, + # we need to match the local name against tag.name. If not, + # we need to match the fully-qualified name against tag.name. + prefix, local_name = name.split(':', 1) + else: + prefix = None + local_name = name + result = (element for element in generator + if isinstance(element, Tag) + and ( + element.name == name + ) or ( + element.name == local_name + and (prefix is None or element.prefix == prefix) + ) + ) + return ResultSet(strainer, result) + results = ResultSet(strainer) + while True: + try: + i = next(generator) + except StopIteration: + break + if i: + found = strainer.search(i) + if found: + results.append(found) + if limit and len(results) >= limit: + break + return results + + #These generators can be used to navigate starting from both + #NavigableStrings and Tags. + @property + def next_elements(self): + """All PageElements that were parsed after this one. + + :yield: A sequence of PageElements. + """ + i = self.next_element + while i is not None: + yield i + i = i.next_element + + @property + def next_siblings(self): + """All PageElements that are siblings of this one but were parsed + later. + + :yield: A sequence of PageElements. + """ + i = self.next_sibling + while i is not None: + yield i + i = i.next_sibling + + @property + def previous_elements(self): + """All PageElements that were parsed before this one. + + :yield: A sequence of PageElements. + """ + i = self.previous_element + while i is not None: + yield i + i = i.previous_element + + @property + def previous_siblings(self): + """All PageElements that are siblings of this one but were parsed + earlier. + + :yield: A sequence of PageElements. + """ + i = self.previous_sibling + while i is not None: + yield i + i = i.previous_sibling + + @property + def parents(self): + """All PageElements that are parents of this PageElement. + + :yield: A sequence of PageElements. + """ + i = self.parent + while i is not None: + yield i + i = i.parent + + @property + def decomposed(self): + """Check whether a PageElement has been decomposed. + + :rtype: bool + """ + return getattr(self, '_decomposed', False) or False + + # Old non-property versions of the generators, for backwards + # compatibility with BS3. + def nextGenerator(self): + return self.next_elements + + def nextSiblingGenerator(self): + return self.next_siblings + + def previousGenerator(self): + return self.previous_elements + + def previousSiblingGenerator(self): + return self.previous_siblings + + def parentGenerator(self): + return self.parents + + +class NavigableString(str, PageElement): + """A Python Unicode string that is part of a parse tree. + + When Beautiful Soup parses the markup penguin, it will + create a NavigableString for the string "penguin". + """ + + PREFIX = '' + SUFFIX = '' + + # We can't tell just by looking at a string whether it's contained + # in an XML document or an HTML document. + + known_xml = None + + def __new__(cls, value): + """Create a new NavigableString. + + When unpickling a NavigableString, this method is called with + the string in DEFAULT_OUTPUT_ENCODING. That encoding needs to be + passed in to the superclass's __new__ or the superclass won't know + how to handle non-ASCII characters. + """ + if isinstance(value, str): + u = str.__new__(cls, value) + else: + u = str.__new__(cls, value, DEFAULT_OUTPUT_ENCODING) + u.setup() + return u + + def __copy__(self): + """A copy of a NavigableString has the same contents and class + as the original, but it is not connected to the parse tree. + """ + return type(self)(self) + + def __getnewargs__(self): + return (str(self),) + + def __getattr__(self, attr): + """text.string gives you text. This is for backwards + compatibility for Navigable*String, but for CData* it lets you + get the string without the CData wrapper.""" + if attr == 'string': + return self + else: + raise AttributeError( + "'%s' object has no attribute '%s'" % ( + self.__class__.__name__, attr)) + + def output_ready(self, formatter="minimal"): + """Run the string through the provided formatter. + + :param formatter: A Formatter object, or a string naming one of the standard formatters. + """ + output = self.format_string(self, formatter) + return self.PREFIX + output + self.SUFFIX + + @property + def name(self): + """Since a NavigableString is not a Tag, it has no .name. + + This property is implemented so that code like this doesn't crash + when run on a mixture of Tag and NavigableString objects: + [x.name for x in tag.children] + """ + return None + + @name.setter + def name(self, name): + """Prevent NavigableString.name from ever being set.""" + raise AttributeError("A NavigableString cannot be given a name.") + + def _all_strings(self, strip=False, types=PageElement.default): + """Yield all strings of certain classes, possibly stripping them. + + This makes it easy for NavigableString to implement methods + like get_text() as conveniences, creating a consistent + text-extraction API across all PageElements. + + :param strip: If True, all strings will be stripped before being + yielded. + + :param types: A tuple of NavigableString subclasses. If this + NavigableString isn't one of those subclasses, the + sequence will be empty. By default, the subclasses + considered are NavigableString and CData objects. That + means no comments, processing instructions, etc. + + :yield: A sequence that either contains this string, or is empty. + + """ + if types is self.default: + # This is kept in Tag because it's full of subclasses of + # this class, which aren't defined until later in the file. + types = Tag.DEFAULT_INTERESTING_STRING_TYPES + + # Do nothing if the caller is looking for specific types of + # string, and we're of a different type. + my_type = type(self) + if types is not None: + if isinstance(types, type): + # Looking for a single type. + if my_type is not types: + return + elif my_type not in types: + # Looking for one of a list of types. + return + + value = self + if strip: + value = value.strip() + if len(value) > 0: + yield value + strings = property(_all_strings) + +class PreformattedString(NavigableString): + """A NavigableString not subject to the normal formatting rules. + + This is an abstract class used for special kinds of strings such + as comments (the Comment class) and CDATA blocks (the CData + class). + """ + + PREFIX = '' + SUFFIX = '' + + def output_ready(self, formatter=None): + """Make this string ready for output by adding any subclass-specific + prefix or suffix. + + :param formatter: A Formatter object, or a string naming one + of the standard formatters. The string will be passed into the + Formatter, but only to trigger any side effects: the return + value is ignored. + + :return: The string, with any subclass-specific prefix and + suffix added on. + """ + if formatter is not None: + ignore = self.format_string(self, formatter) + return self.PREFIX + self + self.SUFFIX + +class CData(PreformattedString): + """A CDATA block.""" + PREFIX = '' + +class ProcessingInstruction(PreformattedString): + """A SGML processing instruction.""" + + PREFIX = '' + +class XMLProcessingInstruction(ProcessingInstruction): + """An XML processing instruction.""" + PREFIX = '' + +class Comment(PreformattedString): + """An HTML or XML comment.""" + PREFIX = '' + + +class Declaration(PreformattedString): + """An XML declaration.""" + PREFIX = '' + + +class Doctype(PreformattedString): + """A document type declaration.""" + @classmethod + def for_name_and_ids(cls, name, pub_id, system_id): + """Generate an appropriate document type declaration for a given + public ID and system ID. + + :param name: The name of the document's root element, e.g. 'html'. + :param pub_id: The Formal Public Identifier for this document type, + e.g. '-//W3C//DTD XHTML 1.1//EN' + :param system_id: The system identifier for this document type, + e.g. 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' + + :return: A Doctype. + """ + value = name or '' + if pub_id is not None: + value += ' PUBLIC "%s"' % pub_id + if system_id is not None: + value += ' "%s"' % system_id + elif system_id is not None: + value += ' SYSTEM "%s"' % system_id + + return Doctype(value) + + PREFIX = '\n' + + +class Stylesheet(NavigableString): + """A NavigableString representing an stylesheet (probably + CSS). + + Used to distinguish embedded stylesheets from textual content. + """ + pass + + +class Script(NavigableString): + """A NavigableString representing an executable script (probably + Javascript). + + Used to distinguish executable code from textual content. + """ + pass + + +class TemplateString(NavigableString): + """A NavigableString representing a string found inside an HTML + template embedded in a larger document. + + Used to distinguish such strings from the main body of the document. + """ + pass + + +class Tag(PageElement): + """Represents an HTML or XML tag that is part of a parse tree, along + with its attributes and contents. + + When Beautiful Soup parses the markup penguin, it will + create a Tag object representing the tag. + """ + + def __init__(self, parser=None, builder=None, name=None, namespace=None, + prefix=None, attrs=None, parent=None, previous=None, + is_xml=None, sourceline=None, sourcepos=None, + can_be_empty_element=None, cdata_list_attributes=None, + preserve_whitespace_tags=None, + interesting_string_types=None, + ): + """Basic constructor. + + :param parser: A BeautifulSoup object. + :param builder: A TreeBuilder. + :param name: The name of the tag. + :param namespace: The URI of this Tag's XML namespace, if any. + :param prefix: The prefix for this Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values. + :param parent: The PageElement to use as this Tag's parent. + :param previous: The PageElement that was parsed immediately before + this tag. + :param is_xml: If True, this is an XML tag. Otherwise, this is an + HTML tag. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param can_be_empty_element: If True, this tag should be + represented as . If False, this tag should be represented + as . + :param cdata_list_attributes: A list of attributes whose values should + be treated as CDATA if they ever show up on this tag. + :param preserve_whitespace_tags: A list of tag names whose contents + should have their whitespace preserved. + :param interesting_string_types: This is a NavigableString + subclass or a tuple of them. When iterating over this + Tag's strings in methods like Tag.strings or Tag.get_text, + these are the types of strings that are interesting enough + to be considered. The default is to consider + NavigableString and CData the only interesting string + subtypes. + """ + if parser is None: + self.parser_class = None + else: + # We don't actually store the parser object: that lets extracted + # chunks be garbage-collected. + self.parser_class = parser.__class__ + if name is None: + raise ValueError("No value provided for new tag's name.") + self.name = name + self.namespace = namespace + self.prefix = prefix + if ((not builder or builder.store_line_numbers) + and (sourceline is not None or sourcepos is not None)): + self.sourceline = sourceline + self.sourcepos = sourcepos + if attrs is None: + attrs = {} + elif attrs: + if builder is not None and builder.cdata_list_attributes: + attrs = builder._replace_cdata_list_attribute_values( + self.name, attrs) + else: + attrs = dict(attrs) + else: + attrs = dict(attrs) + + # If possible, determine ahead of time whether this tag is an + # XML tag. + if builder: + self.known_xml = builder.is_xml + else: + self.known_xml = is_xml + self.attrs = attrs + self.contents = [] + self.setup(parent, previous) + self.hidden = False + + if builder is None: + # In the absence of a TreeBuilder, use whatever values were + # passed in here. They're probably None, unless this is a copy of some + # other tag. + self.can_be_empty_element = can_be_empty_element + self.cdata_list_attributes = cdata_list_attributes + self.preserve_whitespace_tags = preserve_whitespace_tags + self.interesting_string_types = interesting_string_types + else: + # Set up any substitutions for this tag, such as the charset in a META tag. + builder.set_up_substitutions(self) + + # Ask the TreeBuilder whether this tag might be an empty-element tag. + self.can_be_empty_element = builder.can_be_empty_element(name) + + # Keep track of the list of attributes of this tag that + # might need to be treated as a list. + # + # For performance reasons, we store the whole data structure + # rather than asking the question of every tag. Asking would + # require building a new data structure every time, and + # (unlike can_be_empty_element), we almost never need + # to check this. + self.cdata_list_attributes = builder.cdata_list_attributes + + # Keep track of the names that might cause this tag to be treated as a + # whitespace-preserved tag. + self.preserve_whitespace_tags = builder.preserve_whitespace_tags + + if self.name in builder.string_containers: + # This sort of tag uses a special string container + # subclass for most of its strings. When we ask the + self.interesting_string_types = builder.string_containers[self.name] + else: + self.interesting_string_types = self.DEFAULT_INTERESTING_STRING_TYPES + + parserClass = _alias("parser_class") # BS3 + + def __copy__(self): + """A copy of a Tag is a new Tag, unconnected to the parse tree. + Its contents are a copy of the old Tag's contents. + """ + clone = type(self)( + None, self.builder, self.name, self.namespace, + self.prefix, self.attrs, is_xml=self._is_xml, + sourceline=self.sourceline, sourcepos=self.sourcepos, + can_be_empty_element=self.can_be_empty_element, + cdata_list_attributes=self.cdata_list_attributes, + preserve_whitespace_tags=self.preserve_whitespace_tags + ) + for attr in ('can_be_empty_element', 'hidden'): + setattr(clone, attr, getattr(self, attr)) + for child in self.contents: + clone.append(child.__copy__()) + return clone + + @property + def is_empty_element(self): + """Is this tag an empty-element tag? (aka a self-closing tag) + + A tag that has contents is never an empty-element tag. + + A tag that has no contents may or may not be an empty-element + tag. It depends on the builder used to create the tag. If the + builder has a designated list of empty-element tags, then only + a tag whose name shows up in that list is considered an + empty-element tag. + + If the builder has no designated list of empty-element tags, + then any tag with no contents is an empty-element tag. + """ + return len(self.contents) == 0 and self.can_be_empty_element + isSelfClosing = is_empty_element # BS3 + + @property + def string(self): + """Convenience property to get the single string within this + PageElement. + + TODO It might make sense to have NavigableString.string return + itself. + + :return: If this element has a single string child, return + value is that string. If this element has one child tag, + return value is the 'string' attribute of the child tag, + recursively. If this element is itself a string, has no + children, or has more than one child, return value is None. + """ + if len(self.contents) != 1: + return None + child = self.contents[0] + if isinstance(child, NavigableString): + return child + return child.string + + @string.setter + def string(self, string): + """Replace this PageElement's contents with `string`.""" + self.clear() + self.append(string.__class__(string)) + + DEFAULT_INTERESTING_STRING_TYPES = (NavigableString, CData) + def _all_strings(self, strip=False, types=PageElement.default): + """Yield all strings of certain classes, possibly stripping them. + + :param strip: If True, all strings will be stripped before being + yielded. + + :param types: A tuple of NavigableString subclasses. Any strings of + a subclass not found in this list will be ignored. By + default, the subclasses considered are the ones found in + self.interesting_string_types. If that's not specified, + only NavigableString and CData objects will be + considered. That means no comments, processing + instructions, etc. + + :yield: A sequence of strings. + + """ + if types is self.default: + types = self.interesting_string_types + + for descendant in self.descendants: + if (types is None and not isinstance(descendant, NavigableString)): + continue + descendant_type = type(descendant) + if isinstance(types, type): + if descendant_type is not types: + # We're not interested in strings of this type. + continue + elif types is not None and descendant_type not in types: + # We're not interested in strings of this type. + continue + if strip: + descendant = descendant.strip() + if len(descendant) == 0: + continue + yield descendant + strings = property(_all_strings) + + def decompose(self): + """Recursively destroys this PageElement and its children. + + This element will be removed from the tree and wiped out; so + will everything beneath it. + + The behavior of a decomposed PageElement is undefined and you + should never use one for anything, but if you need to _check_ + whether an element has been decomposed, you can use the + `decomposed` property. + """ + self.extract() + i = self + while i is not None: + n = i.next_element + i.__dict__.clear() + i.contents = [] + i._decomposed = True + i = n + + def clear(self, decompose=False): + """Wipe out all children of this PageElement by calling extract() + on them. + + :param decompose: If this is True, decompose() (a more + destructive method) will be called instead of extract(). + """ + if decompose: + for element in self.contents[:]: + if isinstance(element, Tag): + element.decompose() + else: + element.extract() + else: + for element in self.contents[:]: + element.extract() + + def smooth(self): + """Smooth out this element's children by consolidating consecutive + strings. + + This makes pretty-printed output look more natural following a + lot of operations that modified the tree. + """ + # Mark the first position of every pair of children that need + # to be consolidated. Do this rather than making a copy of + # self.contents, since in most cases very few strings will be + # affected. + marked = [] + for i, a in enumerate(self.contents): + if isinstance(a, Tag): + # Recursively smooth children. + a.smooth() + if i == len(self.contents)-1: + # This is the last item in .contents, and it's not a + # tag. There's no chance it needs any work. + continue + b = self.contents[i+1] + if (isinstance(a, NavigableString) + and isinstance(b, NavigableString) + and not isinstance(a, PreformattedString) + and not isinstance(b, PreformattedString) + ): + marked.append(i) + + # Go over the marked positions in reverse order, so that + # removing items from .contents won't affect the remaining + # positions. + for i in reversed(marked): + a = self.contents[i] + b = self.contents[i+1] + b.extract() + n = NavigableString(a+b) + a.replace_with(n) + + def index(self, element): + """Find the index of a child by identity, not value. + + Avoids issues with tag.contents.index(element) getting the + index of equal elements. + + :param element: Look for this PageElement in `self.contents`. + """ + for i, child in enumerate(self.contents): + if child is element: + return i + raise ValueError("Tag.index: element not in tag") + + def get(self, key, default=None): + """Returns the value of the 'key' attribute for the tag, or + the value given for 'default' if it doesn't have that + attribute.""" + return self.attrs.get(key, default) + + def get_attribute_list(self, key, default=None): + """The same as get(), but always returns a list. + + :param key: The attribute to look for. + :param default: Use this value if the attribute is not present + on this PageElement. + :return: A list of values, probably containing only a single + value. + """ + value = self.get(key, default) + if not isinstance(value, list): + value = [value] + return value + + def has_attr(self, key): + """Does this PageElement have an attribute with the given name?""" + return key in self.attrs + + def __hash__(self): + return str(self).__hash__() + + def __getitem__(self, key): + """tag[key] returns the value of the 'key' attribute for the Tag, + and throws an exception if it's not there.""" + return self.attrs[key] + + def __iter__(self): + "Iterating over a Tag iterates over its contents." + return iter(self.contents) + + def __len__(self): + "The length of a Tag is the length of its list of contents." + return len(self.contents) + + def __contains__(self, x): + return x in self.contents + + def __bool__(self): + "A tag is non-None even if it has no contents." + return True + + def __setitem__(self, key, value): + """Setting tag[key] sets the value of the 'key' attribute for the + tag.""" + self.attrs[key] = value + + def __delitem__(self, key): + "Deleting tag[key] deletes all 'key' attributes for the tag." + self.attrs.pop(key, None) + + def __call__(self, *args, **kwargs): + """Calling a Tag like a function is the same as calling its + find_all() method. Eg. tag('a') returns a list of all the A tags + found within this tag.""" + return self.find_all(*args, **kwargs) + + def __getattr__(self, tag): + """Calling tag.subtag is the same as calling tag.find(name="subtag")""" + #print("Getattr %s.%s" % (self.__class__, tag)) + if len(tag) > 3 and tag.endswith('Tag'): + # BS3: soup.aTag -> "soup.find("a") + tag_name = tag[:-3] + warnings.warn( + '.%(name)sTag is deprecated, use .find("%(name)s") instead. If you really were looking for a tag called %(name)sTag, use .find("%(name)sTag")' % dict( + name=tag_name + ) + ) + return self.find(tag_name) + # We special case contents to avoid recursion. + elif not tag.startswith("__") and not tag == "contents": + return self.find(tag) + raise AttributeError( + "'%s' object has no attribute '%s'" % (self.__class__, tag)) + + def __eq__(self, other): + """Returns true iff this Tag has the same name, the same attributes, + and the same contents (recursively) as `other`.""" + if self is other: + return True + if (not hasattr(other, 'name') or + not hasattr(other, 'attrs') or + not hasattr(other, 'contents') or + self.name != other.name or + self.attrs != other.attrs or + len(self) != len(other)): + return False + for i, my_child in enumerate(self.contents): + if my_child != other.contents[i]: + return False + return True + + def __ne__(self, other): + """Returns true iff this Tag is not identical to `other`, + as defined in __eq__.""" + return not self == other + + def __repr__(self, encoding="unicode-escape"): + """Renders this PageElement as a string. + + :param encoding: The encoding to use (Python 2 only). + :return: Under Python 2, a bytestring; under Python 3, + a Unicode string. + """ + if PY3K: + # "The return value must be a string object", i.e. Unicode + return self.decode() + else: + # "The return value must be a string object", i.e. a bytestring. + # By convention, the return value of __repr__ should also be + # an ASCII string. + return self.encode(encoding) + + def __unicode__(self): + """Renders this PageElement as a Unicode string.""" + return self.decode() + + def __str__(self): + """Renders this PageElement as a generic string. + + :return: Under Python 2, a UTF-8 bytestring; under Python 3, + a Unicode string. + """ + if PY3K: + return self.decode() + else: + return self.encode() + + if PY3K: + __str__ = __repr__ = __unicode__ + + def encode(self, encoding=DEFAULT_OUTPUT_ENCODING, + indent_level=None, formatter="minimal", + errors="xmlcharrefreplace"): + """Render a bytestring representation of this PageElement and its + contents. + + :param encoding: The destination encoding. + :param indent_level: Each line of the rendering will be + indented this many spaces. Used internally in + recursive calls while pretty-printing. + :param formatter: A Formatter object, or a string naming one of + the standard formatters. + :param errors: An error handling strategy such as + 'xmlcharrefreplace'. This value is passed along into + encode() and its value should be one of the constants + defined by Python. + :return: A bytestring. + + """ + # Turn the data structure into Unicode, then encode the + # Unicode. + u = self.decode(indent_level, encoding, formatter) + return u.encode(encoding, errors) + + def decode(self, indent_level=None, + eventual_encoding=DEFAULT_OUTPUT_ENCODING, + formatter="minimal"): + """Render a Unicode representation of this PageElement and its + contents. + + :param indent_level: Each line of the rendering will be + indented this many spaces. Used internally in + recursive calls while pretty-printing. + :param eventual_encoding: The tag is destined to be + encoded into this encoding. This method is _not_ + responsible for performing that encoding. This information + is passed in so that it can be substituted in if the + document contains a tag that mentions the document's + encoding. + :param formatter: A Formatter object, or a string naming one of + the standard formatters. + """ + + # First off, turn a non-Formatter `formatter` into a Formatter + # object. This will stop the lookup from happening over and + # over again. + if not isinstance(formatter, Formatter): + formatter = self.formatter_for_name(formatter) + attributes = formatter.attributes(self) + attrs = [] + for key, val in attributes: + if val is None: + decoded = key + else: + if isinstance(val, list) or isinstance(val, tuple): + val = ' '.join(val) + elif not isinstance(val, str): + val = str(val) + elif ( + isinstance(val, AttributeValueWithCharsetSubstitution) + and eventual_encoding is not None + ): + val = val.encode(eventual_encoding) + + text = formatter.attribute_value(val) + decoded = ( + str(key) + '=' + + formatter.quoted_attribute_value(text)) + attrs.append(decoded) + close = '' + closeTag = '' + + prefix = '' + if self.prefix: + prefix = self.prefix + ":" + + if self.is_empty_element: + close = formatter.void_element_close_prefix or '' + else: + closeTag = '' % (prefix, self.name) + + pretty_print = self._should_pretty_print(indent_level) + space = '' + indent_space = '' + if indent_level is not None: + indent_space = (' ' * (indent_level - 1)) + if pretty_print: + space = indent_space + indent_contents = indent_level + 1 + else: + indent_contents = None + contents = self.decode_contents( + indent_contents, eventual_encoding, formatter + ) + + if self.hidden: + # This is the 'document root' object. + s = contents + else: + s = [] + attribute_string = '' + if attrs: + attribute_string = ' ' + ' '.join(attrs) + if indent_level is not None: + # Even if this particular tag is not pretty-printed, + # we should indent up to the start of the tag. + s.append(indent_space) + s.append('<%s%s%s%s>' % ( + prefix, self.name, attribute_string, close)) + if pretty_print: + s.append("\n") + s.append(contents) + if pretty_print and contents and contents[-1] != "\n": + s.append("\n") + if pretty_print and closeTag: + s.append(space) + s.append(closeTag) + if indent_level is not None and closeTag and self.next_sibling: + # Even if this particular tag is not pretty-printed, + # we're now done with the tag, and we should add a + # newline if appropriate. + s.append("\n") + s = ''.join(s) + return s + + def _should_pretty_print(self, indent_level): + """Should this tag be pretty-printed? + + Most of them should, but some (such as
 in HTML
+        documents) should not.
+        """
+        return (
+            indent_level is not None
+            and (
+                not self.preserve_whitespace_tags
+                or self.name not in self.preserve_whitespace_tags
+            )
+        )
+
+    def prettify(self, encoding=None, formatter="minimal"):
+        """Pretty-print this PageElement as a string.
+
+        :param encoding: The eventual encoding of the string. If this is None,
+            a Unicode string will be returned.
+        :param formatter: A Formatter object, or a string naming one of
+            the standard formatters.
+        :return: A Unicode string (if encoding==None) or a bytestring 
+            (otherwise).
+        """
+        if encoding is None:
+            return self.decode(True, formatter=formatter)
+        else:
+            return self.encode(encoding, True, formatter=formatter)
+
+    def decode_contents(self, indent_level=None,
+                       eventual_encoding=DEFAULT_OUTPUT_ENCODING,
+                       formatter="minimal"):
+        """Renders the contents of this tag as a Unicode string.
+
+        :param indent_level: Each line of the rendering will be
+           indented this many spaces. Used internally in
+           recursive calls while pretty-printing.
+
+        :param eventual_encoding: The tag is destined to be
+           encoded into this encoding. decode_contents() is _not_
+           responsible for performing that encoding. This information
+           is passed in so that it can be substituted in if the
+           document contains a  tag that mentions the document's
+           encoding.
+
+        :param formatter: A Formatter object, or a string naming one of
+            the standard Formatters.
+        """
+        # First off, turn a string formatter into a Formatter object. This
+        # will stop the lookup from happening over and over again.
+        if not isinstance(formatter, Formatter):
+            formatter = self.formatter_for_name(formatter)
+
+        pretty_print = (indent_level is not None)
+        s = []
+        for c in self:
+            text = None
+            if isinstance(c, NavigableString):
+                text = c.output_ready(formatter)
+            elif isinstance(c, Tag):
+                s.append(c.decode(indent_level, eventual_encoding,
+                                  formatter))
+            preserve_whitespace = (
+                self.preserve_whitespace_tags and self.name in self.preserve_whitespace_tags
+            )
+            if text and indent_level and not preserve_whitespace:
+                text = text.strip()
+            if text:
+                if pretty_print and not preserve_whitespace:
+                    s.append(" " * (indent_level - 1))
+                s.append(text)
+                if pretty_print and not preserve_whitespace:
+                    s.append("\n")
+        return ''.join(s)
+       
+    def encode_contents(
+        self, indent_level=None, encoding=DEFAULT_OUTPUT_ENCODING,
+        formatter="minimal"):
+        """Renders the contents of this PageElement as a bytestring.
+
+        :param indent_level: Each line of the rendering will be
+           indented this many spaces. Used internally in
+           recursive calls while pretty-printing.
+
+        :param eventual_encoding: The bytestring will be in this encoding.
+
+        :param formatter: A Formatter object, or a string naming one of
+            the standard Formatters.
+
+        :return: A bytestring.
+        """
+        contents = self.decode_contents(indent_level, encoding, formatter)
+        return contents.encode(encoding)
+
+    # Old method for BS3 compatibility
+    def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
+                       prettyPrint=False, indentLevel=0):
+        """Deprecated method for BS3 compatibility."""
+        if not prettyPrint:
+            indentLevel = None
+        return self.encode_contents(
+            indent_level=indentLevel, encoding=encoding)
+
+    #Soup methods
+
+    def find(self, name=None, attrs={}, recursive=True, text=None,
+             **kwargs):
+        """Look in the children of this PageElement and find the first
+        PageElement that matches the given criteria.
+
+        All find_* methods take a common set of arguments. See the online
+        documentation for detailed explanations.
+
+        :param name: A filter on tag name.
+        :param attrs: A dictionary of filters on attribute values.
+        :param recursive: If this is True, find() will perform a
+            recursive search of this PageElement's children. Otherwise,
+            only the direct children will be considered.
+        :param limit: Stop looking after finding this many results.
+        :kwargs: A dictionary of filters on attribute values.
+        :return: A PageElement.
+        :rtype: bs4.element.Tag | bs4.element.NavigableString
+        """
+        r = None
+        l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
+        if l:
+            r = l[0]
+        return r
+    findChild = find #BS2
+
+    def find_all(self, name=None, attrs={}, recursive=True, text=None,
+                 limit=None, **kwargs):
+        """Look in the children of this PageElement and find all
+        PageElements that match the given criteria.
+
+        All find_* methods take a common set of arguments. See the online
+        documentation for detailed explanations.
+
+        :param name: A filter on tag name.
+        :param attrs: A dictionary of filters on attribute values.
+        :param recursive: If this is True, find_all() will perform a
+            recursive search of this PageElement's children. Otherwise,
+            only the direct children will be considered.
+        :param limit: Stop looking after finding this many results.
+        :kwargs: A dictionary of filters on attribute values.
+        :return: A ResultSet of PageElements.
+        :rtype: bs4.element.ResultSet
+        """
+        generator = self.descendants
+        if not recursive:
+            generator = self.children
+        return self._find_all(name, attrs, text, limit, generator, **kwargs)
+    findAll = find_all       # BS3
+    findChildren = find_all  # BS2
+
+    #Generator methods
+    @property
+    def children(self):
+        """Iterate over all direct children of this PageElement.
+
+        :yield: A sequence of PageElements.
+        """
+        # return iter() to make the purpose of the method clear
+        return iter(self.contents)  # XXX This seems to be untested.
+
+    @property
+    def descendants(self):
+        """Iterate over all children of this PageElement in a
+        breadth-first sequence.
+
+        :yield: A sequence of PageElements.
+        """
+        if not len(self.contents):
+            return
+        stopNode = self._last_descendant().next_element
+        current = self.contents[0]
+        while current is not stopNode:
+            yield current
+            current = current.next_element
+
+    # CSS selector code
+    def select_one(self, selector, namespaces=None, **kwargs):
+        """Perform a CSS selection operation on the current element.
+
+        :param selector: A CSS selector.
+
+        :param namespaces: A dictionary mapping namespace prefixes
+           used in the CSS selector to namespace URIs. By default,
+           Beautiful Soup will use the prefixes it encountered while
+           parsing the document.
+
+        :param kwargs: Keyword arguments to be passed into SoupSieve's 
+           soupsieve.select() method.
+
+        :return: A Tag.
+        :rtype: bs4.element.Tag
+        """
+        value = self.select(selector, namespaces, 1, **kwargs)
+        if value:
+            return value[0]
+        return None
+
+    def select(self, selector, namespaces=None, limit=None, **kwargs):
+        """Perform a CSS selection operation on the current element.
+
+        This uses the SoupSieve library.
+
+        :param selector: A string containing a CSS selector.
+
+        :param namespaces: A dictionary mapping namespace prefixes
+           used in the CSS selector to namespace URIs. By default,
+           Beautiful Soup will use the prefixes it encountered while
+           parsing the document.
+
+        :param limit: After finding this number of results, stop looking.
+
+        :param kwargs: Keyword arguments to be passed into SoupSieve's 
+           soupsieve.select() method.
+
+        :return: A ResultSet of Tags.
+        :rtype: bs4.element.ResultSet
+        """
+        if namespaces is None:
+            namespaces = self._namespaces
+        
+        if limit is None:
+            limit = 0
+        if soupsieve is None:
+            raise NotImplementedError(
+                "Cannot execute CSS selectors because the soupsieve package is not installed."
+            )
+            
+        results = soupsieve.select(selector, self, namespaces, limit, **kwargs)
+
+        # We do this because it's more consistent and because
+        # ResultSet.__getattr__ has a helpful error message.
+        return ResultSet(None, results)
+
+    # Old names for backwards compatibility
+    def childGenerator(self):
+        """Deprecated generator."""
+        return self.children
+
+    def recursiveChildGenerator(self):
+        """Deprecated generator."""
+        return self.descendants
+
+    def has_key(self, key):
+        """Deprecated method. This was kind of misleading because has_key()
+        (attributes) was different from __in__ (contents).
+
+        has_key() is gone in Python 3, anyway.
+        """
+        warnings.warn('has_key is deprecated. Use has_attr("%s") instead.' % (
+                key))
+        return self.has_attr(key)
+
+# Next, a couple classes to represent queries and their results.
+class SoupStrainer(object):
+    """Encapsulates a number of ways of matching a markup element (tag or
+    string).
+
+    This is primarily used to underpin the find_* methods, but you can
+    create one yourself and pass it in as `parse_only` to the
+    `BeautifulSoup` constructor, to parse a subset of a large
+    document.
+    """
+
+    def __init__(self, name=None, attrs={}, text=None, **kwargs):
+        """Constructor.
+
+        The SoupStrainer constructor takes the same arguments passed
+        into the find_* methods. See the online documentation for
+        detailed explanations.
+
+        :param name: A filter on tag name.
+        :param attrs: A dictionary of filters on attribute values.
+        :param text: A filter for a NavigableString with specific text.
+        :kwargs: A dictionary of filters on attribute values.
+        """        
+        self.name = self._normalize_search_value(name)
+        if not isinstance(attrs, dict):
+            # Treat a non-dict value for attrs as a search for the 'class'
+            # attribute.
+            kwargs['class'] = attrs
+            attrs = None
+
+        if 'class_' in kwargs:
+            # Treat class_="foo" as a search for the 'class'
+            # attribute, overriding any non-dict value for attrs.
+            kwargs['class'] = kwargs['class_']
+            del kwargs['class_']
+
+        if kwargs:
+            if attrs:
+                attrs = attrs.copy()
+                attrs.update(kwargs)
+            else:
+                attrs = kwargs
+        normalized_attrs = {}
+        for key, value in list(attrs.items()):
+            normalized_attrs[key] = self._normalize_search_value(value)
+
+        self.attrs = normalized_attrs
+        self.text = self._normalize_search_value(text)
+
+    def _normalize_search_value(self, value):
+        # Leave it alone if it's a Unicode string, a callable, a
+        # regular expression, a boolean, or None.
+        if (isinstance(value, str) or isinstance(value, Callable) or hasattr(value, 'match')
+            or isinstance(value, bool) or value is None):
+            return value
+
+        # If it's a bytestring, convert it to Unicode, treating it as UTF-8.
+        if isinstance(value, bytes):
+            return value.decode("utf8")
+
+        # If it's listlike, convert it into a list of strings.
+        if hasattr(value, '__iter__'):
+            new_value = []
+            for v in value:
+                if (hasattr(v, '__iter__') and not isinstance(v, bytes)
+                    and not isinstance(v, str)):
+                    # This is almost certainly the user's mistake. In the
+                    # interests of avoiding infinite loops, we'll let
+                    # it through as-is rather than doing a recursive call.
+                    new_value.append(v)
+                else:
+                    new_value.append(self._normalize_search_value(v))
+            return new_value
+
+        # Otherwise, convert it into a Unicode string.
+        # The unicode(str()) thing is so this will do the same thing on Python 2
+        # and Python 3.
+        return str(str(value))
+
+    def __str__(self):
+        """A human-readable representation of this SoupStrainer."""
+        if self.text:
+            return self.text
+        else:
+            return "%s|%s" % (self.name, self.attrs)
+
+    def search_tag(self, markup_name=None, markup_attrs={}):
+        """Check whether a Tag with the given name and attributes would
+        match this SoupStrainer.
+
+        Used prospectively to decide whether to even bother creating a Tag
+        object.
+
+        :param markup_name: A tag name as found in some markup.
+        :param markup_attrs: A dictionary of attributes as found in some markup.
+
+        :return: True if the prospective tag would match this SoupStrainer;
+            False otherwise.
+        """
+        found = None
+        markup = None
+        if isinstance(markup_name, Tag):
+            markup = markup_name
+            markup_attrs = markup
+
+        if isinstance(self.name, str):
+            # Optimization for a very common case where the user is
+            # searching for a tag with one specific name, and we're
+            # looking at a tag with a different name.
+            if markup and not markup.prefix and self.name != markup.name:
+                 return False
+            
+        call_function_with_tag_data = (
+            isinstance(self.name, Callable)
+            and not isinstance(markup_name, Tag))
+
+        if ((not self.name)
+            or call_function_with_tag_data
+            or (markup and self._matches(markup, self.name))
+            or (not markup and self._matches(markup_name, self.name))):
+            if call_function_with_tag_data:
+                match = self.name(markup_name, markup_attrs)
+            else:
+                match = True
+                markup_attr_map = None
+                for attr, match_against in list(self.attrs.items()):
+                    if not markup_attr_map:
+                        if hasattr(markup_attrs, 'get'):
+                            markup_attr_map = markup_attrs
+                        else:
+                            markup_attr_map = {}
+                            for k, v in markup_attrs:
+                                markup_attr_map[k] = v
+                    attr_value = markup_attr_map.get(attr)
+                    if not self._matches(attr_value, match_against):
+                        match = False
+                        break
+            if match:
+                if markup:
+                    found = markup
+                else:
+                    found = markup_name
+        if found and self.text and not self._matches(found.string, self.text):
+            found = None
+        return found
+
+    # For BS3 compatibility.
+    searchTag = search_tag
+
+    def search(self, markup):
+        """Find all items in `markup` that match this SoupStrainer.
+
+        Used by the core _find_all() method, which is ultimately
+        called by all find_* methods.
+
+        :param markup: A PageElement or a list of them.
+        """
+        # print('looking for %s in %s' % (self, markup))
+        found = None
+        # If given a list of items, scan it for a text element that
+        # matches.
+        if hasattr(markup, '__iter__') and not isinstance(markup, (Tag, str)):
+            for element in markup:
+                if isinstance(element, NavigableString) \
+                       and self.search(element):
+                    found = element
+                    break
+        # If it's a Tag, make sure its name or attributes match.
+        # Don't bother with Tags if we're searching for text.
+        elif isinstance(markup, Tag):
+            if not self.text or self.name or self.attrs:
+                found = self.search_tag(markup)
+        # If it's text, make sure the text matches.
+        elif isinstance(markup, NavigableString) or \
+                 isinstance(markup, str):
+            if not self.name and not self.attrs and self._matches(markup, self.text):
+                found = markup
+        else:
+            raise Exception(
+                "I don't know how to match against a %s" % markup.__class__)
+        return found
+
+    def _matches(self, markup, match_against, already_tried=None):
+        # print(u"Matching %s against %s" % (markup, match_against))
+        result = False
+        if isinstance(markup, list) or isinstance(markup, tuple):
+            # This should only happen when searching a multi-valued attribute
+            # like 'class'.
+            for item in markup:
+                if self._matches(item, match_against):
+                    return True
+            # We didn't match any particular value of the multivalue
+            # attribute, but maybe we match the attribute value when
+            # considered as a string.
+            if self._matches(' '.join(markup), match_against):
+                return True
+            return False
+        
+        if match_against is True:
+            # True matches any non-None value.
+            return markup is not None
+
+        if isinstance(match_against, Callable):
+            return match_against(markup)
+
+        # Custom callables take the tag as an argument, but all
+        # other ways of matching match the tag name as a string.
+        original_markup = markup
+        if isinstance(markup, Tag):
+            markup = markup.name
+
+        # Ensure that `markup` is either a Unicode string, or None.
+        markup = self._normalize_search_value(markup)
+
+        if markup is None:
+            # None matches None, False, an empty string, an empty list, and so on.
+            return not match_against
+
+        if (hasattr(match_against, '__iter__')
+            and not isinstance(match_against, str)):
+            # We're asked to match against an iterable of items.
+            # The markup must be match at least one item in the
+            # iterable. We'll try each one in turn.
+            #
+            # To avoid infinite recursion we need to keep track of
+            # items we've already seen.
+            if not already_tried:
+                already_tried = set()
+            for item in match_against:
+                if item.__hash__:
+                    key = item
+                else:
+                    key = id(item)
+                if key in already_tried:
+                    continue
+                else:
+                    already_tried.add(key)
+                    if self._matches(original_markup, item, already_tried):
+                        return True
+            else:
+                return False
+        
+        # Beyond this point we might need to run the test twice: once against
+        # the tag's name and once against its prefixed name.
+        match = False
+        
+        if not match and isinstance(match_against, str):
+            # Exact string match
+            match = markup == match_against
+
+        if not match and hasattr(match_against, 'search'):
+            # Regexp match
+            return match_against.search(markup)
+
+        if (not match
+            and isinstance(original_markup, Tag)
+            and original_markup.prefix):
+            # Try the whole thing again with the prefixed tag name.
+            return self._matches(
+                original_markup.prefix + ':' + original_markup.name, match_against
+            )
+
+        return match
+
+
+class ResultSet(list):
+    """A ResultSet is just a list that keeps track of the SoupStrainer
+    that created it."""
+    def __init__(self, source, result=()):
+        """Constructor.
+
+        :param source: A SoupStrainer.
+        :param result: A list of PageElements.
+        """
+        super(ResultSet, self).__init__(result)
+        self.source = source
+
+    def __getattr__(self, key):
+        """Raise a helpful exception to explain a common code fix."""
+        raise AttributeError(
+            "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
+        )
diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/formatter.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/formatter.py
new file mode 100644
index 00000000..3bd9f859
--- /dev/null
+++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bs4/formatter.py
@@ -0,0 +1,165 @@
+from bs4.dammit import EntitySubstitution
+
+class Formatter(EntitySubstitution):
+    """Describes a strategy to use when outputting a parse tree to a string.
+
+    Some parts of this strategy come from the distinction between
+    HTML4, HTML5, and XML. Others are configurable by the user.
+
+    Formatters are passed in as the `formatter` argument to methods
+    like `PageElement.encode`. Most people won't need to think about
+    formatters, and most people who need to think about them can pass
+    in one of these predefined strings as `formatter` rather than
+    making a new Formatter object:
+
+    For HTML documents:
+     * 'html' - HTML entity substitution for generic HTML documents. (default)
+     * 'html5' - HTML entity substitution for HTML5 documents, as
+                 well as some optimizations in the way tags are rendered.
+     * 'minimal' - Only make the substitutions necessary to guarantee
+                   valid HTML.
+     * None - Do not perform any substitution. This will be faster
+              but may result in invalid markup.
+
+    For XML documents:
+     * 'html' - Entity substitution for XHTML documents.
+     * 'minimal' - Only make the substitutions necessary to guarantee
+                   valid XML. (default)
+     * None - Do not perform any substitution. This will be faster
+              but may result in invalid markup.
+    """
+    # Registries of XML and HTML formatters.
+    XML_FORMATTERS = {}
+    HTML_FORMATTERS = {}
+
+    HTML = 'html'
+    XML = 'xml'
+
+    HTML_DEFAULTS = dict(
+        cdata_containing_tags=set(["script", "style"]),
+    )
+
+    def _default(self, language, value, kwarg):
+        if value is not None:
+            return value
+        if language == self.XML:
+            return set()
+        return self.HTML_DEFAULTS[kwarg]
+
+    def __init__(
+            self, language=None, entity_substitution=None,
+            void_element_close_prefix='/', cdata_containing_tags=None,
+            empty_attributes_are_booleans=False,
+    ):
+        """Constructor.
+
+        :param language: This should be Formatter.XML if you are formatting
+           XML markup and Formatter.HTML if you are formatting HTML markup.
+
+        :param entity_substitution: A function to call to replace special
+           characters with XML/HTML entities. For examples, see 
+           bs4.dammit.EntitySubstitution.substitute_html and substitute_xml.
+        :param void_element_close_prefix: By default, void elements
+           are represented as  (XML rules) rather than 
+           (HTML rules). To get , pass in the empty string.
+        :param cdata_containing_tags: The list of tags that are defined
+           as containing CDATA in this dialect. For example, in HTML,
+           
+
This numeric entity is missing the final semicolon:
+ +
a
+
This document contains (do you see it?)
+
This document ends with That attribute value was bogus
+The doctype is invalid because it contains extra whitespace +
That boolean attribute had no value
+
Here's a nonexistent entity: &#foo; (do you see it?)
+
This document ends before the entity finishes: > +

Paragraphs shouldn't contain block display elements, but this one does:

you see?

+Multiple values for the same attribute. +
Here's a table
+
+
This tag contains nothing but whitespace:
+

This p tag is cut off by

the end of the blockquote tag
+
Here's a nested table:
foo
This table contains bare markup
+ +
This document contains a surprise doctype
+ +
Tag name contains Unicode characters
+ + +""" + + +class SoupTest(unittest.TestCase): + + @property + def default_builder(self): + return default_builder + + def soup(self, markup, **kwargs): + """Build a Beautiful Soup object from markup.""" + builder = kwargs.pop('builder', self.default_builder) + return BeautifulSoup(markup, builder=builder, **kwargs) + + def document_for(self, markup, **kwargs): + """Turn an HTML fragment into a document. + + The details depend on the builder. + """ + return self.default_builder(**kwargs).test_fragment_to_document(markup) + + def assertSoupEquals(self, to_parse, compare_parsed_to=None): + builder = self.default_builder + obj = BeautifulSoup(to_parse, builder=builder) + if compare_parsed_to is None: + compare_parsed_to = to_parse + + # Verify that the documents come out the same. + self.assertEqual(obj.decode(), self.document_for(compare_parsed_to)) + + # Also run some checks on the BeautifulSoup object itself: + + # Verify that every tag that was opened was eventually closed. + + # There are no tags in the open tag counter. + assert all(v==0 for v in list(obj.open_tag_counter.values())) + + # The only tag in the tag stack is the one for the root + # document. + self.assertEqual( + [obj.ROOT_TAG_NAME], [x.name for x in obj.tagStack] + ) + + def assertConnectedness(self, element): + """Ensure that next_element and previous_element are properly + set for all descendants of the given element. + """ + earlier = None + for e in element.descendants: + if earlier: + self.assertEqual(e, earlier.next_element) + self.assertEqual(earlier, e.previous_element) + earlier = e + + def linkage_validator(self, el, _recursive_call=False): + """Ensure proper linkage throughout the document.""" + descendant = None + # Document element should have no previous element or previous sibling. + # It also shouldn't have a next sibling. + if el.parent is None: + assert el.previous_element is None,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_element, None + ) + assert el.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + el, el.previous_sibling, None + ) + assert el.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_sibling, None + ) + + idx = 0 + child = None + last_child = None + last_idx = len(el.contents) - 1 + for child in el.contents: + descendant = None + + # Parent should link next element to their first child + # That child should have no previous sibling + if idx == 0: + if el.parent is not None: + assert el.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT: {}\nEXPECTED: {}".format( + el, el.next_element, child + ) + assert child.previous_element is el,\ + "Bad previous_element\nNODE: {}\nPREV: {}\nEXPECTED: {}".format( + child, child.previous_element, el + ) + assert child.previous_sibling is None,\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED: {}".format( + child, child.previous_sibling, None + ) + + # If not the first child, previous index should link as sibling to this index + # Previous element should match the last index or the last bubbled up descendant + else: + assert child.previous_sibling is el.contents[idx - 1],\ + "Bad previous_sibling\nNODE: {}\nPREV {}\nEXPECTED {}".format( + child, child.previous_sibling, el.contents[idx - 1] + ) + assert el.contents[idx - 1].next_sibling is child,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + el.contents[idx - 1], el.contents[idx - 1].next_sibling, child + ) + + if last_child is not None: + assert child.previous_element is last_child,\ + "Bad previous_element\nNODE: {}\nPREV {}\nEXPECTED {}\nCONTENTS {}".format( + child, child.previous_element, last_child, child.parent.contents + ) + assert last_child.next_element is child,\ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + last_child, last_child.next_element, child + ) + + if isinstance(child, Tag) and child.contents: + descendant = self.linkage_validator(child, True) + # A bubbled up descendant should have no next siblings + assert descendant.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + descendant, descendant.next_sibling, None + ) + + # Mark last child as either the bubbled up descendant or the current child + if descendant is not None: + last_child = descendant + else: + last_child = child + + # If last child, there are non next siblings + if idx == last_idx: + assert child.next_sibling is None,\ + "Bad next_sibling\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_sibling, None + ) + idx += 1 + + child = descendant if descendant is not None else child + if child is None: + child = el + + if not _recursive_call and child is not None: + target = el + while True: + if target is None: + assert child.next_element is None, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, None + ) + break + elif target.next_sibling is not None: + assert child.next_element is target.next_sibling, \ + "Bad next_element\nNODE: {}\nNEXT {}\nEXPECTED {}".format( + child, child.next_element, target.next_sibling + ) + break + target = target.parent + + # We are done, so nothing to return + return None + else: + # Return the child to the recursive caller + return child + + +class TreeBuilderSmokeTest(object): + # Tests that are common to HTML and XML tree builders. + + def test_fuzzed_input(self): + # This test centralizes in one place the various fuzz tests + # for Beautiful Soup created by the oss-fuzz project. + + # These strings superficially resemble markup, but they + # generally can't be parsed into anything. The best we can + # hope for is that parsing these strings won't crash the + # parser. + # + # n.b. This markup is commented out because these fuzz tests + # _do_ crash the parser. However the crashes are due to bugs + # in html.parser, not Beautiful Soup -- otherwise I'd fix the + # bugs! + + bad_markup = [ + # https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=28873 + # https://github.com/guidovranken/python-library-fuzzers/blob/master/corp-html/519e5b4269a01185a0d5e76295251921da2f0700 + # https://bugs.python.org/issue37747 + # + #b'\nSome CSS" + ) + assert isinstance(soup.style.string, Stylesheet) + assert isinstance(soup.script.string, Script) + + soup = self.soup( + "" + ) + assert isinstance(soup.style.string, Stylesheet) + # The contents of the style tag resemble an HTML comment, but + # it's not treated as a comment. + self.assertEqual("", soup.style.string) + assert isinstance(soup.style.string, Stylesheet) + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + self.assertEqual(loaded.__class__, BeautifulSoup) + self.assertEqual(loaded.decode(), tree.decode()) + + def assertDoctypeHandled(self, doctype_fragment): + """Assert that a given doctype string is handled correctly.""" + doctype_str, soup = self._document_with_doctype(doctype_fragment) + + # Make sure a Doctype object was created. + doctype = soup.contents[0] + self.assertEqual(doctype.__class__, Doctype) + self.assertEqual(doctype, doctype_fragment) + self.assertEqual( + soup.encode("utf8")[:len(doctype_str)], + doctype_str + ) + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + self.assertEqual(soup.p.contents[0], 'foo') + + def _document_with_doctype(self, doctype_fragment, doctype_string="DOCTYPE"): + """Generate and parse a document with the given doctype.""" + doctype = '' % (doctype_string, doctype_fragment) + markup = doctype + '\n

foo

' + soup = self.soup(markup) + return doctype.encode("utf8"), soup + + def test_normal_doctypes(self): + """Make sure normal, everyday HTML doctypes are handled correctly.""" + self.assertDoctypeHandled("html") + self.assertDoctypeHandled( + 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"') + + def test_empty_doctype(self): + soup = self.soup("") + doctype = soup.contents[0] + self.assertEqual("", doctype.strip()) + + def test_mixed_case_doctype(self): + # A lowercase or mixed-case doctype becomes a Doctype. + for doctype_fragment in ("doctype", "DocType"): + doctype_str, soup = self._document_with_doctype( + "html", doctype_fragment + ) + + # Make sure a Doctype object was created and that the DOCTYPE + # is uppercase. + doctype = soup.contents[0] + self.assertEqual(doctype.__class__, Doctype) + self.assertEqual(doctype, "html") + self.assertEqual( + soup.encode("utf8")[:len(doctype_str)], + b"" + ) + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + self.assertEqual(soup.p.contents[0], 'foo') + + def test_public_doctype_with_url(self): + doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' + self.assertDoctypeHandled(doctype) + + def test_system_doctype(self): + self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"') + + def test_namespaced_system_doctype(self): + # We can handle a namespaced doctype with a system ID. + self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"') + + def test_namespaced_public_doctype(self): + # Test a namespaced doctype with a public id. + self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"') + + def test_real_xhtml_document(self): + """A real XHTML document should come out more or less the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + soup = self.soup(markup) + self.assertEqual( + soup.encode("utf-8").replace(b"\n", b""), + markup.replace(b"\n", b"")) + + def test_namespaced_html(self): + """When a namespaced XML document is parsed as HTML it should + be treated as HTML with weird tag names. + """ + markup = b"""content""" + soup = self.soup(markup) + self.assertEqual(2, len(soup.find_all("ns1:foo"))) + + def test_processing_instruction(self): + # We test both Unicode and bytestring to verify that + # process_markup correctly sets processing_instruction_class + # even when the markup is already Unicode and there is no + # need to process anything. + markup = """""" + soup = self.soup(markup) + self.assertEqual(markup, soup.decode()) + + markup = b"""""" + soup = self.soup(markup) + self.assertEqual(markup, soup.encode("utf8")) + + def test_deepcopy(self): + """Make sure you can copy the tree builder. + + This is important because the builder is part of a + BeautifulSoup object, and we want to be able to copy that. + """ + copy.deepcopy(self.default_builder) + + def test_p_tag_is_never_empty_element(self): + """A

tag is never designated as an empty-element tag. + + Even if the markup shows it as an empty-element tag, it + shouldn't be presented that way. + """ + soup = self.soup("

") + self.assertFalse(soup.p.is_empty_element) + self.assertEqual(str(soup.p), "

") + + def test_unclosed_tags_get_closed(self): + """A tag that's not closed by the end of the document should be closed. + + This applies to all tags except empty-element tags. + """ + self.assertSoupEquals("

", "

") + self.assertSoupEquals("", "") + + self.assertSoupEquals("
", "
") + + def test_br_is_always_empty_element_tag(self): + """A
tag is designated as an empty-element tag. + + Some parsers treat

as one
tag, some parsers as + two tags, but it should always be an empty-element tag. + """ + soup = self.soup("

") + self.assertTrue(soup.br.is_empty_element) + self.assertEqual(str(soup.br), "
") + + def test_nested_formatting_elements(self): + self.assertSoupEquals("") + + def test_double_head(self): + html = ''' + + +Ordinary HEAD element test + + + +Hello, world! + + +''' + soup = self.soup(html) + self.assertEqual("text/javascript", soup.find('script')['type']) + + def test_comment(self): + # Comments are represented as Comment objects. + markup = "

foobaz

" + self.assertSoupEquals(markup) + + soup = self.soup(markup) + comment = soup.find(text="foobar") + self.assertEqual(comment.__class__, Comment) + + # The comment is properly integrated into the tree. + foo = soup.find(text="foo") + self.assertEqual(comment, foo.next_element) + baz = soup.find(text="baz") + self.assertEqual(comment, baz.previous_element) + + def test_preserved_whitespace_in_pre_and_textarea(self): + """Whitespace must be preserved in
 and "
+        self.assertSoupEquals(pre_markup)
+        self.assertSoupEquals(textarea_markup)
+
+        soup = self.soup(pre_markup)
+        self.assertEqual(soup.pre.prettify(), pre_markup)
+
+        soup = self.soup(textarea_markup)
+        self.assertEqual(soup.textarea.prettify(), textarea_markup)
+
+        soup = self.soup("")
+        self.assertEqual(soup.textarea.prettify(), "")
+
+    def test_nested_inline_elements(self):
+        """Inline elements can be nested indefinitely."""
+        b_tag = "Inside a B tag"
+        self.assertSoupEquals(b_tag)
+
+        nested_b_tag = "

A nested tag

" + self.assertSoupEquals(nested_b_tag) + + double_nested_b_tag = "

A doubly nested tag

" + self.assertSoupEquals(nested_b_tag) + + def test_nested_block_level_elements(self): + """Block elements can be nested.""" + soup = self.soup('

Foo

') + blockquote = soup.blockquote + self.assertEqual(blockquote.p.b.string, 'Foo') + self.assertEqual(blockquote.b.string, 'Foo') + + def test_correctly_nested_tables(self): + """One table can go inside another one.""" + markup = ('' + '' + "') + + self.assertSoupEquals( + markup, + '
Here's another table:" + '' + '' + '
foo
Here\'s another table:' + '
foo
' + '
') + + self.assertSoupEquals( + "" + "" + "
Foo
Bar
Baz
") + + def test_multivalued_attribute_with_whitespace(self): + # Whitespace separating the values of a multi-valued attribute + # should be ignored. + + markup = '
' + soup = self.soup(markup) + self.assertEqual(['foo', 'bar'], soup.div['class']) + + # If you search by the literal name of the class it's like the whitespace + # wasn't there. + self.assertEqual(soup.div, soup.find('div', class_="foo bar")) + + def test_deeply_nested_multivalued_attribute(self): + # html5lib can set the attributes of the same tag many times + # as it rearranges the tree. This has caused problems with + # multivalued attributes. + markup = '
' + soup = self.soup(markup) + self.assertEqual(["css"], soup.div.div['class']) + + def test_multivalued_attribute_on_html(self): + # html5lib uses a different API to set the attributes ot the + # tag. This has caused problems with multivalued + # attributes. + markup = '' + soup = self.soup(markup) + self.assertEqual(["a", "b"], soup.html['class']) + + def test_angle_brackets_in_attribute_values_are_escaped(self): + self.assertSoupEquals('', '') + + def test_strings_resembling_character_entity_references(self): + # "&T" and "&p" look like incomplete character entities, but they are + # not. + self.assertSoupEquals( + "

• AT&T is in the s&p 500

", + "

\u2022 AT&T is in the s&p 500

" + ) + + def test_apos_entity(self): + self.assertSoupEquals( + "

Bob's Bar

", + "

Bob's Bar

", + ) + + def test_entities_in_foreign_document_encoding(self): + # “ and ” are invalid numeric entities referencing + # Windows-1252 characters. - references a character common + # to Windows-1252 and Unicode, and ☃ references a + # character only found in Unicode. + # + # All of these entities should be converted to Unicode + # characters. + markup = "

“Hello” -☃

" + soup = self.soup(markup) + self.assertEqual("“Hello†-☃", soup.p.string) + + def test_entities_in_attributes_converted_to_unicode(self): + expect = '

' + self.assertSoupEquals('

', expect) + self.assertSoupEquals('

', expect) + self.assertSoupEquals('

', expect) + self.assertSoupEquals('

', expect) + + def test_entities_in_text_converted_to_unicode(self): + expect = '

pi\N{LATIN SMALL LETTER N WITH TILDE}ata

' + self.assertSoupEquals("

piñata

", expect) + self.assertSoupEquals("

piñata

", expect) + self.assertSoupEquals("

piñata

", expect) + self.assertSoupEquals("

piñata

", expect) + + def test_quot_entity_converted_to_quotation_mark(self): + self.assertSoupEquals("

I said "good day!"

", + '

I said "good day!"

') + + def test_out_of_range_entity(self): + expect = "\N{REPLACEMENT CHARACTER}" + self.assertSoupEquals("�", expect) + self.assertSoupEquals("�", expect) + self.assertSoupEquals("�", expect) + + def test_multipart_strings(self): + "Mostly to prevent a recurrence of a bug in the html5lib treebuilder." + soup = self.soup("

\nfoo

") + self.assertEqual("p", soup.h2.string.next_element.name) + self.assertEqual("p", soup.p.name) + self.assertConnectedness(soup) + + def test_empty_element_tags(self): + """Verify consistent handling of empty-element tags, + no matter how they come in through the markup. + """ + self.assertSoupEquals('


', "


") + self.assertSoupEquals('


', "


") + + def test_head_tag_between_head_and_body(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + foo + +""" + soup = self.soup(content) + self.assertNotEqual(None, soup.html.body) + self.assertConnectedness(soup) + + def test_multiple_copies_of_a_tag(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + + + + +""" + soup = self.soup(content) + self.assertConnectedness(soup.article) + + def test_basic_namespaces(self): + """Parsers don't need to *understand* namespaces, but at the + very least they should not choke on namespaces or lose + data.""" + + markup = b'4' + soup = self.soup(markup) + self.assertEqual(markup, soup.encode()) + html = soup.html + self.assertEqual('http://www.w3.org/1999/xhtml', soup.html['xmlns']) + self.assertEqual( + 'http://www.w3.org/1998/Math/MathML', soup.html['xmlns:mathml']) + self.assertEqual( + 'http://www.w3.org/2000/svg', soup.html['xmlns:svg']) + + def test_multivalued_attribute_value_becomes_list(self): + markup = b'' + soup = self.soup(markup) + self.assertEqual(['foo', 'bar'], soup.a['class']) + + # + # Generally speaking, tests below this point are more tests of + # Beautiful Soup than tests of the tree builders. But parsers are + # weird, so we run these tests separately for every tree builder + # to detect any differences between them. + # + + def test_can_parse_unicode_document(self): + # A seemingly innocuous document... but it's in Unicode! And + # it contains characters that can't be represented in the + # encoding found in the declaration! The horror! + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + self.assertEqual('Sacr\xe9 bleu!', soup.body.string) + + def test_soupstrainer(self): + """Parsers should be able to work with SoupStrainers.""" + strainer = SoupStrainer("b") + soup = self.soup("A bold statement", + parse_only=strainer) + self.assertEqual(soup.decode(), "bold") + + def test_single_quote_attribute_values_become_double_quotes(self): + self.assertSoupEquals("", + '') + + def test_attribute_values_with_nested_quotes_are_left_alone(self): + text = """a""" + self.assertSoupEquals(text) + + def test_attribute_values_with_double_nested_quotes_get_quoted(self): + text = """a""" + soup = self.soup(text) + soup.foo['attr'] = 'Brawls happen at "Bob\'s Bar"' + self.assertSoupEquals( + soup.foo.decode(), + """a""") + + def test_ampersand_in_attribute_value_gets_escaped(self): + self.assertSoupEquals('', + '') + + self.assertSoupEquals( + 'foo', + 'foo') + + def test_escaped_ampersand_in_attribute_value_is_left_alone(self): + self.assertSoupEquals('') + + def test_entities_in_strings_converted_during_parsing(self): + # Both XML and HTML entities are converted to Unicode characters + # during parsing. + text = "

<<sacré bleu!>>

" + expected = "

<<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

" + self.assertSoupEquals(text, expected) + + def test_smart_quotes_converted_on_the_way_in(self): + # Microsoft smart quotes are converted to Unicode characters during + # parsing. + quote = b"

\x91Foo\x92

" + soup = self.soup(quote) + self.assertEqual( + soup.p.string, + "\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}") + + def test_non_breaking_spaces_converted_on_the_way_in(self): + soup = self.soup("  ") + self.assertEqual(soup.a.string, "\N{NO-BREAK SPACE}" * 2) + + def test_entities_converted_on_the_way_out(self): + text = "

<<sacré bleu!>>

" + expected = "

<<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

".encode("utf-8") + soup = self.soup(text) + self.assertEqual(soup.p.encode("utf-8"), expected) + + def test_real_iso_latin_document(self): + # Smoke test of interrelated functionality, using an + # easy-to-understand document. + + # Here it is in Unicode. Note that it claims to be in ISO-Latin-1. + unicode_html = '

Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!

' + + # That's because we're going to encode it into ISO-Latin-1, and use + # that to test. + iso_latin_html = unicode_html.encode("iso-8859-1") + + # Parse the ISO-Latin-1 HTML. + soup = self.soup(iso_latin_html) + # Encode it to UTF-8. + result = soup.encode("utf-8") + + # What do we expect the result to look like? Well, it would + # look like unicode_html, except that the META tag would say + # UTF-8 instead of ISO-Latin-1. + expected = unicode_html.replace("ISO-Latin-1", "utf-8") + + # And, of course, it would be in UTF-8, not Unicode. + expected = expected.encode("utf-8") + + # Ta-da! + self.assertEqual(result, expected) + + def test_real_shift_jis_document(self): + # Smoke test to make sure the parser can handle a document in + # Shift-JIS encoding, without choking. + shift_jis_html = ( + b'
'
+            b'\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f'
+            b'\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c'
+            b'\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B'
+            b'
') + unicode_html = shift_jis_html.decode("shift-jis") + soup = self.soup(unicode_html) + + # Make sure the parse tree is correctly encoded to various + # encodings. + self.assertEqual(soup.encode("utf-8"), unicode_html.encode("utf-8")) + self.assertEqual(soup.encode("euc_jp"), unicode_html.encode("euc_jp")) + + def test_real_hebrew_document(self): + # A real-world test to make sure we can convert ISO-8859-9 (a + # Hebrew encoding) to UTF-8. + hebrew_document = b'Hebrew (ISO 8859-8) in Visual Directionality

Hebrew (ISO 8859-8) in Visual Directionality

\xed\xe5\xec\xf9' + soup = self.soup( + hebrew_document, from_encoding="iso8859-8") + # Some tree builders call it iso8859-8, others call it iso-8859-9. + # That's not a difference we really care about. + assert soup.original_encoding in ('iso8859-8', 'iso-8859-8') + self.assertEqual( + soup.encode('utf-8'), + hebrew_document.decode("iso8859-8").encode("utf-8")) + + def test_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', {'http-equiv': 'Content-type'}) + content = parsed_meta['content'] + self.assertEqual('text/html; charset=x-sjis', content) + + # But that value is actually a ContentMetaAttributeValue object. + self.assertTrue(isinstance(content, ContentMetaAttributeValue)) + + # And it will take on a value that reflects its current + # encoding. + self.assertEqual('text/html; charset=utf8', content.encode("utf8")) + + # For the rest of the story, see TestSubstitutions in + # test_tree.py. + + def test_html5_style_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ('') + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + '\n%s\n' + '' + 'Shift-JIS markup goes here.') % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find('meta', id="encoding") + charset = parsed_meta['charset'] + self.assertEqual('x-sjis', charset) + + # But that value is actually a CharsetMetaAttributeValue object. + self.assertTrue(isinstance(charset, CharsetMetaAttributeValue)) + + # And it will take on a value that reflects its current + # encoding. + self.assertEqual('utf8', charset.encode("utf8")) + + def test_python_specific_encodings_not_used_in_charset(self): + # You can encode an HTML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. Instead, the document will appear to + # have no encoding. + for markup in [ + b'' + b'' + ]: + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'meta charset=""' in encoded + assert encoding.encode("ascii") not in encoded + + def test_tag_with_no_attributes_can_have_attributes_added(self): + data = self.soup("text") + data.a['foo'] = 'bar' + self.assertEqual('text', data.a.decode()) + + def test_closing_tag_with_no_opening_tag(self): + # Without BeautifulSoup.open_tag_counter, the tag will + # cause _popToTag to be called over and over again as we look + # for a tag that wasn't there. The result is that 'text2' + # will show up outside the body of the document. + soup = self.soup("

text1

text2
") + self.assertEqual( + "

text1

text2
", soup.body.decode() + ) + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class XMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + self.assertEqual(loaded.__class__, BeautifulSoup) + self.assertEqual(loaded.decode(), tree.decode()) + + def test_docstring_generated(self): + soup = self.soup("") + self.assertEqual( + soup.encode(), b'\n') + + def test_xml_declaration(self): + markup = b"""\n""" + soup = self.soup(markup) + self.assertEqual(markup, soup.encode("utf8")) + + def test_python_specific_encodings_not_used_in_xml_declaration(self): + # You can encode an XML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. + markup = b"""\n""" + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + 'idna', 'mbcs', 'oem', 'undefined', + 'string_escape', 'string-escape' + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'' in encoded + assert encoding.encode("ascii") not in encoded + + def test_processing_instruction(self): + markup = b"""\n""" + soup = self.soup(markup) + self.assertEqual(markup, soup.encode("utf8")) + + def test_real_xhtml_document(self): + """A real XHTML document should come out *exactly* the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + soup = self.soup(markup) + self.assertEqual( + soup.encode("utf-8"), markup) + + def test_nested_namespaces(self): + doc = b""" + + + + + +""" + soup = self.soup(doc) + self.assertEqual(doc, soup.encode()) + + def test_formatter_processes_script_tag_for_xml_documents(self): + doc = """ + +""" + soup = BeautifulSoup(doc, "lxml-xml") + # lxml would have stripped this while parsing, but we can add + # it later. + soup.script.string = 'console.log("< < hey > > ");' + encoded = soup.encode() + self.assertTrue(b"< < hey > >" in encoded) + + def test_can_parse_unicode_document(self): + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + self.assertEqual('Sacr\xe9 bleu!', soup.root.string) + + def test_popping_namespaced_tag(self): + markup = 'b2012-07-02T20:33:42Zcd' + soup = self.soup(markup) + self.assertEqual( + str(soup.rss), markup) + + def test_docstring_includes_correct_encoding(self): + soup = self.soup("") + self.assertEqual( + soup.encode("latin1"), + b'\n') + + def test_large_xml_document(self): + """A large XML document should come out the same as it went in.""" + markup = (b'\n' + + b'0' * (2**12) + + b'') + soup = self.soup(markup) + self.assertEqual(soup.encode("utf-8"), markup) + + + def test_tags_are_empty_element_if_and_only_if_they_are_empty(self): + self.assertSoupEquals("

", "

") + self.assertSoupEquals("

foo

") + + def test_namespaces_are_preserved(self): + markup = 'This tag is in the a namespaceThis tag is in the b namespace' + soup = self.soup(markup) + root = soup.root + self.assertEqual("http://example.com/", root['xmlns:a']) + self.assertEqual("http://example.net/", root['xmlns:b']) + + def test_closing_namespaced_tag(self): + markup = '

20010504

' + soup = self.soup(markup) + self.assertEqual(str(soup.p), markup) + + def test_namespaced_attributes(self): + markup = '' + soup = self.soup(markup) + self.assertEqual(str(soup.foo), markup) + + def test_namespaced_attributes_xml_namespace(self): + markup = 'bar' + soup = self.soup(markup) + self.assertEqual(str(soup.foo), markup) + + def test_find_by_prefixed_name(self): + doc = """ +foo + bar + baz + +""" + soup = self.soup(doc) + + # There are three tags. + self.assertEqual(3, len(soup.find_all('tag'))) + + # But two of them are ns1:tag and one of them is ns2:tag. + self.assertEqual(2, len(soup.find_all('ns1:tag'))) + self.assertEqual(1, len(soup.find_all('ns2:tag'))) + + self.assertEqual(1, len(soup.find_all('ns2:tag', key='value'))) + self.assertEqual(3, len(soup.find_all(['ns1:tag', 'ns2:tag']))) + + def test_copy_tag_preserves_namespace(self): + xml = """ +""" + + soup = self.soup(xml) + tag = soup.document + duplicate = copy.copy(tag) + + # The two tags have the same namespace prefix. + self.assertEqual(tag.prefix, duplicate.prefix) + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest): + """Smoke test for a tree builder that supports HTML5.""" + + def test_real_xhtml_document(self): + # Since XHTML is not HTML5, HTML5 parsers are not tested to handle + # XHTML documents in any particular way. + pass + + def test_html_tags_have_namespace(self): + markup = "" + soup = self.soup(markup) + self.assertEqual("http://www.w3.org/1999/xhtml", soup.a.namespace) + + def test_svg_tags_have_namespace(self): + markup = '' + soup = self.soup(markup) + namespace = "http://www.w3.org/2000/svg" + self.assertEqual(namespace, soup.svg.namespace) + self.assertEqual(namespace, soup.circle.namespace) + + + def test_mathml_tags_have_namespace(self): + markup = '5' + soup = self.soup(markup) + namespace = 'http://www.w3.org/1998/Math/MathML' + self.assertEqual(namespace, soup.math.namespace) + self.assertEqual(namespace, soup.msqrt.namespace) + + def test_xml_declaration_becomes_comment(self): + markup = '' + soup = self.soup(markup) + self.assertTrue(isinstance(soup.contents[0], Comment)) + self.assertEqual(soup.contents[0], '?xml version="1.0" encoding="utf-8"?') + self.assertEqual("html", soup.contents[0].next_element.name) + +def skipIf(condition, reason): + def nothing(test, *args, **kwargs): + return None + + def decorator(test_item): + if condition: + return nothing + else: + return test_item + + return decorator diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__init__.py new file mode 100644 index 00000000..ece0e405 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__init__.py @@ -0,0 +1,1274 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""BSON (Binary JSON) encoding and decoding. + +The mapping from Python types to BSON types is as follows: + +======================================= ============= =================== +Python Type BSON Type Supported Direction +======================================= ============= =================== +None null both +bool boolean both +int [#int]_ int32 / int64 py -> bson +long int64 py -> bson +`bson.int64.Int64` int64 both +float number (real) both +string string py -> bson +unicode string both +list array both +dict / `SON` object both +datetime.datetime [#dt]_ [#dt2]_ date both +`bson.regex.Regex` regex both +compiled re [#re]_ regex py -> bson +`bson.binary.Binary` binary both +`bson.objectid.ObjectId` oid both +`bson.dbref.DBRef` dbref both +None undefined bson -> py +unicode code bson -> py +`bson.code.Code` code py -> bson +unicode symbol bson -> py +bytes (Python 3) [#bytes]_ binary both +======================================= ============= =================== + +Note that, when using Python 2.x, to save binary data it must be wrapped as +an instance of `bson.binary.Binary`. Otherwise it will be saved as a BSON +string and retrieved as unicode. Users of Python 3.x can use the Python bytes +type. + +.. [#int] A Python int will be saved as a BSON int32 or BSON int64 depending + on its size. A BSON int32 will always decode to a Python int. A BSON + int64 will always decode to a :class:`~bson.int64.Int64`. +.. [#dt] datetime.datetime instances will be rounded to the nearest + millisecond when saved +.. [#dt2] all datetime.datetime instances are treated as *naive*. clients + should always use UTC. +.. [#re] :class:`~bson.regex.Regex` instances and regular expression + objects from ``re.compile()`` are both saved as BSON regular expressions. + BSON regular expressions are decoded as :class:`~bson.regex.Regex` + instances. +.. [#bytes] The bytes type from Python 3.x is encoded as BSON binary with + subtype 0. In Python 3.x it will be decoded back to bytes. In Python 2.x + it will be decoded to an instance of :class:`~bson.binary.Binary` with + subtype 0. +""" + +import calendar +import datetime +import itertools +import platform +import re +import struct +import sys +import uuid + +from codecs import (utf_8_decode as _utf_8_decode, + utf_8_encode as _utf_8_encode) + +from bson.binary import (Binary, UuidRepresentation, ALL_UUID_SUBTYPES, + OLD_UUID_SUBTYPE, + JAVA_LEGACY, CSHARP_LEGACY, + UUIDLegacy, UUID_SUBTYPE) +from bson.code import Code +from bson.codec_options import ( + CodecOptions, DEFAULT_CODEC_OPTIONS, _raw_document_class) +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.errors import (InvalidBSON, + InvalidDocument, + InvalidStringData) +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (abc, + b, + PY3, + iteritems, + text_type, + string_type, + reraise) +from bson.regex import Regex +from bson.son import SON, RE_TYPE +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +try: + from bson import _cbson + _USE_C = True +except ImportError: + _USE_C = False + + +EPOCH_AWARE = datetime.datetime.fromtimestamp(0, utc) +EPOCH_NAIVE = datetime.datetime.utcfromtimestamp(0) + + +BSONNUM = b"\x01" # Floating point +BSONSTR = b"\x02" # UTF-8 string +BSONOBJ = b"\x03" # Embedded document +BSONARR = b"\x04" # Array +BSONBIN = b"\x05" # Binary +BSONUND = b"\x06" # Undefined +BSONOID = b"\x07" # ObjectId +BSONBOO = b"\x08" # Boolean +BSONDAT = b"\x09" # UTC Datetime +BSONNUL = b"\x0A" # Null +BSONRGX = b"\x0B" # Regex +BSONREF = b"\x0C" # DBRef +BSONCOD = b"\x0D" # Javascript code +BSONSYM = b"\x0E" # Symbol +BSONCWS = b"\x0F" # Javascript code with scope +BSONINT = b"\x10" # 32bit int +BSONTIM = b"\x11" # Timestamp +BSONLON = b"\x12" # 64bit int +BSONDEC = b"\x13" # Decimal128 +BSONMIN = b"\xFF" # Min key +BSONMAX = b"\x7F" # Max key + + +_UNPACK_FLOAT_FROM = struct.Struct("= obj_end: + raise InvalidBSON("invalid object length") + # If this is the top-level document, validate the total size too. + if position == 0 and obj_size != obj_end: + raise InvalidBSON("invalid object length") + return obj_size, end + + +def _get_object(data, view, position, obj_end, opts, dummy): + """Decode a BSON subdocument to opts.document_class or bson.dbref.DBRef.""" + obj_size, end = _get_object_size(data, position, obj_end) + if _raw_document_class(opts.document_class): + return (opts.document_class(data[position:end + 1], opts), + position + obj_size) + + obj = _elements_to_dict(data, view, position + 4, end, opts) + + position += obj_size + if "$ref" in obj: + return (DBRef(obj.pop("$ref"), obj.pop("$id", None), + obj.pop("$db", None), obj), position) + return obj, position + + +def _get_array(data, view, position, obj_end, opts, element_name): + """Decode a BSON array to python list.""" + size = _UNPACK_INT_FROM(data, position)[0] + end = position + size - 1 + if data[end] != _OBJEND: + raise InvalidBSON("bad eoo") + + position += 4 + end -= 1 + result = [] + + # Avoid doing global and attribute lookups in the loop. + append = result.append + index = data.index + getter = _ELEMENT_GETTER + decoder_map = opts.type_registry._decoder_map + + while position < end: + element_type = data[position] + # Just skip the keys. + position = index(b'\x00', position) + 1 + try: + value, position = getter[element_type]( + data, view, position, obj_end, opts, element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if decoder_map: + custom_decoder = decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + append(value) + + if position != end + 1: + raise InvalidBSON('bad array length') + return result, position + 1 + + +def _get_binary(data, view, position, obj_end, opts, dummy1): + """Decode a BSON binary to bson.binary.Binary or python UUID.""" + length, subtype = _UNPACK_LENGTH_SUBTYPE_FROM(data, position) + position += 5 + if subtype == 2: + length2 = _UNPACK_INT_FROM(data, position)[0] + position += 4 + if length2 != length - 4: + raise InvalidBSON("invalid binary (st 2) - lengths don't match!") + length = length2 + end = position + length + if length < 0 or end > obj_end: + raise InvalidBSON('bad binary object length') + + # Convert UUID subtypes to native UUIDs. + # TODO: PYTHON-2245 Decoding should follow UUID spec in PyMongo 4.0+ + if subtype in ALL_UUID_SUBTYPES: + uuid_representation = opts.uuid_representation + binary_value = Binary(data[position:end], subtype) + if uuid_representation == UuidRepresentation.UNSPECIFIED: + return binary_value, end + if subtype == UUID_SUBTYPE: + # Legacy behavior: use STANDARD with binary subtype 4. + uuid_representation = UuidRepresentation.STANDARD + elif uuid_representation == UuidRepresentation.STANDARD: + # subtype == OLD_UUID_SUBTYPE + # Legacy behavior: STANDARD is the same as PYTHON_LEGACY. + uuid_representation = UuidRepresentation.PYTHON_LEGACY + return binary_value.as_uuid(uuid_representation), end + + # Python3 special case. Decode subtype 0 to 'bytes'. + if PY3 and subtype == 0: + value = data[position:end] + else: + value = Binary(data[position:end], subtype) + + return value, end + + +def _get_oid(data, view, position, dummy0, dummy1, dummy2): + """Decode a BSON ObjectId to bson.objectid.ObjectId.""" + end = position + 12 + return ObjectId(data[position:end]), end + + +def _get_boolean(data, view, position, dummy0, dummy1, dummy2): + """Decode a BSON true/false to python True/False.""" + end = position + 1 + boolean_byte = data[position:end] + if boolean_byte == b'\x00': + return False, end + elif boolean_byte == b'\x01': + return True, end + raise InvalidBSON('invalid boolean value: %r' % boolean_byte) + + +def _get_date(data, view, position, dummy0, opts, dummy1): + """Decode a BSON datetime to python datetime.datetime.""" + return _millis_to_datetime( + _UNPACK_LONG_FROM(data, position)[0], opts), position + 8 + + +def _get_code(data, view, position, obj_end, opts, element_name): + """Decode a BSON code to bson.code.Code.""" + code, position = _get_string(data, view, position, obj_end, opts, element_name) + return Code(code), position + + +def _get_code_w_scope(data, view, position, obj_end, opts, element_name): + """Decode a BSON code_w_scope to bson.code.Code.""" + code_end = position + _UNPACK_INT_FROM(data, position)[0] + code, position = _get_string( + data, view, position + 4, code_end, opts, element_name) + scope, position = _get_object(data, view, position, code_end, opts, element_name) + if position != code_end: + raise InvalidBSON('scope outside of javascript code boundaries') + return Code(code, scope), position + + +def _get_regex(data, view, position, dummy0, opts, dummy1): + """Decode a BSON regex to bson.regex.Regex or a python pattern object.""" + pattern, position = _get_c_string(data, view, position, opts) + bson_flags, position = _get_c_string(data, view, position, opts) + bson_re = Regex(pattern, bson_flags) + return bson_re, position + + +def _get_ref(data, view, position, obj_end, opts, element_name): + """Decode (deprecated) BSON DBPointer to bson.dbref.DBRef.""" + collection, position = _get_string( + data, view, position, obj_end, opts, element_name) + oid, position = _get_oid(data, view, position, obj_end, opts, element_name) + return DBRef(collection, oid), position + + +def _get_timestamp(data, view, position, dummy0, dummy1, dummy2): + """Decode a BSON timestamp to bson.timestamp.Timestamp.""" + inc, timestamp = _UNPACK_TIMESTAMP_FROM(data, position) + return Timestamp(timestamp, inc), position + 8 + + +def _get_int64(data, view, position, dummy0, dummy1, dummy2): + """Decode a BSON int64 to bson.int64.Int64.""" + return Int64(_UNPACK_LONG_FROM(data, position)[0]), position + 8 + + +def _get_decimal128(data, view, position, dummy0, dummy1, dummy2): + """Decode a BSON decimal128 to bson.decimal128.Decimal128.""" + end = position + 16 + return Decimal128.from_bid(data[position:end]), end + + +# Each decoder function's signature is: +# - data: bytes +# - view: memoryview that references `data` +# - position: int, beginning of object in 'data' to decode +# - obj_end: int, end of object to decode in 'data' if variable-length type +# - opts: a CodecOptions +_ELEMENT_GETTER = { + _maybe_ord(BSONNUM): _get_float, + _maybe_ord(BSONSTR): _get_string, + _maybe_ord(BSONOBJ): _get_object, + _maybe_ord(BSONARR): _get_array, + _maybe_ord(BSONBIN): _get_binary, + _maybe_ord(BSONUND): lambda u, v, w, x, y, z: (None, w), # Deprecated undefined + _maybe_ord(BSONOID): _get_oid, + _maybe_ord(BSONBOO): _get_boolean, + _maybe_ord(BSONDAT): _get_date, + _maybe_ord(BSONNUL): lambda u, v, w, x, y, z: (None, w), + _maybe_ord(BSONRGX): _get_regex, + _maybe_ord(BSONREF): _get_ref, # Deprecated DBPointer + _maybe_ord(BSONCOD): _get_code, + _maybe_ord(BSONSYM): _get_string, # Deprecated symbol + _maybe_ord(BSONCWS): _get_code_w_scope, + _maybe_ord(BSONINT): _get_int, + _maybe_ord(BSONTIM): _get_timestamp, + _maybe_ord(BSONLON): _get_int64, + _maybe_ord(BSONDEC): _get_decimal128, + _maybe_ord(BSONMIN): lambda u, v, w, x, y, z: (MinKey(), w), + _maybe_ord(BSONMAX): lambda u, v, w, x, y, z: (MaxKey(), w)} + + +if _USE_C: + def _element_to_dict(data, view, position, obj_end, opts): + return _cbson._element_to_dict(data, position, obj_end, opts) +else: + def _element_to_dict(data, view, position, obj_end, opts): + """Decode a single key, value pair.""" + element_type = data[position] + position += 1 + element_name, position = _get_c_string(data, view, position, opts) + try: + value, position = _ELEMENT_GETTER[element_type](data, view, position, + obj_end, opts, + element_name) + except KeyError: + _raise_unknown_type(element_type, element_name) + + if opts.type_registry._decoder_map: + custom_decoder = opts.type_registry._decoder_map.get(type(value)) + if custom_decoder is not None: + value = custom_decoder(value) + + return element_name, value, position + + +def _raw_to_dict(data, position, obj_end, opts, result): + data, view = get_data_and_view(data) + return _elements_to_dict(data, view, position, obj_end, opts, result) + + +def _elements_to_dict(data, view, position, obj_end, opts, result=None): + """Decode a BSON document into result.""" + if result is None: + result = opts.document_class() + end = obj_end - 1 + while position < end: + key, value, position = _element_to_dict(data, view, position, obj_end, opts) + result[key] = value + if position != obj_end: + raise InvalidBSON('bad object or element length') + return result + + +def _bson_to_dict(data, opts): + """Decode a BSON string to document_class.""" + data, view = get_data_and_view(data) + try: + if _raw_document_class(opts.document_class): + return opts.document_class(data, opts) + _, end = _get_object_size(data, 0, len(data)) + return _elements_to_dict(data, view, 4, end, opts) + except InvalidBSON: + raise + except Exception: + # Change exception type to InvalidBSON but preserve traceback. + _, exc_value, exc_tb = sys.exc_info() + reraise(InvalidBSON, exc_value, exc_tb) +if _USE_C: + _bson_to_dict = _cbson._bson_to_dict + + +_PACK_FLOAT = struct.Struct(">> import collections # From Python standard library. + >>> import bson + >>> from bson.codec_options import CodecOptions + >>> data = bson.encode({'a': 1}) + >>> decoded_doc = bson.decode(data) + + >>> options = CodecOptions(document_class=collections.OrderedDict) + >>> decoded_doc = bson.decode(data, codec_options=options) + >>> type(decoded_doc) + + + :Parameters: + - `data`: the BSON to decode. Any bytes-like object that implements + the buffer protocol. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionadded:: 3.9 + """ + if not isinstance(codec_options, CodecOptions): + raise _CODEC_OPTIONS_TYPE_ERROR + + return _bson_to_dict(data, codec_options) + + +def decode_all(data, codec_options=DEFAULT_CODEC_OPTIONS): + """Decode BSON data to multiple documents. + + `data` must be a bytes-like object implementing the buffer protocol that + provides concatenated, valid, BSON-encoded documents. + + :Parameters: + - `data`: BSON data + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.9 + Supports bytes-like objects that implement the buffer protocol. + + .. versionchanged:: 3.0 + Removed `compile_re` option: PyMongo now always represents BSON regular + expressions as :class:`~bson.regex.Regex` objects. Use + :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a + BSON regular expression to a Python regular expression object. + + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + """ + data, view = get_data_and_view(data) + if not isinstance(codec_options, CodecOptions): + raise _CODEC_OPTIONS_TYPE_ERROR + + data_len = len(data) + docs = [] + position = 0 + end = data_len - 1 + use_raw = _raw_document_class(codec_options.document_class) + try: + while position < end: + obj_size = _UNPACK_INT_FROM(data, position)[0] + if data_len - position < obj_size: + raise InvalidBSON("invalid object size") + obj_end = position + obj_size - 1 + if data[obj_end] != _OBJEND: + raise InvalidBSON("bad eoo") + if use_raw: + docs.append( + codec_options.document_class( + data[position:obj_end + 1], codec_options)) + else: + docs.append(_elements_to_dict(data, + view, + position + 4, + obj_end, + codec_options)) + position += obj_size + return docs + except InvalidBSON: + raise + except Exception: + # Change exception type to InvalidBSON but preserve traceback. + _, exc_value, exc_tb = sys.exc_info() + reraise(InvalidBSON, exc_value, exc_tb) + + +if _USE_C: + decode_all = _cbson.decode_all + + +def _decode_selective(rawdoc, fields, codec_options): + if _raw_document_class(codec_options.document_class): + # If document_class is RawBSONDocument, use vanilla dictionary for + # decoding command response. + doc = {} + else: + # Else, use the specified document_class. + doc = codec_options.document_class() + for key, value in iteritems(rawdoc): + if key in fields: + if fields[key] == 1: + doc[key] = _bson_to_dict(rawdoc.raw, codec_options)[key] + else: + doc[key] = _decode_selective(value, fields[key], codec_options) + else: + doc[key] = value + return doc + + +def _convert_raw_document_lists_to_streams(document): + cursor = document.get('cursor') + if cursor: + for key in ('firstBatch', 'nextBatch'): + batch = cursor.get(key) + if batch: + stream = b"".join(doc.raw for doc in batch) + cursor[key] = [stream] + + +def _decode_all_selective(data, codec_options, fields): + """Decode BSON data to a single document while using user-provided + custom decoding logic. + + `data` must be a string representing a valid, BSON-encoded document. + + :Parameters: + - `data`: BSON data + - `codec_options`: An instance of + :class:`~bson.codec_options.CodecOptions` with user-specified type + decoders. If no decoders are found, this method is the same as + ``decode_all``. + - `fields`: Map of document namespaces where data that needs + to be custom decoded lives or None. For example, to custom decode a + list of objects in 'field1.subfield1', the specified value should be + ``{'field1': {'subfield1': 1}}``. If ``fields`` is an empty map or + None, this method is the same as ``decode_all``. + + :Returns: + - `document_list`: Single-member list containing the decoded document. + + .. versionadded:: 3.8 + """ + if not codec_options.type_registry._decoder_map: + return decode_all(data, codec_options) + + if not fields: + return decode_all(data, codec_options.with_options(type_registry=None)) + + # Decode documents for internal use. + from bson.raw_bson import RawBSONDocument + internal_codec_options = codec_options.with_options( + document_class=RawBSONDocument, type_registry=None) + _doc = _bson_to_dict(data, internal_codec_options) + return [_decode_selective(_doc, fields, codec_options,)] + + +def decode_iter(data, codec_options=DEFAULT_CODEC_OPTIONS): + """Decode BSON data to multiple documents as a generator. + + Works similarly to the decode_all function, but yields one document at a + time. + + `data` must be a string of concatenated, valid, BSON-encoded + documents. + + :Parameters: + - `data`: BSON data + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionadded:: 2.8 + """ + if not isinstance(codec_options, CodecOptions): + raise _CODEC_OPTIONS_TYPE_ERROR + + position = 0 + end = len(data) - 1 + while position < end: + obj_size = _UNPACK_INT_FROM(data, position)[0] + elements = data[position:position + obj_size] + position += obj_size + + yield _bson_to_dict(elements, codec_options) + + +def decode_file_iter(file_obj, codec_options=DEFAULT_CODEC_OPTIONS): + """Decode bson data from a file to multiple documents as a generator. + + Works similarly to the decode_all function, but reads from the file object + in chunks and parses bson in chunks, yielding one document at a time. + + :Parameters: + - `file_obj`: A file object containing BSON data. + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionadded:: 2.8 + """ + while True: + # Read size of next object. + size_data = file_obj.read(4) + if not size_data: + break # Finished with file normaly. + elif len(size_data) != 4: + raise InvalidBSON("cut off in middle of objsize") + obj_size = _UNPACK_INT_FROM(size_data, 0)[0] - 4 + elements = size_data + file_obj.read(max(0, obj_size)) + yield _bson_to_dict(elements, codec_options) + + +def is_valid(bson): + """Check that the given string represents valid :class:`BSON` data. + + Raises :class:`TypeError` if `bson` is not an instance of + :class:`str` (:class:`bytes` in python 3). Returns ``True`` + if `bson` is valid :class:`BSON`, ``False`` otherwise. + + :Parameters: + - `bson`: the data to be validated + """ + if not isinstance(bson, bytes): + raise TypeError("BSON data must be an instance of a subclass of bytes") + + try: + _bson_to_dict(bson, DEFAULT_CODEC_OPTIONS) + return True + except Exception: + return False + + +class BSON(bytes): + """BSON (Binary JSON) data. + + .. warning:: Using this class to encode and decode BSON adds a performance + cost. For better performance use the module level functions + :func:`encode` and :func:`decode` instead. + """ + + @classmethod + def encode(cls, document, check_keys=False, + codec_options=DEFAULT_CODEC_OPTIONS): + """Encode a document to a new :class:`BSON` instance. + + A document can be any mapping type (like :class:`dict`). + + Raises :class:`TypeError` if `document` is not a mapping type, + or contains keys that are not instances of + :class:`basestring` (:class:`str` in python 3). Raises + :class:`~bson.errors.InvalidDocument` if `document` cannot be + converted to :class:`BSON`. + + :Parameters: + - `document`: mapping type representing a document + - `check_keys` (optional): check if keys start with '$' or + contain '.', raising :class:`~bson.errors.InvalidDocument` in + either case + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Replaced `uuid_subtype` option with `codec_options`. + """ + return cls(encode(document, check_keys, codec_options)) + + def decode(self, codec_options=DEFAULT_CODEC_OPTIONS): + """Decode this BSON data. + + By default, returns a BSON document represented as a Python + :class:`dict`. To use a different :class:`MutableMapping` class, + configure a :class:`~bson.codec_options.CodecOptions`:: + + >>> import collections # From Python standard library. + >>> import bson + >>> from bson.codec_options import CodecOptions + >>> data = bson.BSON.encode({'a': 1}) + >>> decoded_doc = bson.BSON(data).decode() + + >>> options = CodecOptions(document_class=collections.OrderedDict) + >>> decoded_doc = bson.BSON(data).decode(codec_options=options) + >>> type(decoded_doc) + + + :Parameters: + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions`. + + .. versionchanged:: 3.0 + Removed `compile_re` option: PyMongo now always represents BSON + regular expressions as :class:`~bson.regex.Regex` objects. Use + :meth:`~bson.regex.Regex.try_compile` to attempt to convert from a + BSON regular expression to a Python regular expression object. + + Replaced `as_class`, `tz_aware`, and `uuid_subtype` options with + `codec_options`. + + .. versionchanged:: 2.7 + Added `compile_re` option. If set to False, PyMongo represented BSON + regular expressions as :class:`~bson.regex.Regex` objects instead of + attempting to compile BSON regular expressions as Python native + regular expressions, thus preventing errors for some incompatible + patterns, see `PYTHON-500`_. + + .. _PYTHON-500: https://jira.mongodb.org/browse/PYTHON-500 + """ + return decode(self, codec_options) + + +def has_c(): + """Is the C extension installed? + """ + return _USE_C diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85786967df3609bc6a2dcf5dd293703469f6a376 GIT binary patch literal 36394 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/binary.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/binary.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3973521a136c0b55ef554a6881bf0de365940abc GIT binary patch literal 10017 zcmd^F&vV<@eFs4Br>Gy6?e%)oZr^y#l$-7Q%TD7F4ro9Cr;!&bR zfeZjj5kse$*qQW_YY&|s?CDH9KD0Ca1A1*QogCW^u08qQQ_>mt^L-Bh36fINTuTX$ z!29ui-|zQ*e}mTabV0#q^`Cmyzmyf_Kj~rkL!)2d^8OW#t=MWyIaI5vO7~hzJ4{tm z;y%^V57X5&-B&ZVUd`I+YR=A7^LDmc_)@WRcK)Se=U-^mDL%DdtQOHuSEtd=RACG!NT$w?+3w)BHi#YK0?H+m+3Y_0{|L?ys)} zMZ(|Q+`hZ@WMe(ZZEmep)>a;`1#^!cteJ_i>5V5_Up=ar57xh2S$z^reRt)1E78OB z>gHD~k2k`{H;Vfn@Da_gHtg~<-)`5JcU#@v7H1u|z0d1DYdh@lgw@-JovzQ_XPuKH z?i}4TzWwY$bLW}Y^!akfsvlUp+a6ISwdc?`C#Ai5PD*)o{^yFWRL?`^E(V#qg6Y=3L5!24$Jz~cck@w&$zx%*5)n!!SxzGt<%Lr9H+!9GuKEU`~N`&KEW#W0xD_IbH1U@~?;#^h#9f+s{n zGV-|T@39apyTOi|trl_I=ENt-UdHUE3wzKyA-+XuO4`F+%Nv#pn+7Z4MH?@NEG#n; zl;L9=mMw#=g16Yvav+4n&gE9~00#tSg%mIVfHX7@J1u?)yXr}RT@o5HRernPZW-ZZ z>>BfEvE3mPY_&=fhgyh4I3WiA`JV50%Ga-x4f8s@ZnWLq>mOaG+h(I#7k2zk&5Y** zf2fMoB(VDkL}Q!!p5^RvyIf|lkm20TZl}|BNqokL`^||G#;8tSD*BKOBA2p?%litA zuk>-q9zV!s=k44OR86rUOkKlFd>+C^WrDgMt)b z1o>Fqg2F(`gR~HWAPXnSkI6?K^24@!a@6F zbw72ax>tPN*5oPp>HW-s=H5b2O7K5R{6=pMz2EJt`}ya(Qx!c0^!$bBN%zyXZl`~y zT~_Q2{<1$yT~^SSwsXn8OA1#1j#xc~)qjQ6Mf4Q>Y3w3k_m#fhPrcA^wt4H{5$~+J z-14Dr(sWC5S$jwL`-a;-#7JoFDY6LFn|y{`27*eSW38|I@6{}2SG`a|o z3<69hQrc64t$1Gd5cXH7IT;HFDt9zc|1%boB8K(=wqv>N!bu2A(Ii&^d$l(J156dGX zlOJDhM6nupDi_LjlXF&fd81r|t+ZPRCYFi7Wm4K@{zHo_e2q2WFKrGZ((;CwHZZi7 zjYAY>_LEOy@V%=9iJfAzXiSLRufC+)5q=F;u_JP~Oz6Sc9J1zN0ujl;*G4gglv)<= z1z!r+x{dvkaoKRBYcNsdUc{cI8W`!8N1)4@odLBX|*jo$j7`I z^$wq4-hbfoXn}GO-a*T$xl}>bRPCLf(}lk%z*iV_m(taY)|-=uGdO@cks5vIo_vS! z*8hc@zOt|QD*VI;7x-cQ4_-$9S?AI@K6jxK!4p9wfw zj0S$Luh{x8)J?_di}5^q|8`^?d5G{HSsNLM@F?V6^2xqS5u95B4*8^i9)VL3`&dQ2!#^OF}T>YGP|4G?OI#xAh5wfJHb3fl{<_!Z=D|2Hq}4!EVEGk@W}z zCJ->80)KEX<8babFq;NOE;l)TOxP^6DO>juyevb#wJb} zw%{@eg_*RHW@Y8!`esRU7YNdIYT{as2yug~cJIf*dsjDQic2}du!_pELlg#phaX|p z8&x8o#9Q#~4+&>sKlK=sFrH6fLQ_)V<=w)K52M;wUTCkh*C=CNR-VI{BJt5-$kIrS zuJzSd8C!d;K8KkF*4YLH#i@$SW3nwcFlYIbQZ7h)-41u%%K#b7nC33`k%?IDu4kGq zWnR*mkv|GDvYa4Diq7LI2HvPa-ZVv#0E+~XBK7zKjNKvn$U`dHygCEk_b!I+Be~a@ z523vU+esj!+{67QNYVTh2v-{#VtyU>$n6^10m!rA5lUL+UMVe+CYl7YQpm~0y^&%R zq}#BE?x-MTOq2h>G}j4ds)ppVP6^P9n zwF1<>g&C6FD2?t}-X79EoxUZipV9EQsTnZxkMLND1x4-6#>mL^W6UFI5zHehkQAv0 zS`i4icVf8TiSOcV0+8>ZIQu6_sUhj)Mxrl#`(Sh;R{f3tVD^+`Aaq8p38kw_I7e;8Mlaou-EJTS}x6&Y5PlXi`nZ zJha>c?gle=?^jkHKZ&Z!A}J20gv6qZv)8tzg*r!YC?s-8!-5?AC3M3-5t{0fIJ>v0 zq4RK8s38o4=}`FVDDy=MAczphC{%$&@gH${AD}^n_yb)l7BqG4=FF0&7ShFRE?-RL zQbI23n3DLAaD9PG=zX#XYo|~=)hT_(H;VL>K8qqNf*yKBfr5Pjr!W;1$g)1*yH@?g z3ZReIuB}lly1KHpzIN>zvN0MLHB3-UVK~f!DCQiu-2)1}Wq2>bch5&4Y)6IBL@_!H zVB)fzti1|GGsr634+@hum0D3~A{dSx7vWr#K911WbfU0f8r!vL7LXM=AtWxJAQTUawDHx+o&pdFNfEscOCui>%aQG%Yq2i6Q z?&1Q`wXhUoV1U+BKf`-364fI?`t69EQY1Xl&IYsq=W4bczWAdBTDnjUr6`g&Lu9;5 z>}KhCDV)x2Gv@3gQNp`#FD?MZg)#W`cGvOA6Ntp#8*CCX=6ST@#t^HC3&yD{C#XaW zB`VCs^fj7}J=k>O(x*4Rekw`-I>dpdjnOlN-$!g!)=8vHg;65ADXq15;lgeW%?J57 zVnG$*ljQb9oQ4*QW$>~stIp-hE8zZ>GKv0Ear^c2C3+|sD2CMca5#c>A&4=K{8oJZ z%}?h?3m-Qf2+`9CbS*{d@b&YvPb|rySX9n9CPD34j*PowVFQ4a`IgjNddhVf@_vlIQYu& zm}7@L>H>rl9v$`D!e-Y{t)-aD6P`DQM41y@`~PNy!y@Z|yr@9>sUd|f5e!r46u-s5 z4?+-|BTQ9o)R%sdQWYOLgpc(q0M_cb%$r{oE5i+)L* z8i*MCzXmpV*)S5(P~0)fJQOr3E(*ItuAwuo;|v8V6JmlhViAG+AP8|OrNvJ~3V1hB zKWOnI-s*h}IUAISlhQ_(S`?W|1(!G*%tulL*YSP)+ysH*Nbyrdv?AV?Nf@R6!8uV4 zl~Ii;WCBTnC~2m!`@~$CVclO+DnI}fDo^VAuQM6>It#C|<_D(|zs|z+_(S(}t>O~- zC~_1OBEy^r3Hl#nU}6$NVgKLI&XiOsT2Is{B<|R0IA0!1kKzpzrGxJfs__esFy;>5 z-=NkvAS9kMc(33-JPl0)1AiBzsrP0Fa6}X|h8&S2xIsChEX+n3+uUI7;=)yLp>+DT zlmPvGysg?hKUfOx$TY1|%8%q}E^REOLS$9<=#eN83DrmExn!usTn_ zG8)MiMY)O!??YLlsACPPSD(_TsNsux*G&RG^>FR8819Ab&GpCT+WNiwmG$`7O;RO9 znSzLzM0b$;T>fb44ngY}T7~U^Cj^m^Vl~QQc4oHQ%YE7kZC>BC3g(AL8)l`C-NbB*=INoHv>&}c5 zY}^a&fg67zy&&~RaN)#(U$9qB`~@!XytC`XY0E}4nVqlqd7t-r-!)%fuRC~d|2E@n z-Esb+m*pqG%S|+W9i4Exj&OySxFfIYjr^`Z3cA6l(yh48XO8ei@Wc^;tUmU;E26UH zG^?}g_p>a~Y>+9YVLzI(+qN-_oIAG z8-?AWnT}=d-+i!|uNwJ-vF{OWTz-7K+(grN&`GE30vLRU{qC{Li%Cr2 zY|6${Gt5%9*<@g}r=x5vd-imBZ?D(MQrYX#@<|&D)s%6~%ut@N&DG9igus$f9Glofdvbb^DZv(ty2U;p;Hrf& zVuI}8K5jjD{s4;&JBX8nW&2X87$V{6l#W;dk)q6yo2C0wd(9HKCD^6E?Yms@ku*~2 zw%yIxwK6hoc8e9XLy@WBar!cynvD37`#hO&BSk@T2Ait9jxEQPk$B*DYAH*&fnjj0 z8Xg%b#i@tcBoQY)yoQ*K_;^fg3{*B^hy-$Y5Q9T@nI8i!$kR;*j))(Lh<_pn ze3BTrl(B_0TkJmkqwwR_BnF9mK)fKjM|cXDkY5(Xmgj@m3;|>(-k0fuF5ZVSmZ-RL zW$yrL(@2{oHj1kjsw*VU6K&&20w?>&PCPF{_;7!Sss$ONoxoeh0=Pwqs1#YN#h_S? ze2IoU-I1c*W}B_|OXqMM69p{=O}03m2rqH7V9Ux$awrWl>HYYqw@BT;QLdd%%rQ1^avO`zL$t@7AYZBsp5nPcZ+O?Xe;r{1F= zZ7k;KZPu8(yQ}jctbgmIX9LHqO?O>~{)9ub51iDy?#w;mOkDLV?)6M#cO6!LhE<>J z&4b;#T|K1H;l><-$b&G< zt1=}hdBvK_8zE(B7#43Ew~(rFe`1R2uRJ=x@^z6zd37=tkaV+>`%wbObdNekTdIY8 z^FYgF@XS$XG5JqNw6~4OqH8Ahq12{qG)1KvjbTS^kEckC{ms?~+h4`~ zZ5QPge9|D(?zK4j%rYmv;1 zHC^=zE_&vw*YVF%QFL$6E75fiO%t_FFsoZ=mi-riQ3x%t(-2(UsnTECD%(*YD5@Ant6vnoa!CIV*EK$bKoJ>XzbE>&)WiGi||e}P^&nkh~5GZVSMIUe)5X_1U-i?uZE#~ z7>3_tqYVp%`@B0_D?!rQ3lIsWrHg(SQdQXV8a9@l;`Z~HeuhF^s>+-P;ns2(D zW<#xEHLr)^C=-(evq+lo;e;nercr7^_Qk0xgH`y7isP|ICf;ELVUf3re8%@bAxk%SHI}F^-9gJRRYiQ*=g3)+gR>yP^utH lHYu;Tv6*YD!*L<7(kPbWnV5R}bTQ#-GLYEMFhN^_+hQ*N1|`!I9@q^(gMl`-gGo zaBvK791jZq5&!6Ot9k-Yj`>IMaM31)WR^^gD3te*5w`0rr8Q@(Z2D8JiZ z-0F0ik!WNZ0v>Y9r4M%+nb`^@q@bPbmOqojw-(aAB@einap|HQ7pZB+zR4{ z9Upf}ZLbyhaj)A9%1&ahezKO>-gZ5i*FC$k(+y<2mrUbLjPJ&K-JonINACAR|8CHg zK@_xOk0wgqUA=kJy?_74x_fuy&fSfB8=G6JTQ_cR-b+r7x$ADO-rBhLn*g-cO`#LZ?E0Ig(bMRR`32~ z<1Tv54Ns92)Bs-_avo&<_NV^JgBV?wcbdJOW+1@2-Jl+ePFuA0Ad*(M2ZA4T_Z|oB z#}_J>AKVPLA4FjsEO)*7BX1{&9&AUQ_E{F5tA*FyOOCqId*TjH{yuSs*ko8UraXe* zI$h-dY+PK!5iQ~r7|?%%biZl`j&J$)SH^R*Iswgd{0VMP`UNm{GMV0jh&S3qhV<@0 zG@p1;pjgMs<_C?iO{zw!kg6IpHi*QNhhhDp@Pnu>!|gyk>^u=(N#L*Ei{efzeZ^}F zJcK5;BWN!aP{bXuDG;58h#%q!29A^__u8N$ioLcURZ2Y48tb;6u!V6&*n<9&?D_3l zt-A;HZnKbUH9>+6x54`*fnlf%k5j8<1i0!2^i_sI`+X@#h>(OD1R7 z{daPLujKmF`8oB$AGOEQyQU~(5$uG}aZP<^o6X=Y=(Xf=jGjz9_L{w5l7yMt%f+PVy5#CyHz~PptK;{Y)ShwOFMD1yeKP5ik-4rcU}SlMPPAHil1^me zxf3x`9>r+^M??XsXgWp9EIF3R_rG0pTo05vehAio8|KJSf>c-3#~P!TH`uo~Jn~<^ zhuKm0u||jJ^#?J!b7XV_-i$T5PEU%?lQtV=YG{(e)QEB%;QiaTWE8(MMxAX)#IOT_ zY6bperN+vv{5wp_Ys$d$_f+@@&ay(o{r@2&7{VU{bkJ5I8J9d z1m_=T1rm16EOs^|7-nHkIHKV-o7>0>Qw@?8LGuc!CJr$ZJa@YjQ&Ir^3mYNk@*2o6 zd8n{WNmCqh7Lw{+t(GSp;!b@(vN?1_?tl@Vgz-a=DUg;*N+mcY8!U-aD4qZj0u*u= zsz9Jm2S{F7QTi^#)vH$p+YV_^g%c&6;8OBNc~+h@o~zyb?};lz-4;J*`#--V z`1gnD?}a5%sZ_pLN=HGP63{pQX->PG>IJf_sQ!jbPt)_el0Bwi<&Gzjd4QkMN=nkQ zsPVd(5m8Mns$}15mRH`uc(`|xXFZ52;zlDKMv!q5f6{Rv&<<)bbQP^$GY*k(s`Q-9 z-9vJ$6K>&&2svX@CBnoRmFS_ z!|o^%C@WG)0b=OlN=1LkS4Ay6mBFwzB&86Vr3{>lhvb9{Jqmq96g5{mo+?GSGNGhN z3OaG-#d#S;yz&GWQPt_3XQ<8}AaR1Jug-;$no0SPT-wH!BB~||4zBwYBXh_!%sI0_ z|5nLFlr^o_1-pdb68;@LQ)k@Af6*+wa$fg2<<-2a=n;ofUQ$Pj+pLZ&XfRY~w9IFg zY3y52t?xgxV{6|e<$=n~`}V#Gg@F1&-JE@gl<>=WRtslSA|EsWZXI$zxqsv4mV0B< z-TLg##=ZV$B*hJdY-I7X{?KdhD5xTHAjCV^yA0Ck>x;!y0??9yA5EkEnW$Wzs5%te zWCc@`IHTS+LlmlvEE7RWFmefP?p7_pWniLYGLX=XXlI1`@=ww8uW>|kI2q;)7&>EG z7MN=Hzeh_MFmB2EU>1S<3DfRd?=T>wi1}sSHASHQZbv{7bLEA~&6KGE`bZBmt3-SkeKXI7-bDN#` zhDMMAUs6Rc|AbDokg^6PI!JNkh=`Jc>jq!C?hABGr8EaKm@!MQEvxjZe{@(%+!q{v zQz5lXlakaWWv7zXn46HZUdA2%7!Upehc2W}mQEF?iW8FVCo^l5eBM^r@7D!M%99l1 zzUw`KLMKOi0B%_fIpp?quN{&@NIjK{g?6M1!|z~X5g~PkUY>^l~!%uhGxx=gBdXly;+4g$Ga1 zfB4|(xpTSWBRBNv@^jog|KY_4PcNTG0~djZ-w*J6>A}-F?qAx*vkTO9K~)W;WqQRa zW}a4AUK`0PgapYV7Z2O;CLxkaDvOwsOxS~kN0nQ>m~`Tn*X=?nYQq9%?GURP-d+#u z@uH7YS=Sl5^!c7x74$$&og&+aZ~9F^8EyoCof2h1)f4~16ol)hTO+Q!NLccccogg% zn1H&=AnwUFaOh^^bM*OQ>|l}FXUPw?BsgUrJ7zW*cln zVV#TPNJI}iy`~SZ(T+lFF2ZBQv9cGaO5FK<=e@VJy1Bl3cU@UWU3QQIG*MFYu%nxe zMZ3S4emiW2@m{{R=Nt>OFB2D*X{F1l8LRPpI7|Xh(vhHD-;}CB<48)JzKJw_W2306B6M8fYeg2VF8`d3{YGU~kT4}d$TY~S zsu(X8wQ$RtTddWYUJR)Pf!~M-sZpnZI4AQ=Q5HuuNk~%=LLNik8IXqDY3m$((av&! zrX%3c<9aisPYZHBM2|)4iO(7&24ko`P5sq)iuUW9NkM6Lo$xmON9`#b40!x28mgAv zwNS~Pj#0w`VLKf=K7N0065vjTb+(6XX` zK)*>I`Ou5`ebn7R26mDib@ft}8*EOzF~IaMev>liMpPe4 z5doWUBK>9MdIlYa6BO-3Dym!mQo5~^e$pkPqI^O+gjF9;u>pyQ?W%<=(LqFo>qeRmQ^5yw=c!1$Wo z|Iyvy{0Zt!ZpM>4Y&-)fqK+-(m@+x!B`UyF5{Haw)Y7gHbgj*R;kq$8&z-(Wh51FL zZmOA&PqBjEJeTg zl>^JlAX1uc0P?=DULqW5h_?WUmtbpKo+t7cyZte>#?Z)MjggIq#dEyY8cpCvVLv;ioSR=y@wd!7IF!A{(7gI zav7?hpAC@#p<0IYMIL|rrt`@GGC~>LTkSZnZ(Lu!kL`iA+v^)^?(IALsj3d`*&t(k z!C5Ofb*MYXo1r^|PH3p|iWol>d3LP?i+Wu4=o+42T6hmV9c%pb6a@5!JApU{lf8=> zaS%L-CMoo~BO-(f^JVK(k6D1C2i$;xdCQt4qQVN27jhP}~{Qk+js4DrM@ExpU z@1bw*%OP?ll03R(iYuA1WKaIA9wv)E8XUX>*+=EZ&_5|9Cf{;tJd8AP}05ps9K#q(&eBWHoHtZ0?;22RQGu}U)-bYuYR zdQGNEl4Bq5=E$f#8q7lIdKgCdms_=Q#1}?p;tduq3yjJ{cniT%G2}D(m9(g7XQEEOM5*9-$L` zX(@Tj^L@0Ef(nP6Ra6HqbQ>QkE8eYA|2uRds&lN!G$|>5jLHF@fnGg?9ue)zImjA{ n_?&vide=HO;n>B({IU6CM-I*Zm{shRQ<(ot<23m6y5RgTn3m${ literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/dbref.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/dbref.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f850a15cd991cfd127599c14291f3bf503419b08 GIT binary patch literal 4507 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 RoQ42M9yMyG^mHb@@IMDPrPKfb literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/errors.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/errors.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3aac3bdaa25bd0c3cc9da1605ee17b9363731be5 GIT binary patch literal 1252 zcmb7^%Z}496o#Ek+a&F11~zP1n9Yb;v@F;FLZ~VoP$kqs6eLttvfS9y2_$x~-9obk ziD#LI;6=LSEm(1!gqb3hOC9+nzw66){+yH^97G7(({Ba+>Lc{sitPqts1IGgg}~4h zJx9!8?ia*d?tJ#9E@+SWpndLw_CPmS6LhoGKIj$;KnJC6fDTy%Ix2OOwI}GLQyiau zig|7lDKu6z(VXG=8k-A_2a~fg&T0IfE_g2nir<<8st;WsLEvcW0He#CsmEN{*V}}4 z`KeM;6?X?za~!8sYkV#hrfFJj&aaN{MHt%n(%%Gx2%2$1HW4A2WXse(cL@2gq-p(2 zix4JbLN1YN!RclA@sd5785r&^(&ZxMI9Ku=j}4XrXKNhGEMFR~X8C%>#p-_V;p{~+ zpXtQ#Zk?l^&9xNwxMkM8e64JXH*Jb8gup5F-afQPVnx%0Sv!istIFYz7hGVY)`?hP zBXO)aH5}8*6*(`t&y~z@QZ2@e8d`g#EX{S^)l*={LI}5@|KhcJZ{8a<@5Cse8^XE8 za5psaATfH~;Va+|1@iODW6rQNz-MJ~j2Pa(JUYO3yv1tu_@t$paNmSie*QtW#{gyxlQo6`bM7|!VGN}_})>Yx_$z<{uuQD literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/int64.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/int64.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40e9746b8ac9baca626b8a70b5bcbdcac9fc56a3 GIT binary patch literal 804 zcmZuw&5qMB5O#jLl&T97LW1KQx6-yqv|5R31q&Py66#iz3sEK4ji+r`#|gI6Dtm>O z;URdDTsiG4aAJ}cSRqESx;}XcuV$AM*cp-MXke8YP?=uCNunJj z8uHR@GCl0w5I5_2RWSWHjO+Dn^T@fNVIR_jEb>T&FTE&`eiX`pP715mTkXz9;ss&f zV{Xu*cETl@hHM3HgL@rx>e&cfnd6|-0kRL9!~%U9W3*P75|$W?!Xn@n$)f~Z8=*iK z>5>W{sL(Kum9Tcapxp&Q8m4Je2@D4?ONCPZW>TIZQXOX!CAjR5p5aqimLPE@3gu24 zs%7DzDd%vigzjXI8QTKsCwPy{Bt4HVdoC#GK)Eny1ecxPldTc^NpFi zMAA$@FXedd2-IJzVyzHzlYPS20bNa6LY$>}L1O25xkbGl4xY{5CCj-@9QJb&Ux_u^ z`O;?kNpp9Dyfgt(KcZplm)Z8hP7|5*j!c^Z(Y+c?xM58#obf4G1(aQd_0wy>f9360 Y^&e2R&-X<>zfYd6xkA6|hh7-`0uCbGS^xk5 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/json_util.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/json_util.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85873ddb5c4928fb786b73ee3dcaba9c766a140a GIT binary patch literal 23811 zcmdsfYj7M_cHVT)6N3Q=f*|}c z?H-aC4z%);-bZ=mZ0y*MosA8;wp>h^rR#ByYP?e=AN%aBLA5lTK|%G zcnz2RksgVNNIoJop_jD0#&PgT_}r{ zy2|N%y4;=bE@$!?u8Ws?%DwsC^0xf8a$ml$ygk32%M+#k@{art&L>L)<(>JRoKKYo z%e(TsINw#;UEY)5!})Y+Z+TySALqME&y=6dKg;<{>ACXr`R6&`Q!>ggDMD-K#TKVbzJQIM9aTyy_`SC&#&V()Qp7|u2pA^rE z=N?4z7sT_zz<~Z;O}3Io#*OE8;xv z^Ws(U8tw~XLQLX*O@{nd zHlnnS-Oc5ULg=mI#!bgrv&WAfy#aKnE#;Q0<)dX{T&LGfygf5DIq}LX=9U5>)X- zk*$sLOhsJ!9_Rx8sL{@84^K1yy6JNcr!c510ThO|Wcf+6tpD+B*+MTl$9p zwlt*a(by26#k=;?AlFl%6Cq6#2NiZ=ItsavX~!mN@8jIDV~ku|HkEm~&laA*Iet9p z{WNZ*T$w0A4^TQ@X?@ICuhv-aDVvp=St_j?Yf#l#cUtt+Dd>k)W1QrfQbcn~gUqF8 zpfo~Bb&Q+P3!yoL)jY)!bCb*%mA)BnKnu=YK(d%FLUS@J%g|U4n*8#0!;}_OOi$0U z9SM!j_9u&1`da96&32%GcvH2rW9g-uV?ZmtQ!JIB2pTJ__ZVtej0qjGWMPHUTCTCa zsMd*o z6)mo@ZE%Eiu2tJO=j(xM>ubfFs>@a7jidC8gzN~f?fJz5n;516mDZxMU>LAU4A7Gd zf!Sb@J&|jB$s$3`WKb$?9|*w;_0%Md5>iY_YlkHO9OHK>L&jLD6`_~2aj=FZ^Eyh! zC0avs1syb5uMK9tbxzQ|ZrRvkD6g0VOHyCYXN6o@QvP-*WnY?i3aqTonRm#9n({2D zMTG^P39}4@zF~>+apOep3=O`3ovGHGHK3Lk}&6r73Vw{deP5sj1r-tb~qRcRZnWXF`82|!`4)+JN~?Uv=<9x6gy-QhcKb96@d}y?S(h~HVL^r{ zo`^9oQSYlT;4FC?^Q=mN`7=gJvKon#89==;Bft}-osW5Tz!=YSYI4qEI`Q|8jC?5F z9Z>Wny-=;3S+fTunD(CW4`2ZeYG9OLXE0{LhgBY3g6wKwaSt7#=#ZUlGpF$>a*}VIfwa&R>MdeagmR5m=Ga?&zqgUTM z>2?*t>2Q^8w+94m0g(%YnYP=lgcd)!T@GX!XXy=dXm%Hwt^fn@5Un}O*@UYVU9IG5 zWmmIZt>$WXv(ZP<;i7mH8jU%_RkkfgL&H~uv) z{XYgzibVEhAPECR4$}fgkN_a^06mOSa*&cN62epVf^3Gbv8Ta63dO033LVqc5E0~!^v2VMCj=i?&r0N!ZMCq)YRF3}~@ z@HnQw7Kugj-Pr$bx4T6rG3Nj{ux4}3u9bimHaoKn&uC)S>FIn*-D6(hl_<9%_z@`H z7{6*tpbB=-X8j38M~p>6{$;12OsWEL_{DKjtriy-WX)P!9BX40pq&@3%)Mvzeuv5Qy%`b;SoBy-%w#f$JJVzDfm z&=YVWVL}vGkRd(>;E;|HE+np9!`oSQ@Y^6df+YoVfmBGJ@A|{%{7iUCL1*9P@KI-u zkW-}HI&p79Yhb}o+DWR*5%cwTux;alw?F*`8jGI&(7GE%R`{N@7iwo|F1)8Vt-Ha7 z{-+qCmE+!QA_pB)C8;8qvOV#(n=4N>TUJi)&~e7FKK)@titQ2XiT2FlkvG zNu-ITK3N(estq=W?Sv=JBX{+^g*V{e-%2S?ylTST7XyydvXjI^ z>eUMNi(VC4Y0%q;sLu;pnL?Pi1#hUBh&VKnH5dx8_Bpo?H83-$PWm_2Inms2kH6)- zx+XSpkjaZo5Tzi}#M_7@SPW~PcWxG!Zw3Q?v~~8rd@$^r)f$WmWs2}%9)y}JARZdt zQEU$fpP+8FA|`Bd8!N$0h168X*0>ePpXGulAlY%@E0aD>0wlMv9Y4)L3=^pNwq;Qy z3MMGYg-}3;WwRfPB73MAq-u{$c_O-LHkf1|VbGJgQ%ZU_tC~jd$=r+n)=VrfTWb#Q zmZusZ6b8#k34G66!5q_j)y3sFD=;b{-HcS4ZMf|JfTWSwgru-_d?i z+ekKIP8vPatKGOV-18&!j8o4>tdT7AG?J@5RDVmCzatVT>7{qzzD?*z`zoir78$ho zK9^Ao>g%`YZ)nu7LG8CSqSULAgo>4%byGh1FSrRs1NBOa+7-}X8xu6j9{(kphCo+r zWz1;m)?*Yw^weu*qCG)&*WYe^Um(+-^af9f<>3Q8R=pq)PZzV>-RKR=k$bR*tYotW zEDzD+VM@qwaO1EQEh&#vJ_!rLx>G2yo-2=1n`2bo6->zO->M|KyL@tQgO4(&pivV0 z&ZgYxa>+@To^vZ}FGoAn_u4_@&_&I<%KaJSg zWGC3k7cnihd)o>DBjk<9YLb8?U!|l8!3jJbBM9OMLnK1MID#JjGk>9fUf&mjNqE2z zYzTSiOb)|_>>?-P04jil{xGtkHMGqr;1k0I_^c*yC586w*h5W=G&F|Nr?E~8%BEVD z)Z?@60y(JML~V^A*s+_=i_K>|Ue6ucmwo}$91oVR_j(J*;{R7FUf&a1dh0l$g%fY2 zg};T%eho<@vKhgWb)ii~KG?ev#nQC~_+TT_h~C%19rXsd_T`cKjbMSZW4^sbQ~$CsEC+jHm0cQ6{?P5J+>P~+TuJQ z{^Vv_7cxb-#>d)vz<%`IT3V~`ZrRGvsLI6Yr zS7<5RO z!rhcp6y`iaM{I7fClAW?a;Zin!kvAsI%KDKR;qH6g#4tWHL57r7y3(D(J-V?w`?)O zFuorjMkxFCp?Vcpa9FBEnf4t8MDHC<4)%=LAr(2mUSCz7n!Y%3?b1SsoS`jqyCwm& zs*I=nF?^L#k!c5Y(W74&jPq7AXxO^WFL=?39J|+v5dZ32>@=DWTDaNi(ap5(2zh(g zs%!2*C%CvVYU;+>PX^-Qj$RZD-s>p5S@IlETN1fTV)bo=E(!a;LG(?e5b4ioToNLb zC@QFyHECiiO+xubgx!9+h(1U)bP+ojA;MwZxSeF;=5rY6DM=>e<(mja4=6^gY&g#r zE8L_2C1Np6y72;m6kG82bIyb>4JQy6=>P+J{>cxxxcH7)sJ{_yTTF#io=}XyR=g1rh@11f~`f)QNXn!n@)zJY{m9bm3rl< zjbd8cmBYHQW)`K*q=3RWKYgmTP&`ZZ)VY#bUJ~Z{f8bL*Was1hE+)6!xl$DYI{Q2_ zs+F9_TcI#q!cAVLghB&uoSQ?qK1)SS_QG=d8kMn}eiymlqW2__iR{d1eY&KwWm38Q zKgtKD$pbvl`h<30w+A?<-`8c%(So2uiuBR@&`|H=2>85e9Y>q%4!8~(F)Qd{Uw0DR z16DiuQp9gv&p1g1y?0^Y#3D{={Ua?x|BXl@@*c{LMFiQ>srm;^IgJyS%|px(cQ~)? zaag;_acl!ecOeQ9Q-VX@^9p&*ATHscud)WIIJ~6obmJVm3vD;CT5@8X#AO>u8j%ln zU)MLZ4ZWcOAUbXRivA9!{Gl!|VL69J*yyXcA(pATb73k|dY%y7d+qc}t~wZzN*b77c5oK)?rKrU7qC%};(P|!v6k+-OxZl3vg)ZG&Edz5aTv~e{@?xlD2dJU%3nE&Fa-2uo32ZfW^6kTS~vCu-QD3;DOnBQ3;^Qp+R`2Xg6Qm2Vcw+*e?HzY3VI!ydlfskynx{A_J=1! z!0xan!0z-ZN&Ly(w`CmYOy1E8ckkB9r8Ncl4x>J4U{Uz1c9;-|!CgN5G2gW{t?yA_pt9ekJ9 zz*&bua0WR3kr&ZD5eKd?`!wpnFa5fPhEPF#H366XJ5F*l<#cU=w^8edaFanvX?X_N z;s8aWeh5SkJT^>q_QCsDh?xe3f4sAc6w%J{X^{G}lcq4Ze#}!)SBh3i9JI6J#)vJe zn0|e)>hJsWO@o}Vl^fJx7H2S`C95JWG*s|rA-aPor_JFl$uH=3Uz?r3I(=d0;>`4v zBrv&M6eD9VxEo`Fi_!cb(teS~Y>L_Dc6FIB&0PX_~94aj7qJ-AWppd^zxh^F6)cnH4?9{~ERK6z^ zgv}>Sn;|3n(F`_w3?5$7O(LL8Qb7TSM$KmwUn{T?(uTh7wt`n%l|0&Zf*r|*h@OJ0 zKaGFTH1g>vo&ZlA=J|EhhR~YmH&9f3v?dB>+I^1Dnw|!ku3@o5iJ)fz)CNVvioX?? zZw94t5&3!DuXV`x8xe^;kv0? zmmhyQ8u^UjS;8~UG!enOQSe1Kp}sY6yOvI$Vk_2i6Y6*iuMEtgiCupaz2vV^(nj`Q zM%jS?&wyinxKdE&K=xD@f)CAuaETg>PeJ$y9pZ-g5R}=_-@=@;U5dZ#q(v~h`Ro32W038Z9ZG5J}aN+K2?_W0eIwb$dO&!>zi5R^36X9BODR8utg>sw-&K6|{m2 z4)e$mgWQaX9zrkCyOC(%4CbvU^yOYB4*flfXMQ`-bK3x<8(Ktxx^Xq4lU#)iLrLF5 z3Ueo%wAlWMPQh)A@FO5)|1gSQmy^VbTV*-bbdu$tJ;tA_i#*ys^4^h=@{tj-F!ILu$mQ{oc``-I#bt>j z>+nPfNw&KDHj-jrFAm+FL+&#ogwKda%ilo)*HKb6w&7Et_St^P#LHyNS{hNc8<#l7 zE|`2t8>^a*oAMXxrl57;`?s>?CUK~+WG-7AyGMu~U$rYv0X^3qAE}oa*2* zQ4+;zZ8u5~w|^Xi-$4I7fk-}ap}j~C;Tph&$UerS5n~uZ(wjo+Hni2I+H(L89v}Jw zEtG84Y^;7fjD=VD=;{myXZQe_@eG%JUqh4ov`A77J>1YFm2O#PAXiSKmK=`=q=Rb+4Tp%J zPPAGSA3}wI9b9|HqboUU52#bjkvJuhYNS==X6=4%> zlGP5B#2wbs3TwQ`Ls@vJ7g6q=@<_Jt0DsC7>;QX_a$J^sqz$tZO&XXF3kZ{xS2=`7 z`nV>IFT! z03qo{7X##1k$DP~ByT(PJ^270UKl#$ea9CNv6?0?F^cM~D7u<(k}wihP?KmhYrq(R z)=8lC$EbmB=J%m%g~VJp6F` z@CZ-fd^e&cX0sKJQ8fjTNsA=ha1*e$;S!SHrw1LrT9Q$qE0R(9IO8DH0di<^vo-|! zd9?anLLid1K1IPV1~k&O)MFCU;d@M%)F*^i=-))ENjy9~TG`{+{#JVu6v-kzULOjh z06Pw8$33kQ&pCMqFKgZF!1vo}uj|h?eZ#@#HQhouEz|~Iw%XV(Q_>(GFBZ_god~~< zN&FLnA?-&KhA_CO=E;!yiRFJAzXt?Pp9*MzpVX&2Ik|=xE4V21Zhm3Y2{0ip+>5Rr z7tY5^oz{CFExu3d4JiRs`sB6#m0?AjLZIBnEoi|Scuw9805HO|r2sI+PUcP^s2ibJ z!PBG1-^YtQWdYRI30&Vmi+|G*J*ehq0J4|Dgd_rAe}Fs9q8!?KkpTQ2Q2@jPtw2;Q zIzsUUABw8Y(}S^xUiHV6v@xg$D04ePk7`2D(@+q_bpe zvJb%#)#}yY7$Db7wK=$A_bCznqCW$pi%d01 zsyPU>)>*gN#@}gUUnxc0wDn+Zc5yDh)q76q8jQ4y&AlA0TwdQwc96 z9}3supuxG{!N`h!1Bwj-8Gwq2wY7=2wkeXCn((}t<(6LU^f9ug;fKF{cBXsUcnB*2Di7MI(R#$bRI9ea$yZm=3 z4LJn~a{^fO!h#{pP_Zto6WZ~8jaI{@q!=Effca+pA=xH6nQdH?SWTere?VEpcOt7@ zfa4EvU_5Q-k#;*75&cBlpmBTPVdt7ngsb6lf_rgw8?HWF+gAWp^!z#;iqQ%JNt^x9 zz{%5&koM|;NbbX2;NpwPzYC=@Mk-_l&Ox~P(gI<2w9Y__hlhD3IvC+O@7zSZ4kJLz z;CaC{CjSgU`WV%sR}a<)S6-1uIZ_&cRjX82piw6+0VASUH1@M1aw| zP`aB-_xPp3t{+nFU$Iy03(5|2*(vc%OW7EgT^G+{tmp9lBX|dPc{Qir67)UF?KV+! zOhjrC!1819d<&*!{U`J{2-{YV(P0XIuDn0Td5rHlClDEnte#X+80Qqm`ctldk?a4I z>ctCQE#cqk)t68cMI2XKJ%fA3Ilg+9qHFkx%po{?Q|OUur2G-ZevJNdF!OWVHz$T$ zW=o^K!sX{FvWAfe*5~1bjmmHGTwdkcZ;Fuyf>Y7REe$nm;=rv4?jKiTTBMQ@qYi2n zr2*%Hyf@k|IG&^Oa~|zA9_@2yVsnyk8|B{<2St|WII(%bEBlYM?pra`{(ErXVHLpzJ_d(v7o}0WfKP`D9$ayILEhSAk#v+VW6_(Ju z=}j^Ah9lg$EJ@JFKca-h4GSVA(MVFsB}#sU5^_|iPs{!W<$ei?8^s6Zl9Wcc$nm4C z@)*?&P(lj18^cem+{CFuyJF&u1f7;!abxsZKkHBkZNE)T-=d~bz&YQA?^Bc|m`^Bx z5~|oGKtoQk^R33S7I4ANl^^Ir!*TcGE~{u3*Oo zQ(1nSDhTWsMh~wU8^?_KICOxJN)9L1NC}mMn0}E`;Uyt#zK2`+Q3Lj=7Zs?Ug!%l_RD24{dn*u+zJpd_A#KLhF1gxeSDSaW zYp(Vs`3bu7VUxO5L10Jz0MCkdu%>vN9!Xuy?@*trhCUTh2bGC5@`If}`ry*%O1Nku}6zSn;2*(Q8SI+KQ zc2TlJiG3yVKDGM>B@ZYetA&+y#T*D9TWF0VKKomKsd$%WTWU hGGi#tq;{s#sqLwkQ^^$lb>nFeR|;1;)rJ4`{|2Fn(7^xz literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/max_key.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/max_key.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f561cb82fa5ab4aa64730c4bc05c8fe2b73e9e70 GIT binary patch literal 1545 zcma)6+iuf95M4XYrD@VT7YQUR5K<#lBR~jIAyiQW570=^K1Go>TkqC!<6C!~&_tDZ zXn!Uj!H@WrCw_q^X6&X-8@FPko%MRwbIzHa39Hwu1jhES5qnZ3YNqyk%bh22Tjv0hMOxKS*;X@9TX@`Eqq^lqmVI(ArL#eFvvp+vUnvFsy1D^{p zw_z&0j+mTiv39EOlCjnt>q*sBZlGco*g|UHhgXIY-a%3fA;)q|cb_pqv1dVgICtu_E&emt=w2_M9l6nN2vBb5Pt5nW7-o# zD;g#xO2rYS50P0)SsT?e$yVmEkp$JYIo6fjsu~8aap0f|qizKxQB)eLRJ9DHA<2 zI5*r^DpO+9$Qy7xi1suW2R$=5n9?+z7?VRH8+!9oDrBsuX-kT{@B72+*#kvhOzC<) z5_tX#X)g=A0#R}R93cEG7XUpo02e8%!8elU8v+0 zB?~#4pyVX{jZyky3hT1uGGDV%$Jz{-4+iuf95M4XYrD@U&Ef)zSED%y7R3ktLQ6W@O1P{So^xhrW7q3dhHdB9*nV1M>^BW&n}LIE?C}FM zz*_7J0}b>u2D;Er3oRWAd#quM-~14f6tM^rJ8{FnJPf6o^n|$^2Ho(}N7D@wAp_ep zcirHt7@5f^5?0m0L$5R)N88xreKdl#G=$VaYZX9m8BhS@jJ1kTgcAA^l%ayY3=2?2 zUx7uapU(UWH79ynbz?V(6FYE()G&@yMl8I;v>0NJ<%G!voc;S9w%Q4V&Suve zbUk54GCUGaVj>5Bq!s|Ysd(e*EL~KU3)3>`KZXY1w7rq8pt?GF8%`H_KhMRX$Q({y?mlOUS|v49%$ZSzfGO)DT`M1egj}z|Jb-Z} zE1iu-cJ$H(h=QAzoW#E|&R@=8U6x!HYc}dsn}O}4wzSH*AHslc4y&3U4{Yx|Qsx}r zBImMBNQ-2a$*hoBBePECE}45|?vuIHenCq;dD;-uhKgpC482mA{izkrMnOKr1!*Zf Wpl7cp^Ug~v?=#9Dh>v<%hVdWJ@HnCX literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/objectid.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/objectid.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea70bddcc7b09d8ca81059be6fe36dd558b78bf9 GIT binary patch literal 9058 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 E1IzIm%>V!Z literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/timestamp.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/timestamp.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ad5a7e8373b10c1d216cc974e97d80fbd41b6df GIT binary patch literal 3902 zcmbtXTW=dh6yDigU*bAxn$l8Ap+ji_SE)f1AsQhBw5U`np=wiv+(?`4&e(CX-ZeAh zmRN=d(np?oZeJ?(g@3>w*;k(U3q0|iS$pGL8U=N&otd4>Ip6u_%$ehGcDCl=x&GHM zTs`hMf78eGypBg&%k z#1R!)-S%2D!oBA-s>4rK(lpk*ohq(mUr8+!(@i@3yEN&fH@@cG#7LEdF<(yX6VDv zPn=dsmPJXFpE%pBRYAKVs*9o1Ks_r?iq}xj ziBsY<>f_>daR&9gcte~;eL}nm)6Zoyg-OG!`^+_kxqP6d01w=(OP=;`r=4bvf(syUuT?OnDLDNw1n^SGv^uG zX6T_+m2FplYpTNCX1`I7YkOMg@u)}mBj!WlCR2%-*>v>JiOU>Q6Q%K}J0AVrj{Y$o zEz>BpJHfG$i?S{lsHlX`U7%JnG?Irrk&pRO6o*(bUL}(#px9~y+$!zjHAb$ws!4Aqo#2D=!4djgvK3e1-U%q_x}-<=lql1Yu(tkwmOxff;CiAQELh=pmpt)_83J1_ZM4Gs2R=a=a&Np|z{{H^*jjXog9NB!Zf;Bb}2LUb5j!*Xh zZ^O%cE#r3P+hM4VUO4I$_)boC-Oc%h@Hu`Xy zCnvNJkBC6Qik=2j^N{p{sRdM)i@Z2ZpC?gRZL|lDKb$K>G)dDD(S0^SM=tX}!O=~k z&QL+yGzIN7eBQ#V$IxbXpg~P!dofH8wLQGnlFMl1mk+L<3t-S4u?=t2O*z`QIyOq1 zxc*J~9@2<=;AOc{QN*>P6vJ|5Sy2`kfym~TQ*)~aPo;w?#S7O`nUzwUShWXsRt^IB zQxJTQg_^`VaDp@LaDE4UK4BlVg#n}!1~|Ao>Gp#G+w3bqRc~N`JbXRW>p4c6dJuW! zm^3R0?qf#I;2!tOhxgG)R9YG-9UI{`-gN5|-MOi6lFr?GMMftw2!5PWw##4|+^4EA z_&qG!vt!PN*QR~5d)Ib10m1lV3SN|^_KO@?SsKn#>m}e~9MJ~^uGkT_dq-%(D*;3< zQ2r4BX6WMfnxKK0&THy z1*?<=fQx=|O~0?Lq+yyM^U##^Ox+v4s=$zJwyn}0>9dz!P9E`oVAwep>R=*VVN%Xt zd3dVWhvw9b<;DWhogixqf~*zqJ7 zS*=8GwOsY^D~*4iy*C;)wTQWjqNe4oHAmS3a)hgtT7C31m literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/tz_util.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/__pycache__/tz_util.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad93a2155484cd75ad5db389a4d837c9241ab675 GIT binary patch literal 1515 zcmb7EUymC#5VyUX>?X}|$8iM-kgx=*SgDsh^rf7ts^a(~B$NZLysRR*o3)d3yMKc1 zR3ysV^_35DAA&F9SDtv`10W$Wv&pr4r}Dt8JRZ-CJ-?Z;H{09m6QI-I*V$hkLjJ%- zn?hJTfniU8Ns)dA1WB}==qdrp#Q z{n=Aps&!o{Zd8#uCHd0nLOZQ2pVfwcd44t?{s~b?!hFwxvs8u4eAlgYHLG*9w28su z2@LxXm?9|!bbuudB$L4_l7=#r9hf_^Dxxe^3+XjJ z?n3b&R_+3{&#cQTnHk9oJvEtGaarff*Sng79$h%MI2nz=Vuy=n->^3G(Qd~`Lg5hA z@WPeFr`yUL*VE@JclPl!F>DU`O3ieot2q~94&Ie^nVDN5xT>;g0VynW{-QvK5zp(z z3Z(7EJb+SO6UsPFVc5@sIkKUSUNUpIp&KGtHE?u8CH<{gZ5ZeRNuZ`|oKPR_>Xn4P zudS{y`CJ+7nm-b)nhUY5wm-b7t+G-jfe)=JX1=@g2~m4R%m9x0`$u^)aZst_d9j=q ziZ4u!h2T)@as`={3uu^`ELJa7_42{+i^=zTIU{vjJTnwJ;B_-ExX9J3<-rYbu5aH{>}EI%DVLijEUzBG4K6qX-6q8VqQ6(t+F3fykn$XcCeJA|Z)MH;aM< zI#HTSE2GZHIO^as&N%MMAmEk|Bw=4%z@1S?yNwGj!{&1TzjNx|?oQD6{r=zce(&>q z|NonZOWitk>eQ)Ir%s((ZgugsYo$aZ3{OoTf*KDDZ19+hR(tfWYiDsM}Y#tyA5H(*Dlp|;e7UW25SfH(y7 zNh`t(es4sz#e0GzB{3)#N;agDF!7fll_4TB8Nums0dYJpNwbjWeuV2Ovt*J^P;eA1 zSm;In%P>hLcwPTjNg8OtekE){dLA>XC$5*I6V%YZ@i)@vUF<_zUL*b^mZ|P~J@CeV zHc2WQSzlT1E0?4@h5)o4&rm$K;fecmfaQ?_O_DN^updt^Jb%Lz_vetLmXUP=k?V-M zvOqV+A>kExj*;~Z^%Zz$nLsuYWG}spC+^R|c;4z-Ad-wE$cph^jYGn#Ly`)*LjM07 zQ$m(+-;kuX-TI#==&{?T&A94n=T%DJONU#HctRWOYat-FdRS3UDeAZ34o%ZML7zRx zqwZ4LUG{7epGR$1)VGyjwcVzuDVlW`@-(+>2C612tx8~Q9X>HAzbG%j4{H8Xgbw@_zVx;cg?U;tLQG<7KcWBnj z??eW5mu9^TFPb%*qa9m%n57m}$abBg4ND^!*8wbV?gtv0_2?Z`bzkyk($PKVDWUX@ zyCo_7I2EtD?0HJi^1vRvhv+@fg6dmFP+Ya#MnTYWe3!s<;QdErZMPf%go89-#5eit~@eu1O|+w#yx zj%im>D>xtt&H8x=xz!h_@8xRL1fl8nGDY31S>K`*)OD;9sI=#S1CM>4q9WC!c92-0 zBHIaAN0IE@9ZGPP-KJTOA)D47&=QtDN19Q31Gg5+%WgjC8yon-H;mhEqn?VsnZhPg+Sg&ZIIpOR`*jFk%3g)+#>&;bS*oQg-lc!gzK|skowqIqiu@% zok#sPcSra}Sk7nqrl6+<@+6;KQ9HtaVm5tQ5abrh;8yo4YNAI?zXHUZ+5ydS z9!Rl_Iup<|>MVPXqWYj&>QcJ`S=gL6v~5l%{uR((i*Cnqq1MfDtUjq)B72G9<>?}` z16guP+q90LWj_+ahfpX>#uga=82}0XOTwL0^*fLdUIxN}VS53WP>tKcYwkhE>V4sd z@OJF*fcFBQn8IHHTW#xnSTNCsl(lPjE9y2SIMe0{I2W^@vT$#d~g1hLYQ=u>B{$QaKxu+*nbH>}rK|Yu-$S%z~mG-;ZbwMZxm*ZDb3m zVi`(cd^@a#4qAOi z;760cH><6p?orfs&6>1^>O0*&Q}x(Obgii-)8Vs|9f0a=L0+!wawg)-fRIn@Bp8hB zKL87F71S-^rx+E2)$92eJs!CqFJfGkH(Fjm=H?wQQJ0lnZL2JgARb;w2E`9FT>_cm zc_PvS^12?conNd5Sq!<<4+O2o@$-;XQs42<4V*MBx-t9#8UZbt-Ta>44lbt>;dJCh z)rsqCDgLv-83`%p&XH>^%T%gLhxWa^+%g0R(82Q&P?SPMa}jK}{JaBW081P!Yz9#& zd6rWZYsW3lID!HJOvH&FIFnjkKhG{{{adTcdi&q^9+CKrc@ZsIb)q!{^_3K zTjdv>nM&x&EG2P2UXzqiTB9eFwo?ga+THmFd|B!hX`cMn`krb*N@A-gzoj1D&erVC zkKp*gIFhDh25z=X%jm5q^fC!y0;_3On~>4!cf#!uZSFzHCAH~2f3kAB^?X!Ch|-Yb zU_hkR@A%A32mNW`uaN<^{Bs0Gg-ORkmR6v(1%{nR*llc!W+bu%^)O&x1r~O?@;kk=cfH=gzyxADXLk6KvvWT!a!3(zdwvb_+0QZ zH0vTt0qf%o?;>=BQyD4dVYDfsP?!?P#~_;YVj~Cc4kq2)L5c7}N|azT6+?_L(79WXa^&2yU5$pEwAl2@@|C!Q`s@Ik&)YyyF-51rM4F3 zzUNYRIaeI5@p-GAE54oRt?|3mgX+=T9nMgpsVKEWe%QI94&2c?~;yxh9WqNis>k?D1tu36gKf_&N&uTb@1n6UKAfBD=EL1P_bE ztH_VEHe|X~%bVNb-2^&JuApTHUOSTkYr)GV@?=~g<;VP^OV1%*QMyZ|5z}mxEpPdx zM?=q|)K=sTAxpbuI2a-7u3&mLUga&HXUc)!2|!-}UP{7ya8Q~^8_=)>7y}y`K;E=p zY5mxyr0%CFijBN?+t9X4+x%CnmJi`y1UgdMEqm}nIv%v_!khD0o6VOO=&-e0HXw=? zM#A%W+XSrruCouj@(=s7n3Da-xFi1bK>FQCbp!_m5m3u!lOu-N6*_4~DcL(7^6-+| zGS;#bNEkW@%zxUjtt&~&8~FcM`TvXnLB8YnANc=c{J)Li3H-mA|4+jIyLUfpY6ERS zGNy~vNz$+1Kq_AgG?>DY*Ab9s^)V_1gHTp3Ni-V>S|(6R$T}Fre>gi zrtS)7T+LRke;nR;l1yN@$&b0{uFiIv1c$5{pv=?8en@R@S-ejX&YVulXgUsA-aJPU zotUOu^T1Q?F-6T&;8hM_N;8PfAP7V`Y-7eTH@%c!7N-#MKt|4Hf)>z_HKcl6^A|6z+hW)c3T#^(cB+BBQebDtu;i!uFOz2s>~jP*3sA@;Q($Ah9hJ!n1N%fH*U}NA{TV@mb&fdf zX$JOAfvv=_HwkP^wxYC$8QAv=?2;JvYJpu6hkcxp;Pi{04<83B317JeS zll0Lm^Oj=wWRYoTVQ4zm{X&e*#Z+i zThu5|VCEQ@*-^|Kfq9>S*-KzTNM~@}f4SADdmdq8{zE*52^v`JFt83su^fywnX$GC zEXBZjK8mF$F;AZ6yc+%$Exst~yPl8&fAgd#5osn~(WGl82IVTp$6m^Z= zM$Kqo?V8M#FmYI8&*p^b7>a@$>_?Gw z)4*ECGnkCMoj`okaE57gQ!B@o!f9&OWZ3qEP5wcFes9u$0p zOS^j+(IG=EH{}uz2;6Z26VNR3%8fwxR3teACoJ-sGDM2iqwf3@@)|SVosCO#G|3&h zAV+R~6x14Dw(mzE`Oa6=CcXOB)lX3YYwV3kC{{Z#Pa==b2LBW_>dbNmT7FbQSD8H_ zfdUbSKeAAkqs-G|7e)OyRp8Fc z;TA{cP}b%ha@nlNIS8K;chU{3K-6^zV~JDTJkM04NMb#ySL>FpRk<)&pKp=LZ#3*A!yB9&KEq3`j1CS?79 zOHF6_t35R915A-Sz*b_{ApQV|=eBe{ZDGn9d z(59%-MNiQ1uUQX(5NZ2XQgSG!Xi>d0+b4;{zvzi6+}!A@JaMW)R_>ZhkR0urC18?f zBPe48_>VX_FLm$cgK`u1B{;YaQs-4?QCh5Pz5<>iy$Ke4S%?K4ZCMH0?tAtS$5Z{; z!IGPv5t?^1vapgy789upp`?d(?<$!@)cl^@)Fe>PCF;~^JrxPmgPHJsO!!km)d^oE zup@uh39mhk@Y73l!g@z}45*Q0WJ8B`=eNjfHj&K7qth*y?}P{>%&Pr2IP-iNn*VA? z-Uc=cz7b>o!v*yQIL`4NWDzF7`@Jms6zf zBM2h2LI+58k-FWjzU2v4()4s!cp%1NmwFU~&JvnSIuu&z!wBo4Daawsnh93ptmHC| zMs=ZvqG;$wVj}-|{R$eVpaaAd<|Po62SYhl3ZV|7I*O`SFR(3IaV4-oGWoF`xJR=N z1jWvmV=~qK*XUX$OZF<3ZHY(y*rP_=YL8qj6{+78t0#+8tPhRlh7uz`gbwMzkywKl zd9VXI*2LV=4i5_iBHF79P4LZ9a;dMo)i*t~4dhn$gpZ+rs$mGJ*r*+3$E%)V8&k7> z=_5If&Kw#S@xkFLA5a<+#=P zd2Y4A;Z{F^dfY$?^6L)17#~vH!G;X-`dUziJ5;z1y@A^wgM|$<>~o5!olbJqJftDO z!5~8Z;JtrAlCV;1Q3t4HF?A2~GI;wKCDW*0G|XU+F1)Xh5iX!5U}#D~%JIg(QLQ8? z#Xk}ogfBJ#Ib?M_MtRU>UPNZ9)cy7r;GkX^s8bf|RNCgk0CfaF)=n4fC;5mlhc;## zMNuStmxCTgQg(pZ=6?CdAU@%Etp$ep~E;5aMNc8L$_|J{g+&1D3GjF;1 zMixIh^0NR%W>F00tSmgFfHH26cmRnipbMhO!u~e&j{0+n6Pp_9cTTOvsYc*eEA4H- z)?D&Ndj=&XZgmBlc>7x(+z4i|+0fQFE=%$sr-6_lwy7ahN8YvtWLll%KOAVdKSr>+{R!sS%K#75Tyo%Fzyj%166To)>rBY z&3YEM9w3U^N3%-YzH$>0hw!T4z-rbPn6T(Aw{wDZ6H67MEWHVckeTi-LS)N`E;KL(90mQ+AZ1~)+RWNj6C?qq&PHE5t(fLyq zRc40fblw2rw-LA?%k&cTT5>JTr~7Nk{|kS`^Q&%h^l=TNxqiECcq< z0?L1c)VGftS|~U702OFCHxV#<8kj!=voqDB4y#5*+?p91T-FbuIZV2PD+fCtvfgCC z?m-6Z-0maVLy5M(2QLb&0bB0C1$LD600e~kNA6@nS(A*czoW9Sy?v1cx}KnapIb{( z#$I&oGvr1u$nuZJ`3<5@b7Tz93G|MBHCP_(B7zt#zp0KTe?sqI;xkY1qJAKuS<68d zt4$fo*z_a-{HevwU-=ffwIZqW5;Ry(bUKW`ELxiN`evbCCs`2au=j(U8{;zi2Gt0K zZ9(}&;UbUf-&d?|E5`T_?+C`?5OqEq#(T}`2a=oI5{x8%nL#T7>NHcPxM6z%<3T)% z`XSNZty!;SP*i}EI7*HImp%?rp>Kc5#G8Ln;1}q5!5Ko&&7){NVr4F(`A6lI!x6ed z<(ez;NMYW-T%076c4?v7xxW_^yOCM>s!2{`k2%Yj|!`z~6H@E>xwx0BT&zsESw zq_&2xG`ZE|6XcB-WNkWC59i{*~=oRSkUS>V>%nPQIknWiVivRx5+D~f^&Ll9%iLVn}W%aTl#_ot)2^?=_sfW1-Ur^C|E9u z{6I1#+W{edP4E3CsP@rJ?juBDmI~yJV{$?TmSD1DmA}@}_)CJn(i!*(ZSX4LcQ`Sa z{!}p5JW6hU3IKOtyII{2bER1i-bkHKtgGBb#3uYa&LrPvGa(z2bE!4-4wOS0CpT9U z0dRE#Q-(hYI*z7e{ueZBGl;oN=aO}Opbs*R9W?w&>MqM9|7DuB9jWAWk^J7M!aKCu zh9ha{FT5!98o~7R7eu=MGbMP@=TA^q7{z+Q{pD={{5^{?V9#-D$=qG;{xjjcLZTCE zCmwW{f(MzPW?ewkxVsn&L@Ib80>jWS`-*aRxYf7WFiZoS>;$Snsts4MoVkVx31p-4 zGawi67@5dn(Qi`b(%H=FQ*{rU1m{rWcTky4O6w z#5LJYdTTuqF=+o2I<#GmzoUBx<4YCxZSxqjoOaX>Qa#Es%R%bB#@jIsgTk2k_+Tl z$K+@&=+Nj|GHTzODu&v-kc*mh9T=1gVTyR zh#UINQ=t_s2}t{E2$L*q$ok=*fJ6rEDWpZ(0T&)sJp`{NyEpGUKJAmg{ArtQvTDYZ zuGM`!thAm=R@ALZYxr__U}D8#_*SLra2WbQD2a!aV#YUW@%JvZ`12L5)yY&u0ggD*8i8sl zp$g$WPc8b$Rnr8c0EE$u_4 zjlJmS$0&Ne;&*7)KT?4-a2&zDMkN*1;u~s=cRVEDNl+alATY?k81^ElXjT)6LFn^i z0Ql3%owt#)1lU5PAAwG4*45xecfKZJw2$L*9vC1l^&$Qmjz%4TD~LT3)b+ja!ZXlm z^rr5L6j2zmPX7Z{2Cl<56-0==2{x(#rHS0WwKT&GS)J<$6}@69;Jjk%!!Q{)CccmA z!PAA6W}RKYH76gzAHVUr5#TtE|H@JFCpV*2K|k^YLXYZQ4lSYfbdSX>*mngO*ail; znG3&Egx7B9)cuni|Dgu~+mTl29DiEe$K&xJ>&H-MwWOH-=g zWg$XU)_s{`_46x2=232K8|D=@|8e(?J|QKozNHg|q|eHx}fKsy&F z{Tlixf%Czk%H`~gEaPx5nK9R-P-c$2(cE)fmERKBo6tFYTs6IzJBN;2KrbnsXO3&2 zmyFJgaejKSbtaEn>`x5rbtqb^JAYq&i!vWr)N{WV3$v5 z)|blh4ow%!G*3}XPkBhBki{PV)+404gQ@O9!?yuI7W4HK2>uE6)2vTWdx}M3 za-bIj2!fjRI-&+Ui2h3L4Aol#E{Fi8Sj(_XV_k4J=}Nmxg|N}!t3il#3k@zeKi7lW z5KtE~MIJ$nGDYsgi!q~|K+PMSQRX2=Gs+xQhxxz-;+AESJAbl;U2a}4{S~b_4DhdL%`y~bj7a|g3Tw@}^(@g8f4*iN6DKmq4WI#u4w46h7J9^m z1kmMqwn$`oUJU}8^&!yK6=wnf{$4yC8bWp(G9|@1juzLf=P{n}MiMDCWc>mOEZ4WL z$4eKve$VAV0}kViAY==B%SIo1yor*G9=Ms05bljUfsloV1)n!akjWF^l!Qvm!G5k_ zQLU4D+Dm{>P{)nt{e-6xapv!nSN?@wLKD*nC$Tz1S9e+88OCB0 zo#A@QYq}iEZdhf)ylfQa0v0l*G+l5ofsV*%gfs_B0qOjrS|5^01%`0)-bi1BSn_cu zlKID)PY;5J(x1MQ1Xuzg!L&DrzlHGB8Hb8M=SNz-5!-CVQ{0JfhoAVImf_GZc0x+r z^ELyW=3-+9{q;eBRDX*9Qq5XO64%>w$}GI2!FfJ{_P(6rdRneX@!!4TmrdiC*Xl(b7ZL5@LV?m0!cjZfY6X} zITO^%95aNHL$-6IQE}MLONrH}?Yw|uBod_9L<-x^=^&(8ALKIGq!a=mL{epl9|4d>^6s^GVVlV&1$93G`XmzUWzqQa${N~P+s0x^2a&E~*#%_yu91rq zL1yfrZTEAZo=LSSGk89%S*xiOQ5*QMH&BdfgOsTvg=#bCHsr?l3@in%jUNELL*EJ+ z8XbE39fUWN@r0zyC^ckVf&{LWnQKK$>xTO@l%<9aeUaW6)HO)=hf!8EXFr5IN7|q= zfF>21bpQ&{eRIa1oFK3r2+{Z%^2&dSn(zD*DfhB6T92D!)DNvye+@FA=EnE{0hba; zZ_H^TnH%$Vkih(p#m3cN2!NRXEivYQPlO2PddA_#EJd{+1CXnoPSm(DjrE1$V1*o~ zJeMkCUfi)7(Zs#{(HVPJ^6B((B+<(!$%PFomZ-YqV=KU-3WBg;`i17~qe{Y_<{F&scB}Y1#sq}lGbnqV- zRkZM}gb=cRgT{%hBBZf{u10q7;~;*%k1JEV8p(0|d_!@apHD;@^V1Lcv97{}Fh5BE zkh)1-dFYAe*>R;Y?t5fpVFwH71?*uA>&1X)YoDJ_9>*9L#@^}t_4~*bO+KEt?0cG$45Tr*EwYrQoBj_TDK!R)n$l?v)bvxXDGGYxD#{I;aZzbW%%r%5Fc?Pi*e>A6>*uZ=lDnUfw(5&|{QU7EH=sSKB2um&Arv$HW$H_I{ zAkBI=ks?rRU(iNa!Rz;RW&9MNomd2m*8C)LLYz2(in^gx&3YV=&g&rFKk(psgi9mE z@=b7 zFx?=8E#>g5=MZGEFL1)^A5EtKO2Pw%>WRqtr`xDQTr(9A=n~HIh=U9`(nP$Jwr$Qp zpjrQRC1oLV&3+nt*au1E5*ICX!s-lS2&cY9X!+%JRl0 zK3j$!g=Ob8_QRB@?xS6C2fjMaj-HONg>Oa@$e%6f%>q3|O{GqTjrm_nD28JHjhD`Q zJr#vG%$L5QnV@~~oi+r*+0fs^L%ZbMX5@T{U-XJ&3)SFIZzb9?%W$nCNkiNz@%z<$ z9YEMa$IZXhtZghL944}acUHO zTX-O)hO8GGsxyPAb{SO~h$k9|zhy>Yjj&%(!;Hv$kXNRu$V-$c4)fByLC8R}e#m&N zG4s(Nce0*6$3Qk)_+nX%C~t8N_M?X4fX!8mg3$tpYc3^rW5dHIloT5`-{dH4CbB_7 zuOr&o4-_&99@SV<7T*TcqnBbc@r>rKc9znIv8vh69Zs7c#`=7M{( zH=H$!HE@$NFd@zC4E(J5o`TXo%4bzPIO(t+ctuU0%1s&-p%$e;R?(9~Hs4j?=i300 zzkCXlmz&-OBB}j4gm4O$H-Af*tZSjQu_+0{?aHk|7CY!%o=3_md*WxWsZjFk>t|MPy@I^B|W3XXD>7*)%U9 zVa62gW+dVJ8se5T{55>G9xB0>^4@U9g`x?b1jt=6InAvmZO3tXr#2zYsZKz&mvi{* z&Y&w@il{(|adB=}F0wdEQ=i#{M$V4~pvZKNrJu=yf>@xw7tuS7)sVuj&TUF4-&ui!$QVA#H>t@W)Q63#69Zlmz37yKs`N{B| z7hncB7735Debt<1OnDt8^_7m{&!cj(r4@olu&vxTf}?8zrIUM2Zz_ASFj^BaS~pj z5fGm4oO+29%;M-2l$+6D?luuHrd&>r(g{2VGqfu*8X>-|SPPYe_R^*W=6UixEzsON zMQsx2#?ZU5px$I}1QHK@5SA@$XA-gAhe;ZG-{-)AB1GPyFxu}rz%K8!MRpK8lwQmB zc5|Hcp5_GWtt%)$B$9-(uWK%GFXld_V7pz>rHgGm)9$8om{ugKI7L zlDxBstk9p)0xq>7Z3{wFc~`jiaMAsrLR>3Ma|V8awALdcZ+w}X5;vB}O%|XxeS+Rs z>|$00tJ|lm>|P?2n0NmqqW^&?w~Qq2sI?!NNaeNoaHuT(LgsY|H#M1L-z(tt`Q?NO zUe7y?*NHl>e?Z>(K#NSFe)l?rroI(^_dFrCh13-*CZ*9CnZ#62#p~hYm`jjxr~ZLs z+aBG{L#<5n(`Y=TK{1E@TsrFLScTKd;g`-}a!u!goKX6~c#9fFT_14AjcyikZ_2Gx z8^_xHI1ZM66%Ux}iCujLxSi@BvZfoA^N<+2%%N_i>eBuujl7_-1q#%8H46^sNhVMt zw1w(`#DBv!V4RN@fVngFnvjDf_YGlpA)YRXb1RQxG_-OD@zAZ6FCdaJTk{sP8SOvY z5f!bRLw!a6V3Ime4$CMG7?qTG!T1q(1T*mEV(f@Yew3Aq`)FMDc^;f+52J2w^;>tv zVO)5Hn`p=rc3_>1Y9ri}66{EYuk6n)vua)f*07ZySDZYBeDdu>;ke+4<|B_%^Y5Tj znj3D!uyN0-CIoy+Q{h#=hq?NDx0@3!@aKw%wy^wJpvU6dgaXy@ICL^=I)R|Idl;`H z_h9&qVFXIWS%2ZNU=*X3Ef~$i=#gYJcTyNNnspAQu}cLyN4IoKCYI9KTP5+YkM1$vDmR~MMHiEsvJb2|K-o@*u$s3hOn(Y)Kw z5qatAldgH0nd2l`(yBp7N6!#OH7uPia{a-AE|x%9L)LYe9&w(#UGyS+uFpsrsjEJ1 z5c(Zt=-iaXa5B*04PY+rlRVh1L;!?zAXh(&BN>g6EIQfmk(I9Jfm^aKd~Yu>fUZOg z$OZ#_z(91tDBto1C}7ft%?}y@z{^lUl8?yk1L5@W+QH~a7)6rV(*|KcWwkafJTV)j zD-H*K)NndT2(uEna6&Jn0BlBP#^iu2PGOS{4(aNM3uZs7c%H-vf9S2+BAx2;EeSxI{mE$ z^dcJ6YS6bZ{gEa*?a5s11{au-5b=i$;-ACiR^OtA8mZHMi=A+4&fcOq#pO+?g`Mk( zW%3G<8zXqg`VqHj`eLpjyiocsBJw+?!J2(LH-_AFYm}_`wkT3dfRJ_9BE1g3IAe9V zl93^!Get?{#gPv@mf?FN!x1_+Wsp{hUe_DU$Em1qPE0-DX4z1E`ilA-gX>JIu_5b3 zqwLjjWxs`FRspDjM{QvhfGUtvKj0`eUG&>j-DW&09P`K@D2(=s(rB?lAtK8ejb+mC zgQiiJy^%r0nvQc_6rhh+S408J1@mJWFd285q>o1l{s~I{Mb+S5Hy6ohNr!yTc92X7 zuNg|(;_H$7mHK)_qKq&-ufP^SRIoo|$o?SZGn^VZzT$5H+-4WKnDb3eQJH6X%aK71Be=nU z1+&9zL`P5+(P-R$B;oM&U*mh>lQ@g}I1-cO=6OjNa<&{9(6C$y)z}m`VomSxN!`gA z7$cs6-tzoLZfawwtnNqkEmZwPuutvxcO*pZ^jSj$5^MEKUynlg5{aG11 z;woSl!{NxL?Z$6KDSS@t=kbDt{^Hyh#q{%OpNJGbpVklAvHt_I`ubH80RCls@PiyG zY@kLSH4z8a-SA1+Fh7C(GzjR2SfQjlP%eFj=iuG$IS>^cbtm%lEg^foAAAZV^y_1J8~x}btwG;l%-j3M!J5`ruio@<5B-jVv*wrO#va=s0A!K zD&+&_$a|6()8*!c2{8V73miBsjW=eh57QNPeLRYGtHm~0Je+Gjt!CcNMgj0h z`0WIX$!7p?vHpVpS@`)xeXJ$@R;p1oEm16xNS_}?ZdMr>pJ($Kne~}<;LijgeL~{h zB9XtRXkSLOds9`!dgw*~a6FdGz`^4vh`yAKpgQG^MLn=`_ia6q*h?#P$bASgg=V|Gm_ce|e_wV7tyd9M+alp(&}ir& zmEoTN{VVV}pl0+fJj@a95sR`XH*EnfB=RLo30+&qz-&<2j5l_p9ROPvtwtLU#0>j7wc^tZ3{DU*2Cd z_eS8+yd?nDY=20gVo7s&dYwdM+{+IHaH(|BtBU~2-mXfGH&`W2&`Fovt@?lI8WQUO+ za|Ik;cMg9$m}wG@KpD`YWucr%0p+8r?V+Mbt@g>;9dHgz;Wsj&Ru>|D&RXAf*fX7l z`^>MGq>*^ex&hjVr=S#9v*8(CCP{PgT!m*b9x2t7nwpxBnu!0guZsWwOaGEnev@2} z-%R=MN$A;aHG}TL6zdsc84#*q8C?lci`9&5PX(`Egsj&!KW^zrual7g2MF zWF9f zhOwDkPDoukwS~&UMV+aU+c?ulj(=e2L8tzb5_D_(DJKDVXbb^q)#C$bjZ3#PuOpcb zO5y`JaCV1`s3$b+C2;DlH~T>jE49W`uPqvi zZ(vtMj-UWvbs&=An~iU4eU`>kjh$tUUoZ3HwouSX;=ZwS~7IM!yYg%i*iUt!DdAU6@4YBV0$ z+=;ztJa~IB_0nE!Or541(wy7Pa%yA_Fr)pRHm;&ey=W63R0rpTNQz~Qqm@Q% zUUU=0hdrIGj2=5x2$5X2p9g-Fy~U+3DQW7uf8ot zJRCf5;dX4e9oh0mm%R>9TX^snV$6FDT+sy*xO{`0?3u(|8SSTZ-Af^%GJpEg`8&B7 zta?BRu?iQ=H*Pn$mc*yxjwZnI5&tb&MuJl$C`JPA{}cBiWQ&A6BLU0PB0&}jHY34i zBpl1(GO~>XT!AQZd>|5Xj0Al2BNDc80tr6Q<*vZ)`vHOR58cFa!>NsH>S)?}Dd)t@ z`GjVja3RWt)Wt_9c@(2*Gg2-PDKu>!Uj_=A_3z9)A6uLP0DVUAo^KgGtKyGNwxKs@ z){7a3Mgt$V(5&qMvI>5NZI`YpXeKT|U>x>h$?m^N<#job@iB9t5pT4j&`rxCXLGF} z05V(AEr4i0F0#E=%B$uhzR{=6d0rl9}PS(tzo)Oi!POsSN+Vq zVWk3Dew<6G`#iy0aM}GW*?4mBpdAj5Ktd3gei4l|oCBS;nre+RP9hhjVf(buf&D6h z4i#zfm9tQt0=2#?suSy70u@Tr;=33#1a4Q9iF;#L6&B!-j1p{60zZ41bP3Kl(>24m zACJ65`ZB=OiMa&snSsKm8TvMzT2P(D8X5&&E`Y3^QQ-LiQk&?TnRV1Ui>dR`U~*aq zjP*atgG+7__+A_Os1XemEXaZ|HbLq*$9MtBi|<3eS=66O5Ak<=q#wGdY^XnD7N$`B zr!eXn0(Bw?#i0(t{T~7~gHY`dRXQP}kF%(TvLPmUv4!J~Mq_BaT*i^C)k!ETPFUv( zAgIOx`!G-_Y}Y<(=qiOVd7x?^d5Jj867Ep~qu{Xy(9H}*pIJMck`EK_m*6PSJ5-mk z3chyWI^RrDa_88U0Q&C$z>LR#KF*61FUU4{6GmMay{H{A_Ah`woAOhN+TP8^oW^h5 zc?Z~cw7_G;Stxxu%lk0y2jIGsU67mBnJLX$%W2T~o#!Ktc8!fOVakn*z2v59#!Vm0 z3c&T#UBhXDNFRepGZR6R$EZBaRBlND89s3zO5X&*;rl7Bm*6E$ka>nB3SKS~WHRE& zTqnq6fXs)9Tr2t>RI^TsBl9{ZSUm=rzbdFw7sio!T##`XWZugLy9zn(y$IWwsj16SQ2r}m~nTO)Y3=m}c z8)S+FnVE59ZWLr@g3MQB*+c0qv#CG#Z0K*87mal^P|;)WwmREXdS>%mKzuf3%9od`58Q2HSMO!V;dL zKyv*td&jwaF61cp{(vaNY80~j9ON|C9eG&&f{Mj`F0;gC+RtDiK%q6p1foJ)jaUiR zw;EYqSdSj1s1w9J4G2(t9LM()wb+7T2vK;L1C{o|5^#c~sHE$WBn&>AL->st`?1R2 z)%bPyuT=V(4Mp7vzlvo**4W>d=Urq}W1b0nF)*v|4MVB8?JIU<7XAtdna}_kGA7y>BmbVzvG74M>DV-$PERE zJqfxz4HMhZf+-xz%QM3fJVD0_C+IuQOa>%@&u>11Nkd9TKeq@h^Vyh5RPc!#>Oh>mlw$qbnc<4Xg~}J}~l>Lv`@& zj`^-7>44o}BKfVvu3{Wa2wN@0j{g!*1ugZ#|CXJ>3sP{4VqhZiyDwY`D*}Gch|}Xy zD403#auMPHK#6rKoqI!!rD!GMUKG`&R2*~#%?VxG$v|QK*XL{0R$EfgD&aYhIJnV& z!U_W>ON|d-B`U#jVtEpxMgvD(9YHZhkDHza5T-Blev4cjH3*^`HRHEwn5*yP-X5|c z;x|}8F9mV{XE>z+C7}5$5>u6+S?mcjdz@_4l|tq(HtBa)oIn?+?Y?)yH=*6oM(5KZ zGqRP5XzsVecga{&z9lWHLS1bTSs66OZ_k(b{?!sJa`i_MSl&9b_2ZP({fH0HI#zr^ zH;!P+jjbBzK!g_{93-aT&a)8O5g$w+AlMMG;nKS?;aSKbZ=5tl-Z;%hqz)i56fd5t z7P_A#^}wb#if3mW|G4#wB)Ywd1XL3L(|wq~O~bb$jc8^3%uehE7P?X8c;r93eML!p z=YQq)70d!tPP=`@9h{cp4o&L_N1$T3ePt?!SL{%i;e<`43;)eL{Q{PKLtqn7^*pp~ zN%tFAT=rQcDkM!O>Chc4`1pb<7GGbohfea!m%H;jmiLu69>fm?;a7l`reMVq!ojaA z!LP=GIsc@cX5B_b^2qDMZOqnUP9d$Nm7iLyC(#H8Lr)_nj8w=52&Ua=CF{v+DJzWk z5dy}>qbiEBW@EG6CT0ky*-b-7WBrHhPbmFU5XE=J%vH<=89kB|7X=?XcL|;KYL;nzni95={!lrVb);ulWDUlcWP8Y&~i zp>iC(W$cwHm?`T79Bg}3C;IP6SIC^<%5PalUve~21wz(;Uqki45u!DSi#~`hEqhZUA<&322uT}F$1rg}G;9+Z z*53oy$mteUtlQxesrLquIG|Do@gjsA-@inD{X?(U7?(Yn?jL$RN=f2FuYOD}008_P z@MaLD%iPGGkP*{;IsX8ueFtuu(S@CnnaYoQ#)l<*7HN z@wgUt8HL3r{4pvRFK8>8%|^GO!Ber-qweq|w$gUUJo@h(`mZl-j5u*Bz=7LRI(TO! zw@YjoVv5#y^0h?+@YZ|97e~;8eM19ZWcacIr_8>T#*>W=S)*Ip8Y7L3C*_6d^m=k_ zXJ_Nd_4Q$7LEF-<#s`fje^_*wexXSG>Gd=GU$%nS1VRS>vAdH+p=(UI&Hj#76sLqn zJcafut~h`#9DO&a1#ny}CO6%Kmm>Mqf!R*24ZA_9=$KwNwlmc?+=?v&5_h?1|7HRjiaHDZgejb-4C>-p zbT_iCji(5mpRzz=?ME=zNvqiJxUeGjYU-g!>c;mx^oTofs`6I3I8<;yzR1Qv z=T6+;d4_w%Dcba1Hp(5kg5Wfq;$pJaQz*~4&#Y=I|ExtthiCW!1)5OR@!X{eI45#y zf=oZHh9kDmV|*_TUAx7&pDS8GS3AEj|}k zBaPyf`8z9-#h<)s0Wx=5Hq{V~#16OC;tq70{C7oGfC)Kt3$yYZSXmoSDXt>_h2=xv zJ;OWPp~ib~l*gUFb=eyCiml`ranWD66AyN;`ax0kgT7ohs@ApY*dRrV=()O7eJiTI z-)DI(4V6*Y2N{BrdawmFM(;hj&lDVu_;#2@sj z7&lwHTTfc}n!E7jXd&nP)^Wo-lueeU-{1K0H3t+Rg>D*$-&1h6p6E#mfcx@1i7n3g zE#q8-_r%}%?|k8fVGY<&fslD>>ybp)aNMEg)SA)H-L10w+h#-+&AGXn8eVqe0>%O@ zG;f^j4ma;mHVt#%Wv720*}c^jx+%+r9PW@}hK3i1*6rAV70&~hI~YYM^S34|!#n7- zJ${+e6&Q5;&q7xujr?Uibq=!?IhFI#=%f2FIq<8pP;mxIuk zt^S@)b?X-HEn-%&g}MxWRxs0tTH|cx8Wpvi6Zd=A6-|Nlf5F-T4!uCDabZ~;{Vp9y z*W&*|uJU&-Ys6;061v;*S7Oraz|Y5;@ri^|k$?}^y*S6PeoH3VYwmF z&{Q-1P>8k_F7mRkBXsP*t?j@aw-`+!{r&$%(!c!wz4Y-Z#8#z!>)o)co%$54ed}F_ zp#|=$7cCH?b%faOkw@j65#n1?}^bOHDv^;K@3*ojQr7pSmly;x@hO zJR$SiD^P82bkw;5Kh!uS(~Y4a1HW_G2S3;-HGu&v(~YKUf-eb9Orvbb9jrCGf{RjI z!K*Wfh%2}}t3bUcQ1=)ZQri;`1h2;Tc(mey0aGDEiIqV7{E5 zn|{+02ilre(iK`ob?S_HxPPN8{N(L|QVxEb6h&~3+#M_OuqK4<$X2x#aLDd|{{BB8 zfe&95l{le?XX)W+J?!fwiacuWu1>!GCo_0r=< zyYZ3T4X^1Xk>No-+@yzZ>*1$*_=6tydRgF~rH3Q+aGV}a)x$Y@c&i?+)5E{(VVzFz zO+Eg#9`<}i&>yIW7wF*xJ-k5=>-4Zm57+78vwFBq58u?oPxbH@J)EtV@6p3CdT7@} zvmPGXBKUb<54Y>#COv#u5AV{$TlMfpJ)EV79zDEN4=>QefqF>4X-|JYY!=~XdibUu zzN&|R)5H7paHSsl^sr11C+p!DJv>Vfd+OnLyfh_AAL`+5J=~y&59=ZS@)%gE)8l1& z=+VP5de~nN6ZG)ti=rNf^>C9OuGhnrdRV82H|XINdibiY4|#fAP?Mye21t$Yo1$Uk zog%)zTWH|_?}m*Z2)ecpMcADVEl0%vbx;4lEpGZx{t~+VCF*}>{8{ivlLh)~yrzsc z;3ab9$%V(MNePE2B$^G9<3cVPp<+yyuGRD4RZ7N#d7p$+h7w#U{#%Xz2?ZX=X@5tM z;h%Uu#`6iDPx1T<&u4f(#}mdA!Se;4PCQ@Y`3le1c)r1N6wkMKzQgl9o*(f18_&CV z-ox`go)7SRi030b^fwq!KAvmwEXH#$o`2wZ6VLZ}dV|>8--^Ip4}*851zevUcj>f&p+^N#PcE^`u*_Dc<3l8U61-Qo>%a^isv;v zEqGe-Y{k=tXB(c^@odM_j;9094m>;Y?7~C54a7s?S>3|lf(`11XXN`ee4t8Wht`%; zNbNooN|F6Io;wL5NqMOA|B1hp{lDH{Pdp;vDUbeoIxE`$35I@)=HtJ?ht6My9%kv` zyidB~XMt`)V?v`rJ`1wVpa}juLIE1*{W=^RFP!cnSlx1bqu}!{_SxwOJmP2vEE7aw z_M9B)F~IJM!l2>nai1JEyGB-3mix->I6sZ}BWOdy$;qjhGgp#qkK#wyC|)=f--i@B z2`9TNjJk`I(*@>cyu7Y3#&dLml`x*t6~=faU0~B0Z)R5*{>2oZ9Htcz+2Y^Ch*n+ zwmu2vEEfDYo|mLq#E)0R??-$M#f8jA<5kLjL6WGwbr_C4V`c?dT-%VDm1wNIs%I3B znpcwcqYmhRBlYTIT$389{Mii+oPHFvV2nrB=?LfuWk?uV-%wv+&lyEHWq^_G(qYUK z!T+N_lbj^U^{GdC)TNXqmn7ww`X@^LXP;4L%@Mgw2uwXpQV;A-no`VCO1-%*u`D6S zl$0PPjZVnvZB3D^z8;dbGFh^YNs_Fidmm|m0iv-bvo8(=;vs#dzt8agZCqTZQPR7o zS?W0^Md~>MFnIdIY;+dW-Wr9xT=!`lOPCQu0Y>}*{O;Qr! zaGjH+o}-iMM42dWj75_Bq}GwFh)4Qk`JaXx#~-y{cYaNSrKF?goFRS9QeWR7DW&o( zY5m!fbdDYNIkf}=dbiN(FH9|m^3M?KJ#dwBjEeD;N5iLOj{4B_s8i+(YyC2 zw^-`TWmGbJtUDxW9^`oDSvb5pHT7tZBe7IUBfHD`3B4lyWL}}i&(=!PJ9su3yvD_a z&Zj}=Q=#)crObNp`5);m*Fi?zP`~)P#pj8C|Fu5Vt-in7?{qsL>R^@{mrBwdcp9G- z@{W%Se&gy~2?M+g-v{D(lJQ~Hy1`7jDN-)vG;%unGTAWd&+&Z6zw0*hG#f+kyI@mO z6QtDd%sHl!i5TzAY`+ZIuU#QYZ{Qj8oZve?-laTIMzqax0{FHOPaWm6n4xpYAd)0? zfs@7k75K0637a47%iZPQJx*p0m`=qmlu{EfnTjJYO+#xoD`YCLs#$d6is5ZA0$%xDD`!Jzo$u#dxes4{Mw{%+7&0c9hV#$)}^Xk3jmD7CXK5ywnuTSb}Dp^vr zxS|w~x6W5pTO%EUl`E>RFP-M~O__b8x56iF)*%zC7J6%l?rZ5tQ}-v$(vjt_nny@&;s>=Bq~pTZ2e(FQ}`n z_mzsExVF+??Ul|!O$wIyybUPSz`YZ4(%GE8q|Ph7qStnEZT*7sYRD~GV~n5iGKKiu zKJNmo%;-6$RDipBZzZOlko1h2s*2i5Z>h^m!Hnq>@-P=M>O7&ob^+J+?l{cC+M0@T zAG|8!(m!X8x4zWf0HCjGuD{mbAQdC`gzDOIAGmkb`e&m;(#U9yh@?@cbE8nBp3a&| z)`5OW)LN5kYrMeqqj9Ad44#|~#1V7lCQb3zReMV(dlyN612tDwg^yH%YHXD9coa_B zH95*1aboZ{Jjw|{Cy-20=3zi}9n*=eM{dxrM}dodk}uXKLdwvBvA`frWhK)!W1~*T zpqojh)z(&*a!dZqnmM7oy1}UIv?z~^Aax*46&Cn2sn$>dNPU`rwvUuSx)7X9_Ai(X z&Indt4v}rsOP%U%@YU9PC7aIKl!e~ZUFfojxBDMIX%T z*8hvWzInBkM(=-KuU}!cx4d3@#NfbLSLdy%ly(shde7FonNHS)e1+w84d~6x?kL1X zk7o6j9z~pWl@wQ68spC0;I3)#mBScH1#vWld61+BjeK2;lgeWhT;A$(55t9R;aS4CI(A2l4&;NA?{V!8vkIGI zw8qa!DJ`NV>}o^pY!9Z_`;9IlnL$(6RMdi-T3QoVj$!rMmVQE2H6$fT%PlZ@znN@HfPf0gT4^!SZI6DGTmFhpsEJ_#sEoc65S1Y zq_%znx)gXVsrNP@n>5vYrQch>qy(0OY$MdOu+~q_Bn>&8y1P;u76%n$Ie^ml1f8~| z0mgZH)dH`x0TuAln>5Vis%j|5P$7^#RkQ2M>(PU%s~e=+M4HW1@gO&i3;;{K8Qi+O zv;A}Ddg~1?ClyVdT;$0eEoAPH8hrH?^B|uTskF4Pw4u&hQ8lNkqEv_x@L_;A_$o`u zhL%><%&9G{gsrTvT~b<&VkGG@X@Pe^1Kbbks=}!=CQo-47mXT|BdDi}yj8WO6}1Z% zz+YI{P*Vq!;+s}L5}7V^ zIfqV+2@{1{_N9@tlKsI_Xd_XH@iQAn1Dw#}yv~m9yxVH$*eYu){G?0`BcU(VUV4oy zT3@jc^n|}j)j zf9^b?BN#8x$gFFIcA(s@`8=TWYy7!U&tK)w?OrjP*J~c4yI31art7*@+8S#IXlXa$cJ+XMjr0KV#;LG z6A9n8XdVVd8+SkI+udb{CgLteov(Wzv&D$drs<>Jo0*UJcCuGhN^`2b)s?oI@&#R+ zzDs)&p3(0APkCn-8&wg-@gea6j312>EQG|XXqla;dw09r zZn__3?=CH+(LxZx5XDFgMq=1zjcd}#VoV?rV@-VUp@}@1Ch&lXQA~Jflm{au`a3iC zZZCxbzNy@B`2X*@GjnI=&YUxI_v|(m&kW=TrIF$-seFH2$#s9ZGM@bBTay{x4>C^b z`z#p>`nLM6f%?8cll5#aZtcqQSDeKRSoy&?gOHl%t^OSQ=bVK&n6eHPVnrXz$NQ~9 zW+;;#$(SLf>vG*V$k`)GzZ*^4qhSn-+~1t@n$$f{u+IxeX#fX%hV`vreoPht%q`S9 zJx?KtLvC3Yt&Ge_$bW8+cY6MOCKkLIL+YCVh<*NyAa27R+`=feBcqt)%qnS$lqcBBzwczK?g zcRfEAF65Ki6X0S}HoFsVTtwN&#_fzT-ECIA)X#Rp%yr792LADo%*4$77O9^T%gSb! zeBxtFOpC6ct0)RZX{E3t; zuL&66(J}Es{9CmDu;JN6LNCr)MKj;C(svf~Tk7N4bLcY=Z@e!=rARlRFx zdt5tS)%)zL&VLiX<@r>dZV`V|E!VYop53qN7qP$9>(XDG$g>ii9QuB)9rpZ`=*DPled`8Ew&-}&<+9Vw=F9-`2AVaJEwDhzvH*~mm1bz^m1-)P zX2V%Hs*C;C{8v+hKSm^;Y63imRN!;qeFTh7!)w40G7A@6@c?m=@LKR7G6O#Zo<~Nf z4F2{Y@pI@egQLswS?C2nC6;FbJ_Y`YRN$Auqbs-N?gr8a2lzF3le9oxde$83Dv1XFQ0`w57U=$_DSl)N0jP@vv*SOu{Vgo{qaEl zm>-G#S&7#=LK?wVWC|`gfSiH*<9a0Cr;VSS`U$<@IPwSlFnIr3>iijN5YUV1@yG5+ z4A0{Y#NLuduovlu3nq{Vd>9;Wq#bbfpz4<6j&3OoYFwh=oEXCJJVbyFX> z#O8d|%X5MI<7y<{=FvX-?S#Rn;SKO^u=Eo3fmgs&uTU5GH25RYgDLnNcw&e;i5~nU zOMT$}*cgeCd48BNj9zd%G7FD@bI3)w+CjW8aut3S{60rtRTz`tjy!dPPk_4%#8kl# zgKKwEH+UzwW;bQSo52$DD!c*~h;2#1{c$Z4@A3n30KMSv$T7G-wnbuGK1NQX7d(Z` zz^B3S*Qgh~0{)3ymb|ZXe?*<6-@qftJ@Dh;U&wNJ&4g0#BXyz&_wS*f;r`eaiD_BA zmo}jnT#NL=JHZc-ez-qYMPga@AfxC7&mo84f^$d-uJ+M1Avxdi`z9ZPh4Eaq?G+IA7^gQEEc z`ek=9&bSs)OVqp9X3}RHJ4VwfZ#&!`XlZH=@SX)n%_6Klpcj4t_6~ePV5iu;wFh>^ zoj}Jk_ujqHcAR)R%FcoUGERG-kju0=d?uc@oyK%BmdiTXM81*rQk(6hn|8LaC9pHe z1RL2G&F0(OO^SNLD~ppG)bWm19XIiW#G{v%mTF41rATS8R9kK?2g}pt+46<*#qwO4 v9y)8%MT&#P(c(n$K=Ektc(GhOU7Rj{SDY=bne3eGo_u-oj_%9`_ + to use + + .. versionchanged:: 3.9 + Support any bytes-like type that implements the buffer protocol. + """ + + _type_marker = 5 + + def __new__(cls, data, subtype=BINARY_SUBTYPE): + if not isinstance(subtype, int): + raise TypeError("subtype must be an instance of int") + if subtype >= 256 or subtype < 0: + raise ValueError("subtype must be contained in [0, 256)") + # Support any type that implements the buffer protocol. + self = bytes.__new__(cls, memoryview(data).tobytes()) + self.__subtype = subtype + return self + + @classmethod + def from_uuid(cls, uuid, uuid_representation=UuidRepresentation.STANDARD): + """Create a BSON Binary object from a Python UUID. + + Creates a :class:`~bson.binary.Binary` object from a + :class:`uuid.UUID` instance. Assumes that the native + :class:`uuid.UUID` instance uses the byte-order implied by the + provided ``uuid_representation``. + + Raises :exc:`TypeError` if `uuid` is not an instance of + :class:`~uuid.UUID`. + + :Parameters: + - `uuid`: A :class:`uuid.UUID` instance. + - `uuid_representation`: A member of + :class:`~bson.binary.UuidRepresentation`. Default: + :const:`~bson.binary.UuidRepresentation.STANDARD`. + See :ref:`handling-uuid-data-example` for details. + + .. versionadded:: 3.11 + """ + if not isinstance(uuid, UUID): + raise TypeError("uuid must be an instance of uuid.UUID") + + if uuid_representation not in ALL_UUID_REPRESENTATIONS: + raise ValueError("uuid_representation must be a value " + "from bson.binary.UuidRepresentation") + + if uuid_representation == UuidRepresentation.UNSPECIFIED: + raise ValueError( + "cannot encode native uuid.UUID with " + "UuidRepresentation.UNSPECIFIED. UUIDs can be manually " + "converted to bson.Binary instances using " + "bson.Binary.from_uuid() or a different UuidRepresentation " + "can be configured. See the documentation for " + "UuidRepresentation for more information.") + + subtype = OLD_UUID_SUBTYPE + if uuid_representation == UuidRepresentation.PYTHON_LEGACY: + payload = uuid.bytes + elif uuid_representation == UuidRepresentation.JAVA_LEGACY: + from_uuid = uuid.bytes + payload = from_uuid[0:8][::-1] + from_uuid[8:16][::-1] + elif uuid_representation == UuidRepresentation.CSHARP_LEGACY: + payload = uuid.bytes_le + else: + # uuid_representation == UuidRepresentation.STANDARD + subtype = UUID_SUBTYPE + payload = uuid.bytes + + return cls(payload, subtype) + + def as_uuid(self, uuid_representation=UuidRepresentation.STANDARD): + """Create a Python UUID from this BSON Binary object. + + Decodes this binary object as a native :class:`uuid.UUID` instance + with the provided ``uuid_representation``. + + Raises :exc:`ValueError` if this :class:`~bson.binary.Binary` instance + does not contain a UUID. + + :Parameters: + - `uuid_representation`: A member of + :class:`~bson.binary.UuidRepresentation`. Default: + :const:`~bson.binary.UuidRepresentation.STANDARD`. + See :ref:`handling-uuid-data-example` for details. + + .. versionadded:: 3.11 + """ + if self.subtype not in ALL_UUID_SUBTYPES: + raise ValueError("cannot decode subtype %s as a uuid" % ( + self.subtype,)) + + if uuid_representation not in ALL_UUID_REPRESENTATIONS: + raise ValueError("uuid_representation must be a value from " + "bson.binary.UuidRepresentation") + + if uuid_representation == UuidRepresentation.UNSPECIFIED: + raise ValueError("uuid_representation cannot be UNSPECIFIED") + elif uuid_representation == UuidRepresentation.PYTHON_LEGACY: + if self.subtype == OLD_UUID_SUBTYPE: + return UUID(bytes=self) + elif uuid_representation == UuidRepresentation.JAVA_LEGACY: + if self.subtype == OLD_UUID_SUBTYPE: + return UUID(bytes=self[0:8][::-1] + self[8:16][::-1]) + elif uuid_representation == UuidRepresentation.CSHARP_LEGACY: + if self.subtype == OLD_UUID_SUBTYPE: + return UUID(bytes_le=self) + else: + # uuid_representation == UuidRepresentation.STANDARD + if self.subtype == UUID_SUBTYPE: + return UUID(bytes=self) + + raise ValueError("cannot decode subtype %s to %s" % ( + self.subtype, UUID_REPRESENTATION_NAMES[uuid_representation])) + + @property + def subtype(self): + """Subtype of this binary data. + """ + return self.__subtype + + def __getnewargs__(self): + # Work around http://bugs.python.org/issue7382 + data = super(Binary, self).__getnewargs__()[0] + if PY3 and not isinstance(data, bytes): + data = data.encode('latin-1') + return data, self.__subtype + + def __eq__(self, other): + if isinstance(other, Binary): + return ((self.__subtype, bytes(self)) == + (other.subtype, bytes(other))) + # We don't return NotImplemented here because if we did then + # Binary("foo") == "foo" would return True, since Binary is a + # subclass of str... + return False + + def __hash__(self): + return super(Binary, self).__hash__() ^ hash(self.__subtype) + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Binary(%s, %s)" % (bytes.__repr__(self), self.__subtype) + + +class UUIDLegacy(Binary): + """**DEPRECATED** - UUID wrapper to support working with UUIDs stored as + PYTHON_LEGACY. + + .. note:: This class has been deprecated and will be removed in + PyMongo 4.0. Use :meth:`~bson.binary.Binary.from_uuid` and + :meth:`~bson.binary.Binary.as_uuid` with the appropriate + :class:`~bson.binary.UuidRepresentation` to handle legacy-formatted + UUIDs instead.:: + + from bson import Binary, UUIDLegacy, UuidRepresentation + import uuid + + my_uuid = uuid.uuid4() + legacy_uuid = UUIDLegacy(my_uuid) + binary_uuid = Binary.from_uuid( + my_uuid, UuidRepresentation.PYTHON_LEGACY) + + assert legacy_uuid == binary_uuid + assert legacy_uuid.uuid == binary_uuid.as_uuid( + UuidRepresentation.PYTHON_LEGACY) + + .. doctest:: + + >>> import uuid + >>> from bson.binary import Binary, UUIDLegacy, STANDARD + >>> from bson.codec_options import CodecOptions + >>> my_uuid = uuid.uuid4() + >>> coll = db.get_collection('test', + ... CodecOptions(uuid_representation=STANDARD)) + >>> coll.insert_one({'uuid': Binary(my_uuid.bytes, 3)}).inserted_id + ObjectId('...') + >>> coll.count_documents({'uuid': my_uuid}) + 0 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 1 + >>> coll.find({'uuid': UUIDLegacy(my_uuid)})[0]['uuid'] + UUID('...') + >>> + >>> # Convert from subtype 3 to subtype 4 + >>> doc = coll.find_one({'uuid': UUIDLegacy(my_uuid)}) + >>> coll.replace_one({"_id": doc["_id"]}, doc).matched_count + 1 + >>> coll.count_documents({'uuid': UUIDLegacy(my_uuid)}) + 0 + >>> coll.count_documents({'uuid': {'$in': [UUIDLegacy(my_uuid), my_uuid]}}) + 1 + >>> coll.find_one({'uuid': my_uuid})['uuid'] + UUID('...') + + Raises :exc:`TypeError` if `obj` is not an instance of :class:`~uuid.UUID`. + + :Parameters: + - `obj`: An instance of :class:`~uuid.UUID`. + + .. versionchanged:: 3.11 + Deprecated. The same functionality can be replicated using the + :meth:`~Binary.from_uuid` and :meth:`~Binary.to_uuid` methods with + :data:`~UuidRepresentation.PYTHON_LEGACY`. + .. versionadded:: 2.1 + """ + + def __new__(cls, obj): + warn( + "The UUIDLegacy class has been deprecated and will be removed " + "in PyMongo 4.0. Use the Binary.from_uuid() and Binary.to_uuid() " + "with the appropriate UuidRepresentation to handle " + "legacy-formatted UUIDs instead.", + DeprecationWarning, stacklevel=2) + if not isinstance(obj, UUID): + raise TypeError("obj must be an instance of uuid.UUID") + self = Binary.__new__(cls, obj.bytes, OLD_UUID_SUBTYPE) + self.__uuid = obj + return self + + def __getnewargs__(self): + # Support copy and deepcopy + return (self.__uuid,) + + @property + def uuid(self): + """UUID instance wrapped by this UUIDLegacy instance. + """ + return self.__uuid + + def __repr__(self): + return "UUIDLegacy('%s')" % self.__uuid diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/code.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/code.py new file mode 100644 index 00000000..3f6e5043 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/code.py @@ -0,0 +1,99 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing JavaScript code in BSON. +""" + +from bson.py3compat import abc, string_type, PY3, text_type + + +class Code(str): + """BSON's JavaScript code type. + + Raises :class:`TypeError` if `code` is not an instance of + :class:`basestring` (:class:`str` in python 3) or `scope` + is not ``None`` or an instance of :class:`dict`. + + Scope variables can be set by passing a dictionary as the `scope` + argument or by using keyword arguments. If a variable is set as a + keyword argument it will override any setting for that variable in + the `scope` dictionary. + + :Parameters: + - `code`: A string containing JavaScript code to be evaluated or another + instance of Code. In the latter case, the scope of `code` becomes this + Code's :attr:`scope`. + - `scope` (optional): dictionary representing the scope in which + `code` should be evaluated - a mapping from identifiers (as + strings) to values. Defaults to ``None``. This is applied after any + scope associated with a given `code` above. + - `**kwargs` (optional): scope variables can also be passed as + keyword arguments. These are applied after `scope` and `code`. + + .. versionchanged:: 3.4 + The default value for :attr:`scope` is ``None`` instead of ``{}``. + + """ + + _type_marker = 13 + + def __new__(cls, code, scope=None, **kwargs): + if not isinstance(code, string_type): + raise TypeError("code must be an " + "instance of %s" % (string_type.__name__)) + + if not PY3 and isinstance(code, text_type): + self = str.__new__(cls, code.encode('utf8')) + else: + self = str.__new__(cls, code) + + try: + self.__scope = code.scope + except AttributeError: + self.__scope = None + + if scope is not None: + if not isinstance(scope, abc.Mapping): + raise TypeError("scope must be an instance of dict") + if self.__scope is not None: + self.__scope.update(scope) + else: + self.__scope = scope + + if kwargs: + if self.__scope is not None: + self.__scope.update(kwargs) + else: + self.__scope = kwargs + + return self + + @property + def scope(self): + """Scope dictionary for this instance or ``None``. + """ + return self.__scope + + def __repr__(self): + return "Code(%s, %r)" % (str.__repr__(self), self.__scope) + + def __eq__(self, other): + if isinstance(other, Code): + return (self.__scope, str(self)) == (other.__scope, str(other)) + return False + + __hash__ = None + + def __ne__(self, other): + return not self == other diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/codec_options.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/codec_options.py new file mode 100644 index 00000000..8b848290 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/codec_options.py @@ -0,0 +1,346 @@ +# Copyright 2014-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for specifying BSON codec options.""" + +import datetime +import warnings + +from abc import abstractmethod +from collections import namedtuple + +from bson.py3compat import ABC, abc, abstractproperty, string_type + +from bson.binary import (UuidRepresentation, + ALL_UUID_REPRESENTATIONS, + UUID_REPRESENTATION_NAMES) + + +_RAW_BSON_DOCUMENT_MARKER = 101 + + +def _raw_document_class(document_class): + """Determine if a document_class is a RawBSONDocument class.""" + marker = getattr(document_class, '_type_marker', None) + return marker == _RAW_BSON_DOCUMENT_MARKER + + +class TypeEncoder(ABC): + """Base class for defining type codec classes which describe how a + custom type can be transformed to one of the types BSON understands. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def python_type(self): + """The Python type to be converted into something serializable.""" + pass + + @abstractmethod + def transform_python(self, value): + """Convert the given Python object into something serializable.""" + pass + + +class TypeDecoder(ABC): + """Base class for defining type codec classes which describe how a + BSON type can be transformed to a custom type. + + Codec classes must implement the ``bson_type`` attribute, and the + ``transform_bson`` method to support decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + @abstractproperty + def bson_type(self): + """The BSON type to be converted into our own type.""" + pass + + @abstractmethod + def transform_bson(self, value): + """Convert the given BSON value into our own type.""" + pass + + +class TypeCodec(TypeEncoder, TypeDecoder): + """Base class for defining type codec classes which describe how a + custom type can be transformed to/from one of the types :mod:`bson` + can already encode/decode. + + Codec classes must implement the ``python_type`` attribute, and the + ``transform_python`` method to support encoding, as well as the + ``bson_type`` attribute, and the ``transform_bson`` method to support + decoding. + + See :ref:`custom-type-type-codec` documentation for an example. + """ + pass + + +class TypeRegistry(object): + """Encapsulates type codecs used in encoding and / or decoding BSON, as + well as the fallback encoder. Type registries cannot be modified after + instantiation. + + ``TypeRegistry`` can be initialized with an iterable of type codecs, and + a callable for the fallback encoder:: + + >>> from bson.codec_options import TypeRegistry + >>> type_registry = TypeRegistry([Codec1, Codec2, Codec3, ...], + ... fallback_encoder) + + See :ref:`custom-type-type-registry` documentation for an example. + + :Parameters: + - `type_codecs` (optional): iterable of type codec instances. If + ``type_codecs`` contains multiple codecs that transform a single + python or BSON type, the transformation specified by the type codec + occurring last prevails. A TypeError will be raised if one or more + type codecs modify the encoding behavior of a built-in :mod:`bson` + type. + - `fallback_encoder` (optional): callable that accepts a single, + unencodable python value and transforms it into a type that + :mod:`bson` can encode. See :ref:`fallback-encoder-callable` + documentation for an example. + """ + def __init__(self, type_codecs=None, fallback_encoder=None): + self.__type_codecs = list(type_codecs or []) + self._fallback_encoder = fallback_encoder + self._encoder_map = {} + self._decoder_map = {} + + if self._fallback_encoder is not None: + if not callable(fallback_encoder): + raise TypeError("fallback_encoder %r is not a callable" % ( + fallback_encoder)) + + for codec in self.__type_codecs: + is_valid_codec = False + if isinstance(codec, TypeEncoder): + self._validate_type_encoder(codec) + is_valid_codec = True + self._encoder_map[codec.python_type] = codec.transform_python + if isinstance(codec, TypeDecoder): + is_valid_codec = True + self._decoder_map[codec.bson_type] = codec.transform_bson + if not is_valid_codec: + raise TypeError( + "Expected an instance of %s, %s, or %s, got %r instead" % ( + TypeEncoder.__name__, TypeDecoder.__name__, + TypeCodec.__name__, codec)) + + def _validate_type_encoder(self, codec): + from bson import _BUILT_IN_TYPES + for pytype in _BUILT_IN_TYPES: + if issubclass(codec.python_type, pytype): + err_msg = ("TypeEncoders cannot change how built-in types are " + "encoded (encoder %s transforms type %s)" % + (codec, pytype)) + raise TypeError(err_msg) + + def __repr__(self): + return ('%s(type_codecs=%r, fallback_encoder=%r)' % ( + self.__class__.__name__, self.__type_codecs, + self._fallback_encoder)) + + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + return ((self._decoder_map == other._decoder_map) and + (self._encoder_map == other._encoder_map) and + (self._fallback_encoder == other._fallback_encoder)) + + +_options_base = namedtuple( + 'CodecOptions', + ('document_class', 'tz_aware', 'uuid_representation', + 'unicode_decode_error_handler', 'tzinfo', 'type_registry')) + + +class CodecOptions(_options_base): + """Encapsulates options used encoding and / or decoding BSON. + + The `document_class` option is used to define a custom type for use + decoding BSON documents. Access to the underlying raw BSON bytes for + a document is available using the :class:`~bson.raw_bson.RawBSONDocument` + type:: + + >>> from bson.raw_bson import RawBSONDocument + >>> from bson.codec_options import CodecOptions + >>> codec_options = CodecOptions(document_class=RawBSONDocument) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc.raw + '\\x16\\x00\\x00\\x00\\x07_id\\x00[0\\x165\\x91\\x10\\xea\\x14\\xe8\\xc5\\x8b\\x93\\x00' + + The document class can be any type that inherits from + :class:`~collections.MutableMapping`:: + + >>> class AttributeDict(dict): + ... # A dict that supports attribute access. + ... def __getattr__(self, key): + ... return self[key] + ... def __setattr__(self, key, value): + ... self[key] = value + ... + >>> codec_options = CodecOptions(document_class=AttributeDict) + >>> coll = db.get_collection('test', codec_options=codec_options) + >>> doc = coll.find_one() + >>> doc._id + ObjectId('5b3016359110ea14e8c58b93') + + See :doc:`/examples/datetimes` for examples using the `tz_aware` and + `tzinfo` options. + + See :class:`~bson.binary.UUIDLegacy` for examples using the + `uuid_representation` option. + + :Parameters: + - `document_class`: BSON documents returned in queries will be decoded + to an instance of this class. Must be a subclass of + :class:`~collections.MutableMapping`. Defaults to :class:`dict`. + - `tz_aware`: If ``True``, BSON datetimes will be decoded to timezone + aware instances of :class:`~datetime.datetime`. Otherwise they will be + naive. Defaults to ``False``. + - `uuid_representation`: The BSON representation to use when encoding + and decoding instances of :class:`~uuid.UUID`. Defaults to + :data:`~bson.binary.UuidRepresentation.PYTHON_LEGACY`. New + applications should consider setting this to + :data:`~bson.binary.UuidRepresentation.STANDARD` for cross language + compatibility. See :ref:`handling-uuid-data-example` for details. + - `unicode_decode_error_handler`: The error handler to apply when + a Unicode-related error occurs during BSON decoding that would + otherwise raise :exc:`UnicodeDecodeError`. Valid options include + 'strict', 'replace', and 'ignore'. Defaults to 'strict'. + - `tzinfo`: A :class:`~datetime.tzinfo` subclass that specifies the + timezone to/from which :class:`~datetime.datetime` objects should be + encoded/decoded. + - `type_registry`: Instance of :class:`TypeRegistry` used to customize + encoding and decoding behavior. + + .. versionadded:: 3.8 + `type_registry` attribute. + + .. warning:: Care must be taken when changing + `unicode_decode_error_handler` from its default value ('strict'). + The 'replace' and 'ignore' modes should not be used when documents + retrieved from the server will be modified in the client application + and stored back to the server. + """ + + def __new__(cls, document_class=dict, + tz_aware=False, + uuid_representation=None, + unicode_decode_error_handler="strict", + tzinfo=None, type_registry=None): + if not (issubclass(document_class, abc.MutableMapping) or + _raw_document_class(document_class)): + raise TypeError("document_class must be dict, bson.son.SON, " + "bson.raw_bson.RawBSONDocument, or a " + "sublass of collections.MutableMapping") + if not isinstance(tz_aware, bool): + raise TypeError("tz_aware must be True or False") + if uuid_representation is None: + uuid_representation = UuidRepresentation.PYTHON_LEGACY + elif uuid_representation not in ALL_UUID_REPRESENTATIONS: + raise ValueError("uuid_representation must be a value " + "from bson.binary.UuidRepresentation") + if not isinstance(unicode_decode_error_handler, (string_type, None)): + raise ValueError("unicode_decode_error_handler must be a string " + "or None") + if tzinfo is not None: + if not isinstance(tzinfo, datetime.tzinfo): + raise TypeError( + "tzinfo must be an instance of datetime.tzinfo") + if not tz_aware: + raise ValueError( + "cannot specify tzinfo without also setting tz_aware=True") + + type_registry = type_registry or TypeRegistry() + + if not isinstance(type_registry, TypeRegistry): + raise TypeError("type_registry must be an instance of TypeRegistry") + + return tuple.__new__( + cls, (document_class, tz_aware, uuid_representation, + unicode_decode_error_handler, tzinfo, type_registry)) + + def _arguments_repr(self): + """Representation of the arguments used to create this object.""" + document_class_repr = ( + 'dict' if self.document_class is dict + else repr(self.document_class)) + + uuid_rep_repr = UUID_REPRESENTATION_NAMES.get(self.uuid_representation, + self.uuid_representation) + + return ('document_class=%s, tz_aware=%r, uuid_representation=%s, ' + 'unicode_decode_error_handler=%r, tzinfo=%r, ' + 'type_registry=%r' % + (document_class_repr, self.tz_aware, uuid_rep_repr, + self.unicode_decode_error_handler, self.tzinfo, + self.type_registry)) + + def _options_dict(self): + """Dictionary of the arguments used to create this object.""" + # TODO: PYTHON-2442 use _asdict() instead + return { + 'document_class': self.document_class, + 'tz_aware': self.tz_aware, + 'uuid_representation': self.uuid_representation, + 'unicode_decode_error_handler': self.unicode_decode_error_handler, + 'tzinfo': self.tzinfo, + 'type_registry': self.type_registry} + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, self._arguments_repr()) + + def with_options(self, **kwargs): + """Make a copy of this CodecOptions, overriding some options:: + + >>> from bson.codec_options import DEFAULT_CODEC_OPTIONS + >>> DEFAULT_CODEC_OPTIONS.tz_aware + False + >>> options = DEFAULT_CODEC_OPTIONS.with_options(tz_aware=True) + >>> options.tz_aware + True + + .. versionadded:: 3.5 + """ + opts = self._options_dict() + opts.update(kwargs) + return CodecOptions(**opts) + + +DEFAULT_CODEC_OPTIONS = CodecOptions( + uuid_representation=UuidRepresentation.PYTHON_LEGACY) + + +def _parse_codec_options(options): + """Parse BSON codec options.""" + return CodecOptions( + document_class=options.get( + 'document_class', DEFAULT_CODEC_OPTIONS.document_class), + tz_aware=options.get( + 'tz_aware', DEFAULT_CODEC_OPTIONS.tz_aware), + uuid_representation=options.get('uuidrepresentation'), + unicode_decode_error_handler=options.get( + 'unicode_decode_error_handler', + DEFAULT_CODEC_OPTIONS.unicode_decode_error_handler), + tzinfo=options.get('tzinfo', DEFAULT_CODEC_OPTIONS.tzinfo), + type_registry=options.get( + 'type_registry', DEFAULT_CODEC_OPTIONS.type_registry)) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/dbref.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/dbref.py new file mode 100644 index 00000000..3c9ae5f4 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/dbref.py @@ -0,0 +1,135 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for manipulating DBRefs (references to MongoDB documents).""" + +from copy import deepcopy + +from bson.py3compat import iteritems, string_type +from bson.son import SON + + +class DBRef(object): + """A reference to a document stored in MongoDB. + """ + + # DBRef isn't actually a BSON "type" so this number was arbitrarily chosen. + _type_marker = 100 + + def __init__(self, collection, id, database=None, _extra={}, **kwargs): + """Initialize a new :class:`DBRef`. + + Raises :class:`TypeError` if `collection` or `database` is not + an instance of :class:`basestring` (:class:`str` in python 3). + `database` is optional and allows references to documents to work + across databases. Any additional keyword arguments will create + additional fields in the resultant embedded document. + + :Parameters: + - `collection`: name of the collection the document is stored in + - `id`: the value of the document's ``"_id"`` field + - `database` (optional): name of the database to reference + - `**kwargs` (optional): additional keyword arguments will + create additional, custom fields + + .. seealso:: The MongoDB documentation on `dbrefs `_. + """ + if not isinstance(collection, string_type): + raise TypeError("collection must be an " + "instance of %s" % string_type.__name__) + if database is not None and not isinstance(database, string_type): + raise TypeError("database must be an " + "instance of %s" % string_type.__name__) + + self.__collection = collection + self.__id = id + self.__database = database + kwargs.update(_extra) + self.__kwargs = kwargs + + @property + def collection(self): + """Get the name of this DBRef's collection as unicode. + """ + return self.__collection + + @property + def id(self): + """Get this DBRef's _id. + """ + return self.__id + + @property + def database(self): + """Get the name of this DBRef's database. + + Returns None if this DBRef doesn't specify a database. + """ + return self.__database + + def __getattr__(self, key): + try: + return self.__kwargs[key] + except KeyError: + raise AttributeError(key) + + # Have to provide __setstate__ to avoid + # infinite recursion since we override + # __getattr__. + def __setstate__(self, state): + self.__dict__.update(state) + + def as_doc(self): + """Get the SON document representation of this DBRef. + + Generally not needed by application developers + """ + doc = SON([("$ref", self.collection), + ("$id", self.id)]) + if self.database is not None: + doc["$db"] = self.database + doc.update(self.__kwargs) + return doc + + def __repr__(self): + extra = "".join([", %s=%r" % (k, v) + for k, v in iteritems(self.__kwargs)]) + if self.database is None: + return "DBRef(%r, %r%s)" % (self.collection, self.id, extra) + return "DBRef(%r, %r, %r%s)" % (self.collection, self.id, + self.database, extra) + + def __eq__(self, other): + if isinstance(other, DBRef): + us = (self.__database, self.__collection, + self.__id, self.__kwargs) + them = (other.__database, other.__collection, + other.__id, other.__kwargs) + return us == them + return NotImplemented + + def __ne__(self, other): + return not self == other + + def __hash__(self): + """Get a hash value for this :class:`DBRef`.""" + return hash((self.__collection, self.__id, self.__database, + tuple(sorted(self.__kwargs.items())))) + + def __deepcopy__(self, memo): + """Support function for `copy.deepcopy()`.""" + return DBRef(deepcopy(self.__collection, memo), + deepcopy(self.__id, memo), + deepcopy(self.__database, memo), + deepcopy(self.__kwargs, memo)) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/decimal128.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/decimal128.py new file mode 100644 index 00000000..0c0fc10c --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/decimal128.py @@ -0,0 +1,335 @@ +# Copyright 2016-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for working with the BSON decimal128 type. + +.. versionadded:: 3.4 + +.. note:: The Decimal128 BSON type requires MongoDB 3.4+. +""" + +import decimal +import struct +import sys + +from bson.py3compat import (PY3 as _PY3, + string_type as _string_type) + + +if _PY3: + _from_bytes = int.from_bytes # pylint: disable=no-member, invalid-name +else: + import binascii + def _from_bytes(value, dummy, _int=int, _hexlify=binascii.hexlify): + "An implementation of int.from_bytes for python 2.x." + return _int(_hexlify(value), 16) + + +_PACK_64 = struct.Struct("= 3.3, cdecimal + decimal.Context(clamp=1) # pylint: disable=unexpected-keyword-arg + _CTX_OPTIONS['clamp'] = 1 +except TypeError: + # Python < 3.3 + _CTX_OPTIONS['_clamp'] = 1 + +_DEC128_CTX = decimal.Context(**_CTX_OPTIONS.copy()) + + +def create_decimal128_context(): + """Returns an instance of :class:`decimal.Context` appropriate + for working with IEEE-754 128-bit decimal floating point values. + """ + opts = _CTX_OPTIONS.copy() + opts['traps'] = [] + return decimal.Context(**opts) + + +def _decimal_to_128(value): + """Converts a decimal.Decimal to BID (high bits, low bits). + + :Parameters: + - `value`: An instance of decimal.Decimal + """ + with decimal.localcontext(_DEC128_CTX) as ctx: + value = ctx.create_decimal(value) + + if value.is_infinite(): + return _NINF if value.is_signed() else _PINF + + sign, digits, exponent = value.as_tuple() + + if value.is_nan(): + if digits: + raise ValueError("NaN with debug payload is not supported") + if value.is_snan(): + return _NSNAN if value.is_signed() else _PSNAN + return _NNAN if value.is_signed() else _PNAN + + significand = int("".join([str(digit) for digit in digits])) + bit_length = significand.bit_length() + + high = 0 + low = 0 + for i in range(min(64, bit_length)): + if significand & (1 << i): + low |= 1 << i + + for i in range(64, bit_length): + if significand & (1 << i): + high |= 1 << (i - 64) + + biased_exponent = exponent + _EXPONENT_BIAS + + if high >> 49 == 1: + high = high & 0x7fffffffffff + high |= _EXPONENT_MASK + high |= (biased_exponent & 0x3fff) << 47 + else: + high |= biased_exponent << 49 + + if sign: + high |= _SIGN + + return high, low + + +class Decimal128(object): + """BSON Decimal128 type:: + + >>> Decimal128(Decimal("0.0005")) + Decimal128('0.0005') + >>> Decimal128("0.0005") + Decimal128('0.0005') + >>> Decimal128((3474527112516337664, 5)) + Decimal128('0.0005') + + :Parameters: + - `value`: An instance of :class:`decimal.Decimal`, string, or tuple of + (high bits, low bits) from Binary Integer Decimal (BID) format. + + .. note:: :class:`~Decimal128` uses an instance of :class:`decimal.Context` + configured for IEEE-754 Decimal128 when validating parameters. + Signals like :class:`decimal.InvalidOperation`, :class:`decimal.Inexact`, + and :class:`decimal.Overflow` are trapped and raised as exceptions:: + + >>> Decimal128(".13.1") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.InvalidOperation: [] + >>> + >>> Decimal128("1E-6177") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Inexact: [] + >>> + >>> Decimal128("1E6145") + Traceback (most recent call last): + File "", line 1, in + ... + decimal.Overflow: [, ] + + To ensure the result of a calculation can always be stored as BSON + Decimal128 use the context returned by + :func:`create_decimal128_context`:: + + >>> import decimal + >>> decimal128_ctx = create_decimal128_context() + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal(".13.3")) + ... + Decimal128('NaN') + >>> + >>> with decimal.localcontext(decimal128_ctx) as ctx: + ... Decimal128(ctx.create_decimal("1E-6177")) + ... + Decimal128('0E-6176') + >>> + >>> with decimal.localcontext(DECIMAL128_CTX) as ctx: + ... Decimal128(ctx.create_decimal("1E6145")) + ... + Decimal128('Infinity') + + To match the behavior of MongoDB's Decimal128 implementation + str(Decimal(value)) may not match str(Decimal128(value)) for NaN values:: + + >>> Decimal128(Decimal('NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-NaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('sNaN')) + Decimal128('NaN') + >>> Decimal128(Decimal('-sNaN')) + Decimal128('NaN') + + However, :meth:`~Decimal128.to_decimal` will return the exact value:: + + >>> Decimal128(Decimal('NaN')).to_decimal() + Decimal('NaN') + >>> Decimal128(Decimal('-NaN')).to_decimal() + Decimal('-NaN') + >>> Decimal128(Decimal('sNaN')).to_decimal() + Decimal('sNaN') + >>> Decimal128(Decimal('-sNaN')).to_decimal() + Decimal('-sNaN') + + Two instances of :class:`Decimal128` compare equal if their Binary + Integer Decimal encodings are equal:: + + >>> Decimal128('NaN') == Decimal128('NaN') + True + >>> Decimal128('NaN').bid == Decimal128('NaN').bid + True + + This differs from :class:`decimal.Decimal` comparisons for NaN:: + + >>> Decimal('NaN') == Decimal('NaN') + False + """ + __slots__ = ('__high', '__low') + + _type_marker = 19 + + def __init__(self, value): + if isinstance(value, (_string_type, decimal.Decimal)): + self.__high, self.__low = _decimal_to_128(value) + elif isinstance(value, (list, tuple)): + if len(value) != 2: + raise ValueError('Invalid size for creation of Decimal128 ' + 'from list or tuple. Must have exactly 2 ' + 'elements.') + self.__high, self.__low = value + else: + raise TypeError("Cannot convert %r to Decimal128" % (value,)) + + def to_decimal(self): + """Returns an instance of :class:`decimal.Decimal` for this + :class:`Decimal128`. + """ + high = self.__high + low = self.__low + sign = 1 if (high & _SIGN) else 0 + + if (high & _SNAN) == _SNAN: + return decimal.Decimal((sign, (), 'N')) + elif (high & _NAN) == _NAN: + return decimal.Decimal((sign, (), 'n')) + elif (high & _INF) == _INF: + return decimal.Decimal((sign, (), 'F')) + + if (high & _EXPONENT_MASK) == _EXPONENT_MASK: + exponent = ((high & 0x1fffe00000000000) >> 47) - _EXPONENT_BIAS + return decimal.Decimal((sign, (0,), exponent)) + else: + exponent = ((high & 0x7fff800000000000) >> 49) - _EXPONENT_BIAS + + arr = bytearray(15) + mask = 0x00000000000000ff + for i in range(14, 6, -1): + arr[i] = (low & mask) >> ((14 - i) << 3) + mask = mask << 8 + + mask = 0x00000000000000ff + for i in range(6, 0, -1): + arr[i] = (high & mask) >> ((6 - i) << 3) + mask = mask << 8 + + mask = 0x0001000000000000 + arr[0] = (high & mask) >> 48 + + # cdecimal only accepts a tuple for digits. + digits = tuple( + int(digit) for digit in str(_from_bytes(arr, 'big'))) + + with decimal.localcontext(_DEC128_CTX) as ctx: + return ctx.create_decimal((sign, digits, exponent)) + + @classmethod + def from_bid(cls, value): + """Create an instance of :class:`Decimal128` from Binary Integer + Decimal string. + + :Parameters: + - `value`: 16 byte string (128-bit IEEE 754-2008 decimal floating + point in Binary Integer Decimal (BID) format). + """ + if not isinstance(value, bytes): + raise TypeError("value must be an instance of bytes") + if len(value) != 16: + raise ValueError("value must be exactly 16 bytes") + return cls((_UNPACK_64(value[8:])[0], _UNPACK_64(value[:8])[0])) + + @property + def bid(self): + """The Binary Integer Decimal (BID) encoding of this instance.""" + return _PACK_64(self.__low) + _PACK_64(self.__high) + + def __str__(self): + dec = self.to_decimal() + if dec.is_nan(): + # Required by the drivers spec to match MongoDB behavior. + return "NaN" + return str(dec) + + def __repr__(self): + return "Decimal128('%s')" % (str(self),) + + def __setstate__(self, value): + self.__high, self.__low = value + + def __getstate__(self): + return self.__high, self.__low + + def __eq__(self, other): + if isinstance(other, Decimal128): + return self.bid == other.bid + return NotImplemented + + def __ne__(self, other): + return not self == other diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/errors.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/errors.py new file mode 100644 index 00000000..9bdb7413 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/errors.py @@ -0,0 +1,40 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Exceptions raised by the BSON package.""" + + +class BSONError(Exception): + """Base class for all BSON exceptions. + """ + + +class InvalidBSON(BSONError): + """Raised when trying to create a BSON object from invalid data. + """ + + +class InvalidStringData(BSONError): + """Raised when trying to encode a string containing non-UTF8 data. + """ + + +class InvalidDocument(BSONError): + """Raised when trying to create a BSON object from an invalid document. + """ + + +class InvalidId(BSONError): + """Raised when trying to create an ObjectId from invalid data. + """ diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/int64.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/int64.py new file mode 100644 index 00000000..77e98123 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/int64.py @@ -0,0 +1,34 @@ +# Copyright 2014-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""A BSON wrapper for long (int in python3)""" + +from bson.py3compat import PY3 + +if PY3: + long = int + + +class Int64(long): + """Representation of the BSON int64 type. + + This is necessary because every integral number is an :class:`int` in + Python 3. Small integral numbers are encoded to BSON int32 by default, + but Int64 numbers will always be encoded to BSON int64. + + :Parameters: + - `value`: the numeric value to represent + """ + + _type_marker = 18 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/json_util.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/json_util.py new file mode 100644 index 00000000..38c39a12 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/json_util.py @@ -0,0 +1,863 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for using Python's :mod:`json` module with BSON documents. + +This module provides two helper methods `dumps` and `loads` that wrap the +native :mod:`json` methods and provide explicit BSON conversion to and from +JSON. :class:`~bson.json_util.JSONOptions` provides a way to control how JSON +is emitted and parsed, with the default being the legacy PyMongo format. +:mod:`~bson.json_util` can also generate Canonical or Relaxed `Extended JSON`_ +when :const:`CANONICAL_JSON_OPTIONS` or :const:`RELAXED_JSON_OPTIONS` is +provided, respectively. + +.. _Extended JSON: https://github.com/mongodb/specifications/blob/master/source/extended-json.rst + +Example usage (deserialization): + +.. doctest:: + + >>> from bson.json_util import loads + >>> loads('[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$scope": {}, "$code": "function x() { return 1; }"}}, {"bin": {"$type": "80", "$binary": "AQIDBA=="}}]') + [{u'foo': [1, 2]}, {u'bar': {u'hello': u'world'}}, {u'code': Code('function x() { return 1; }', {})}, {u'bin': Binary('...', 128)}] + +Example usage (serialization): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }", {})}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}]) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }", "$scope": {}}}, {"bin": {"$binary": "AQIDBA==", "$type": "00"}}]' + +Example usage (with :const:`CANONICAL_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, CANONICAL_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=CANONICAL_JSON_OPTIONS) + '[{"foo": [{"$numberInt": "1"}, {"$numberInt": "2"}]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Example usage (with :const:`RELAXED_JSON_OPTIONS`): + +.. doctest:: + + >>> from bson import Binary, Code + >>> from bson.json_util import dumps, RELAXED_JSON_OPTIONS + >>> dumps([{'foo': [1, 2]}, + ... {'bar': {'hello': 'world'}}, + ... {'code': Code("function x() { return 1; }")}, + ... {'bin': Binary(b"\x01\x02\x03\x04")}], + ... json_options=RELAXED_JSON_OPTIONS) + '[{"foo": [1, 2]}, {"bar": {"hello": "world"}}, {"code": {"$code": "function x() { return 1; }"}}, {"bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}}]' + +Alternatively, you can manually pass the `default` to :func:`json.dumps`. +It won't handle :class:`~bson.binary.Binary` and :class:`~bson.code.Code` +instances (as they are extended strings you can't provide custom defaults), +but it will be faster as there is less recursion. + +.. note:: + If your application does not need the flexibility offered by + :class:`JSONOptions` and spends a large amount of time in the `json_util` + module, look to + `python-bsonjs `_ for a nice + performance improvement. `python-bsonjs` is a fast BSON to MongoDB + Extended JSON converter for Python built on top of + `libbson `_. `python-bsonjs` works best + with PyMongo when using :class:`~bson.raw_bson.RawBSONDocument`. + +.. versionchanged:: 2.8 + The output format for :class:`~bson.timestamp.Timestamp` has changed from + '{"t": , "i": }' to '{"$timestamp": {"t": , "i": }}'. + This new format will be decoded to an instance of + :class:`~bson.timestamp.Timestamp`. The old format will continue to be + decoded to a python dict as before. Encoding to the old format is no longer + supported as it was never correct and loses type information. + Added support for $numberLong and $undefined - new in MongoDB 2.6 - and + parsing $date in ISO-8601 format. + +.. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + +.. versionchanged:: 2.3 + Added dumps and loads helpers to automatically handle conversion to and + from json and supports :class:`~bson.binary.Binary` and + :class:`~bson.code.Code` +""" + +import base64 +import datetime +import json +import math +import re +import uuid + +from pymongo.errors import ConfigurationError + +import bson +from bson import EPOCH_AWARE, RE_TYPE, SON +from bson.binary import (Binary, UuidRepresentation, ALL_UUID_SUBTYPES, + UUID_SUBTYPE) +from bson.code import Code +from bson.codec_options import CodecOptions +from bson.dbref import DBRef +from bson.decimal128 import Decimal128 +from bson.int64 import Int64 +from bson.max_key import MaxKey +from bson.min_key import MinKey +from bson.objectid import ObjectId +from bson.py3compat import (PY3, iteritems, integer_types, string_type, + text_type) +from bson.regex import Regex +from bson.timestamp import Timestamp +from bson.tz_util import utc + + +_RE_OPT_TABLE = { + "i": re.I, + "l": re.L, + "m": re.M, + "s": re.S, + "u": re.U, + "x": re.X, +} + +# Dollar-prefixed keys which may appear in DBRefs. +_DBREF_KEYS = frozenset(['$id', '$ref', '$db']) + + +class DatetimeRepresentation: + LEGACY = 0 + """Legacy MongoDB Extended JSON datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": }`, where `dateAsMilliseconds` is + a 64-bit signed integer giving the number of milliseconds since the Unix + epoch UTC. This was the default encoding before PyMongo version 3.4. + + .. versionadded:: 3.4 + """ + + NUMBERLONG = 1 + """NumberLong datetime representation. + + :class:`datetime.datetime` instances will be encoded to JSON in the + format `{"$date": {"$numberLong": ""}}`, + where `dateAsMilliseconds` is the string representation of a 64-bit signed + integer giving the number of milliseconds since the Unix epoch UTC. + + .. versionadded:: 3.4 + """ + + ISO8601 = 2 + """ISO-8601 datetime representation. + + :class:`datetime.datetime` instances greater than or equal to the Unix + epoch UTC will be encoded to JSON in the format `{"$date": ""}`. + :class:`datetime.datetime` instances before the Unix epoch UTC will be + encoded as if the datetime representation is + :const:`~DatetimeRepresentation.NUMBERLONG`. + + .. versionadded:: 3.4 + """ + + +class JSONMode: + LEGACY = 0 + """Legacy Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces PyMongo's legacy + non-standard JSON output. Consider using + :const:`~bson.json_util.JSONMode.RELAXED` or + :const:`~bson.json_util.JSONMode.CANONICAL` instead. + + .. versionadded:: 3.5 + """ + + RELAXED = 1 + """Relaxed Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Relaxed Extended JSON, + a mostly JSON-like format. Consider using this for things like a web API, + where one is sending a document (or a projection of a document) that only + uses ordinary JSON type primitives. In particular, the ``int``, + :class:`~bson.int64.Int64`, and ``float`` numeric types are represented in + the native JSON number format. This output is also the most human readable + and is useful for debugging and documentation. + + .. seealso:: The specification for Relaxed `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + CANONICAL = 2 + """Canonical Extended JSON representation. + + In this mode, :func:`~bson.json_util.dumps` produces Canonical Extended + JSON, a type preserving format. Consider using this for things like + testing, where one has to precisely specify expected types in JSON. In + particular, the ``int``, :class:`~bson.int64.Int64`, and ``float`` numeric + types are encoded with type wrappers. + + .. seealso:: The specification for Canonical `Extended JSON`_. + + .. versionadded:: 3.5 + """ + + +class JSONOptions(CodecOptions): + """Encapsulates JSON options for :func:`dumps` and :func:`loads`. + + :Parameters: + - `strict_number_long`: If ``True``, :class:`~bson.int64.Int64` objects + are encoded to MongoDB Extended JSON's *Strict mode* type + `NumberLong`, ie ``'{"$numberLong": "" }'``. Otherwise they + will be encoded as an `int`. Defaults to ``False``. + - `datetime_representation`: The representation to use when encoding + instances of :class:`datetime.datetime`. Defaults to + :const:`~DatetimeRepresentation.LEGACY`. + - `strict_uuid`: If ``True``, :class:`uuid.UUID` object are encoded to + MongoDB Extended JSON's *Strict mode* type `Binary`. Otherwise it + will be encoded as ``'{"$uuid": "" }'``. Defaults to ``False``. + - `json_mode`: The :class:`JSONMode` to use when encoding BSON types to + Extended JSON. Defaults to :const:`~JSONMode.LEGACY`. + - `document_class`: BSON documents returned by :func:`loads` will be + decoded to an instance of this class. Must be a subclass of + :class:`collections.MutableMapping`. Defaults to :class:`dict`. + - `uuid_representation`: The :class:`~bson.binary.UuidRepresentation` + to use when encoding and decoding instances of :class:`uuid.UUID`. + Defaults to :const:`~bson.binary.UuidRepresentation.PYTHON_LEGACY`. + - `tz_aware`: If ``True``, MongoDB Extended JSON's *Strict mode* type + `Date` will be decoded to timezone aware instances of + :class:`datetime.datetime`. Otherwise they will be naive. Defaults + to ``True``. + - `tzinfo`: A :class:`datetime.tzinfo` subclass that specifies the + timezone from which :class:`~datetime.datetime` objects should be + decoded. Defaults to :const:`~bson.tz_util.utc`. + - `args`: arguments to :class:`~bson.codec_options.CodecOptions` + - `kwargs`: arguments to :class:`~bson.codec_options.CodecOptions` + + .. seealso:: The specification for Relaxed and Canonical `Extended JSON`_. + + .. versionadded:: 3.4 + + .. versionchanged:: 3.5 + Accepts the optional parameter `json_mode`. + + """ + + def __new__(cls, strict_number_long=False, + datetime_representation=DatetimeRepresentation.LEGACY, + strict_uuid=False, json_mode=JSONMode.LEGACY, + *args, **kwargs): + kwargs["tz_aware"] = kwargs.get("tz_aware", True) + if kwargs["tz_aware"]: + kwargs["tzinfo"] = kwargs.get("tzinfo", utc) + if datetime_representation not in (DatetimeRepresentation.LEGACY, + DatetimeRepresentation.NUMBERLONG, + DatetimeRepresentation.ISO8601): + raise ConfigurationError( + "JSONOptions.datetime_representation must be one of LEGACY, " + "NUMBERLONG, or ISO8601 from DatetimeRepresentation.") + self = super(JSONOptions, cls).__new__(cls, *args, **kwargs) + if json_mode not in (JSONMode.LEGACY, + JSONMode.RELAXED, + JSONMode.CANONICAL): + raise ConfigurationError( + "JSONOptions.json_mode must be one of LEGACY, RELAXED, " + "or CANONICAL from JSONMode.") + self.json_mode = json_mode + if self.json_mode == JSONMode.RELAXED: + self.strict_number_long = False + self.datetime_representation = DatetimeRepresentation.ISO8601 + self.strict_uuid = True + elif self.json_mode == JSONMode.CANONICAL: + self.strict_number_long = True + self.datetime_representation = DatetimeRepresentation.NUMBERLONG + self.strict_uuid = True + else: + self.strict_number_long = strict_number_long + self.datetime_representation = datetime_representation + self.strict_uuid = strict_uuid + return self + + def _arguments_repr(self): + return ('strict_number_long=%r, ' + 'datetime_representation=%r, ' + 'strict_uuid=%r, json_mode=%r, %s' % ( + self.strict_number_long, + self.datetime_representation, + self.strict_uuid, + self.json_mode, + super(JSONOptions, self)._arguments_repr())) + + def _options_dict(self): + # TODO: PYTHON-2442 use _asdict() instead + options_dict = super(JSONOptions, self)._options_dict() + options_dict.update({ + 'strict_number_long': self.strict_number_long, + 'datetime_representation': self.datetime_representation, + 'strict_uuid': self.strict_uuid, + 'json_mode': self.json_mode}) + return options_dict + + def with_options(self, **kwargs): + """ + Make a copy of this JSONOptions, overriding some options:: + + >>> from bson.json_util import CANONICAL_JSON_OPTIONS + >>> CANONICAL_JSON_OPTIONS.tz_aware + True + >>> json_options = CANONICAL_JSON_OPTIONS.with_options(tz_aware=False) + >>> json_options.tz_aware + False + + .. versionadded:: 3.12 + """ + opts = self._options_dict() + for opt in ('strict_number_long', 'datetime_representation', + 'strict_uuid', 'json_mode'): + opts[opt] = kwargs.get(opt, getattr(self, opt)) + opts.update(kwargs) + return JSONOptions(**opts) + + +LEGACY_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.LEGACY) +""":class:`JSONOptions` for encoding to PyMongo's legacy JSON format. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.LEGACY`. + +.. versionadded:: 3.5 +""" + +DEFAULT_JSON_OPTIONS = LEGACY_JSON_OPTIONS +"""The default :class:`JSONOptions` for JSON encoding/decoding. + +The same as :const:`LEGACY_JSON_OPTIONS`. This will change to +:const:`RELAXED_JSON_OPTIONS` in a future release. + +.. versionadded:: 3.4 +""" + +CANONICAL_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.CANONICAL) +""":class:`JSONOptions` for Canonical Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.CANONICAL`. + +.. versionadded:: 3.5 +""" + +RELAXED_JSON_OPTIONS = JSONOptions(json_mode=JSONMode.RELAXED) +""":class:`JSONOptions` for Relaxed Extended JSON. + +.. seealso:: The documentation for :const:`bson.json_util.JSONMode.RELAXED`. + +.. versionadded:: 3.5 +""" + +STRICT_JSON_OPTIONS = JSONOptions( + strict_number_long=True, + datetime_representation=DatetimeRepresentation.ISO8601, + strict_uuid=True) +"""**DEPRECATED** - :class:`JSONOptions` for MongoDB Extended JSON's *Strict +mode* encoding. + +.. versionadded:: 3.4 + +.. versionchanged:: 3.5 + Deprecated. Use :const:`RELAXED_JSON_OPTIONS` or + :const:`CANONICAL_JSON_OPTIONS` instead. +""" + + +def dumps(obj, *args, **kwargs): + """Helper function that wraps :func:`json.dumps`. + + Recursive function that handles all BSON types including + :class:`~bson.binary.Binary` and :class:`~bson.code.Code`. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + encoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + + .. versionchanged:: 2.7 + Preserves order when rendering SON, Timestamp, Code, Binary, and DBRef + instances. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + return json.dumps(_json_convert(obj, json_options), *args, **kwargs) + + +def loads(s, *args, **kwargs): + """Helper function that wraps :func:`json.loads`. + + Automatically passes the object_hook for BSON type conversion. + + Raises ``TypeError``, ``ValueError``, ``KeyError``, or + :exc:`~bson.errors.InvalidId` on invalid MongoDB Extended JSON. + + :Parameters: + - `json_options`: A :class:`JSONOptions` instance used to modify the + decoding of MongoDB Extended JSON types. Defaults to + :const:`DEFAULT_JSON_OPTIONS`. + + .. versionchanged:: 3.5 + Parses Relaxed and Canonical Extended JSON as well as PyMongo's legacy + format. Now raises ``TypeError`` or ``ValueError`` when parsing JSON + type wrappers with values of the wrong type or any extra keys. + + .. versionchanged:: 3.4 + Accepts optional parameter `json_options`. See :class:`JSONOptions`. + """ + json_options = kwargs.pop("json_options", DEFAULT_JSON_OPTIONS) + kwargs["object_pairs_hook"] = lambda pairs: object_pairs_hook( + pairs, json_options) + return json.loads(s, *args, **kwargs) + + +def _json_convert(obj, json_options=DEFAULT_JSON_OPTIONS): + """Recursive helper method that converts BSON types so they can be + converted into json. + """ + if hasattr(obj, 'iteritems') or hasattr(obj, 'items'): # PY3 support + return SON(((k, _json_convert(v, json_options)) + for k, v in iteritems(obj))) + elif hasattr(obj, '__iter__') and not isinstance(obj, (text_type, bytes)): + return list((_json_convert(v, json_options) for v in obj)) + try: + return default(obj, json_options) + except TypeError: + return obj + + +def object_pairs_hook(pairs, json_options=DEFAULT_JSON_OPTIONS): + return object_hook(json_options.document_class(pairs), json_options) + + +def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): + if "$oid" in dct: + return _parse_canonical_oid(dct) + if "$ref" in dct: + return _parse_canonical_dbref(dct) + if "$date" in dct: + return _parse_canonical_datetime(dct, json_options) + if "$regex" in dct: + return _parse_legacy_regex(dct) + if "$minKey" in dct: + return _parse_canonical_minkey(dct) + if "$maxKey" in dct: + return _parse_canonical_maxkey(dct) + if "$binary" in dct: + if "$type" in dct: + return _parse_legacy_binary(dct, json_options) + else: + return _parse_canonical_binary(dct, json_options) + if "$code" in dct: + return _parse_canonical_code(dct) + if "$uuid" in dct: + return _parse_legacy_uuid(dct, json_options) + if "$undefined" in dct: + return None + if "$numberLong" in dct: + return _parse_canonical_int64(dct) + if "$timestamp" in dct: + tsp = dct["$timestamp"] + return Timestamp(tsp["t"], tsp["i"]) + if "$numberDecimal" in dct: + return _parse_canonical_decimal128(dct) + if "$dbPointer" in dct: + return _parse_canonical_dbpointer(dct) + if "$regularExpression" in dct: + return _parse_canonical_regex(dct) + if "$symbol" in dct: + return _parse_canonical_symbol(dct) + if "$numberInt" in dct: + return _parse_canonical_int32(dct) + if "$numberDouble" in dct: + return _parse_canonical_double(dct) + return dct + + +def _parse_legacy_regex(doc): + pattern = doc["$regex"] + # Check if this is the $regex query operator. + if isinstance(pattern, Regex): + return doc + flags = 0 + # PyMongo always adds $options but some other tools may not. + for opt in doc.get("$options", ""): + flags |= _RE_OPT_TABLE.get(opt, 0) + return Regex(pattern, flags) + + +def _parse_legacy_uuid(doc, json_options): + """Decode a JSON legacy $uuid to Python UUID.""" + if len(doc) != 1: + raise TypeError('Bad $uuid, extra field(s): %s' % (doc,)) + if not isinstance(doc["$uuid"], text_type): + raise TypeError('$uuid must be a string: %s' % (doc,)) + if json_options.uuid_representation == UuidRepresentation.UNSPECIFIED: + return Binary.from_uuid(uuid.UUID(doc["$uuid"])) + else: + return uuid.UUID(doc["$uuid"]) + + +def _binary_or_uuid(data, subtype, json_options): + # special handling for UUID + if subtype in ALL_UUID_SUBTYPES: + uuid_representation = json_options.uuid_representation + binary_value = Binary(data, subtype) + if uuid_representation == UuidRepresentation.UNSPECIFIED: + return binary_value + if subtype == UUID_SUBTYPE: + # Legacy behavior: use STANDARD with binary subtype 4. + uuid_representation = UuidRepresentation.STANDARD + elif uuid_representation == UuidRepresentation.STANDARD: + # subtype == OLD_UUID_SUBTYPE + # Legacy behavior: STANDARD is the same as PYTHON_LEGACY. + uuid_representation = UuidRepresentation.PYTHON_LEGACY + return binary_value.as_uuid(uuid_representation) + + if PY3 and subtype == 0: + return data + return Binary(data, subtype) + + +def _parse_legacy_binary(doc, json_options): + if isinstance(doc["$type"], int): + doc["$type"] = "%02x" % doc["$type"] + subtype = int(doc["$type"], 16) + if subtype >= 0xffffff80: # Handle mongoexport values + subtype = int(doc["$type"][6:], 16) + data = base64.b64decode(doc["$binary"].encode()) + return _binary_or_uuid(data, subtype, json_options) + + +def _parse_canonical_binary(doc, json_options): + binary = doc["$binary"] + b64 = binary["base64"] + subtype = binary["subType"] + if not isinstance(b64, string_type): + raise TypeError('$binary base64 must be a string: %s' % (doc,)) + if not isinstance(subtype, string_type) or len(subtype) > 2: + raise TypeError('$binary subType must be a string at most 2 ' + 'characters: %s' % (doc,)) + if len(binary) != 2: + raise TypeError('$binary must include only "base64" and "subType" ' + 'components: %s' % (doc,)) + + data = base64.b64decode(b64.encode()) + return _binary_or_uuid(data, int(subtype, 16), json_options) + + +def _parse_canonical_datetime(doc, json_options): + """Decode a JSON datetime to python datetime.datetime.""" + dtm = doc["$date"] + if len(doc) != 1: + raise TypeError('Bad $date, extra field(s): %s' % (doc,)) + # mongoexport 2.6 and newer + if isinstance(dtm, string_type): + # Parse offset + if dtm[-1] == 'Z': + dt = dtm[:-1] + offset = 'Z' + elif dtm[-6] in ('+', '-') and dtm[-3] == ':': + # (+|-)HH:MM + dt = dtm[:-6] + offset = dtm[-6:] + elif dtm[-5] in ('+', '-'): + # (+|-)HHMM + dt = dtm[:-5] + offset = dtm[-5:] + elif dtm[-3] in ('+', '-'): + # (+|-)HH + dt = dtm[:-3] + offset = dtm[-3:] + else: + dt = dtm + offset = '' + + # Parse the optional factional seconds portion. + dot_index = dt.rfind('.') + microsecond = 0 + if dot_index != -1: + microsecond = int(float(dt[dot_index:]) * 1000000) + dt = dt[:dot_index] + + aware = datetime.datetime.strptime( + dt, "%Y-%m-%dT%H:%M:%S").replace(microsecond=microsecond, + tzinfo=utc) + + if offset and offset != 'Z': + if len(offset) == 6: + hours, minutes = offset[1:].split(':') + secs = (int(hours) * 3600 + int(minutes) * 60) + elif len(offset) == 5: + secs = (int(offset[1:3]) * 3600 + int(offset[3:]) * 60) + elif len(offset) == 3: + secs = int(offset[1:3]) * 3600 + if offset[0] == "-": + secs *= -1 + aware = aware - datetime.timedelta(seconds=secs) + + if json_options.tz_aware: + if json_options.tzinfo: + aware = aware.astimezone(json_options.tzinfo) + return aware + else: + return aware.replace(tzinfo=None) + return bson._millis_to_datetime(int(dtm), json_options) + + +def _parse_canonical_oid(doc): + """Decode a JSON ObjectId to bson.objectid.ObjectId.""" + if len(doc) != 1: + raise TypeError('Bad $oid, extra field(s): %s' % (doc,)) + return ObjectId(doc['$oid']) + + +def _parse_canonical_symbol(doc): + """Decode a JSON symbol to Python string.""" + symbol = doc['$symbol'] + if len(doc) != 1: + raise TypeError('Bad $symbol, extra field(s): %s' % (doc,)) + return text_type(symbol) + + +def _parse_canonical_code(doc): + """Decode a JSON code to bson.code.Code.""" + for key in doc: + if key not in ('$code', '$scope'): + raise TypeError('Bad $code, extra field(s): %s' % (doc,)) + return Code(doc['$code'], scope=doc.get('$scope')) + + +def _parse_canonical_regex(doc): + """Decode a JSON regex to bson.regex.Regex.""" + regex = doc['$regularExpression'] + if len(doc) != 1: + raise TypeError('Bad $regularExpression, extra field(s): %s' % (doc,)) + if len(regex) != 2: + raise TypeError('Bad $regularExpression must include only "pattern"' + 'and "options" components: %s' % (doc,)) + return Regex(regex['pattern'], regex['options']) + + +def _parse_canonical_dbref(doc): + """Decode a JSON DBRef to bson.dbref.DBRef.""" + for key in doc: + if key.startswith('$') and key not in _DBREF_KEYS: + # Other keys start with $, so dct cannot be parsed as a DBRef. + return doc + return DBRef(doc.pop('$ref'), doc.pop('$id'), + database=doc.pop('$db', None), **doc) + + +def _parse_canonical_dbpointer(doc): + """Decode a JSON (deprecated) DBPointer to bson.dbref.DBRef.""" + dbref = doc['$dbPointer'] + if len(doc) != 1: + raise TypeError('Bad $dbPointer, extra field(s): %s' % (doc,)) + if isinstance(dbref, DBRef): + dbref_doc = dbref.as_doc() + # DBPointer must not contain $db in its value. + if dbref.database is not None: + raise TypeError( + 'Bad $dbPointer, extra field $db: %s' % (dbref_doc,)) + if not isinstance(dbref.id, ObjectId): + raise TypeError( + 'Bad $dbPointer, $id must be an ObjectId: %s' % (dbref_doc,)) + if len(dbref_doc) != 2: + raise TypeError( + 'Bad $dbPointer, extra field(s) in DBRef: %s' % (dbref_doc,)) + return dbref + else: + raise TypeError('Bad $dbPointer, expected a DBRef: %s' % (doc,)) + + +def _parse_canonical_int32(doc): + """Decode a JSON int32 to python int.""" + i_str = doc['$numberInt'] + if len(doc) != 1: + raise TypeError('Bad $numberInt, extra field(s): %s' % (doc,)) + if not isinstance(i_str, string_type): + raise TypeError('$numberInt must be string: %s' % (doc,)) + return int(i_str) + + +def _parse_canonical_int64(doc): + """Decode a JSON int64 to bson.int64.Int64.""" + l_str = doc['$numberLong'] + if len(doc) != 1: + raise TypeError('Bad $numberLong, extra field(s): %s' % (doc,)) + return Int64(l_str) + + +def _parse_canonical_double(doc): + """Decode a JSON double to python float.""" + d_str = doc['$numberDouble'] + if len(doc) != 1: + raise TypeError('Bad $numberDouble, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDouble must be string: %s' % (doc,)) + return float(d_str) + + +def _parse_canonical_decimal128(doc): + """Decode a JSON decimal128 to bson.decimal128.Decimal128.""" + d_str = doc['$numberDecimal'] + if len(doc) != 1: + raise TypeError('Bad $numberDecimal, extra field(s): %s' % (doc,)) + if not isinstance(d_str, string_type): + raise TypeError('$numberDecimal must be string: %s' % (doc,)) + return Decimal128(d_str) + + +def _parse_canonical_minkey(doc): + """Decode a JSON MinKey to bson.min_key.MinKey.""" + if type(doc['$minKey']) is not int or doc['$minKey'] != 1: + raise TypeError('$minKey value must be 1: %s' % (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MinKey() + + +def _parse_canonical_maxkey(doc): + """Decode a JSON MaxKey to bson.max_key.MaxKey.""" + if type(doc['$maxKey']) is not int or doc['$maxKey'] != 1: + raise TypeError('$maxKey value must be 1: %s', (doc,)) + if len(doc) != 1: + raise TypeError('Bad $minKey, extra field(s): %s' % (doc,)) + return MaxKey() + + +def _encode_binary(data, subtype, json_options): + if json_options.json_mode == JSONMode.LEGACY: + return SON([ + ('$binary', base64.b64encode(data).decode()), + ('$type', "%02x" % subtype)]) + return {'$binary': SON([ + ('base64', base64.b64encode(data).decode()), + ('subType', "%02x" % subtype)])} + + +def default(obj, json_options=DEFAULT_JSON_OPTIONS): + # We preserve key order when rendering SON, DBRef, etc. as JSON by + # returning a SON for those types instead of a dict. + if isinstance(obj, ObjectId): + return {"$oid": str(obj)} + if isinstance(obj, DBRef): + return _json_convert(obj.as_doc(), json_options=json_options) + if isinstance(obj, datetime.datetime): + if (json_options.datetime_representation == + DatetimeRepresentation.ISO8601): + if not obj.tzinfo: + obj = obj.replace(tzinfo=utc) + if obj >= EPOCH_AWARE: + off = obj.tzinfo.utcoffset(obj) + if (off.days, off.seconds, off.microseconds) == (0, 0, 0): + tz_string = 'Z' + else: + tz_string = obj.strftime('%z') + millis = int(obj.microsecond / 1000) + fracsecs = ".%03d" % (millis,) if millis else "" + return {"$date": "%s%s%s" % ( + obj.strftime("%Y-%m-%dT%H:%M:%S"), fracsecs, tz_string)} + + millis = bson._datetime_to_millis(obj) + if (json_options.datetime_representation == + DatetimeRepresentation.LEGACY): + return {"$date": millis} + return {"$date": {"$numberLong": str(millis)}} + if json_options.strict_number_long and isinstance(obj, Int64): + return {"$numberLong": str(obj)} + if isinstance(obj, (RE_TYPE, Regex)): + flags = "" + if obj.flags & re.IGNORECASE: + flags += "i" + if obj.flags & re.LOCALE: + flags += "l" + if obj.flags & re.MULTILINE: + flags += "m" + if obj.flags & re.DOTALL: + flags += "s" + if obj.flags & re.UNICODE: + flags += "u" + if obj.flags & re.VERBOSE: + flags += "x" + if isinstance(obj.pattern, text_type): + pattern = obj.pattern + else: + pattern = obj.pattern.decode('utf-8') + if json_options.json_mode == JSONMode.LEGACY: + return SON([("$regex", pattern), ("$options", flags)]) + return {'$regularExpression': SON([("pattern", pattern), + ("options", flags)])} + if isinstance(obj, MinKey): + return {"$minKey": 1} + if isinstance(obj, MaxKey): + return {"$maxKey": 1} + if isinstance(obj, Timestamp): + return {"$timestamp": SON([("t", obj.time), ("i", obj.inc)])} + if isinstance(obj, Code): + if obj.scope is None: + return {'$code': str(obj)} + return SON([ + ('$code', str(obj)), + ('$scope', _json_convert(obj.scope, json_options))]) + if isinstance(obj, Binary): + return _encode_binary(obj, obj.subtype, json_options) + if PY3 and isinstance(obj, bytes): + return _encode_binary(obj, 0, json_options) + if isinstance(obj, uuid.UUID): + if json_options.strict_uuid: + binval = Binary.from_uuid( + obj, uuid_representation=json_options.uuid_representation) + return _encode_binary(binval, binval.subtype, json_options) + else: + return {"$uuid": obj.hex} + if isinstance(obj, Decimal128): + return {"$numberDecimal": str(obj)} + if isinstance(obj, bool): + return obj + if (json_options.json_mode == JSONMode.CANONICAL and + isinstance(obj, integer_types)): + if -2 ** 31 <= obj < 2 ** 31: + return {'$numberInt': text_type(obj)} + return {'$numberLong': text_type(obj)} + if json_options.json_mode != JSONMode.LEGACY and isinstance(obj, float): + if math.isnan(obj): + return {'$numberDouble': 'NaN'} + elif math.isinf(obj): + representation = 'Infinity' if obj > 0 else '-Infinity' + return {'$numberDouble': representation} + elif json_options.json_mode == JSONMode.CANONICAL: + # repr() will return the shortest string guaranteed to produce the + # original value, when float() is called on it. str produces a + # shorter string in Python 2. + return {'$numberDouble': text_type(repr(obj))} + raise TypeError("%r is not JSON serializable" % obj) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/max_key.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/max_key.py new file mode 100644 index 00000000..7e89dd70 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/max_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Representation for the MongoDB internal MaxKey type. +""" + + +class MaxKey(object): + """MongoDB internal MaxKey type. + + .. versionchanged:: 2.7 + ``MaxKey`` now implements comparison operators. + """ + + _type_marker = 127 + + def __eq__(self, other): + return isinstance(other, MaxKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, other): + return isinstance(other, MaxKey) + + def __lt__(self, dummy): + return False + + def __ge__(self, dummy): + return True + + def __gt__(self, other): + return not isinstance(other, MaxKey) + + def __repr__(self): + return "MaxKey()" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/min_key.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/min_key.py new file mode 100644 index 00000000..b03520e9 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/min_key.py @@ -0,0 +1,50 @@ +# Copyright 2010-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Representation for the MongoDB internal MinKey type. +""" + + +class MinKey(object): + """MongoDB internal MinKey type. + + .. versionchanged:: 2.7 + ``MinKey`` now implements comparison operators. + """ + + _type_marker = 255 + + def __eq__(self, other): + return isinstance(other, MinKey) + + def __hash__(self): + return hash(self._type_marker) + + def __ne__(self, other): + return not self == other + + def __le__(self, dummy): + return True + + def __lt__(self, other): + return not isinstance(other, MinKey) + + def __ge__(self, other): + return isinstance(other, MinKey) + + def __gt__(self, dummy): + return False + + def __repr__(self): + return "MinKey()" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/objectid.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/objectid.py new file mode 100644 index 00000000..ae47c437 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/objectid.py @@ -0,0 +1,299 @@ +# Copyright 2009-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for working with MongoDB `ObjectIds +`_. +""" + +import binascii +import calendar +import datetime +import os +import struct +import threading +import time + +from random import SystemRandom + +from bson.errors import InvalidId +from bson.py3compat import PY3, bytes_from_hex, string_type, text_type +from bson.tz_util import utc + + +_MAX_COUNTER_VALUE = 0xFFFFFF + + +def _raise_invalid_id(oid): + raise InvalidId( + "%r is not a valid ObjectId, it must be a 12-byte input" + " or a 24-character hex string" % oid) + + +def _random_bytes(): + """Get the 5-byte random field of an ObjectId.""" + return os.urandom(5) + + +class ObjectId(object): + """A MongoDB ObjectId. + """ + + _pid = os.getpid() + + _inc = SystemRandom().randint(0, _MAX_COUNTER_VALUE) + _inc_lock = threading.Lock() + + __random = _random_bytes() + + __slots__ = ('__id',) + + _type_marker = 7 + + def __init__(self, oid=None): + """Initialize a new ObjectId. + + An ObjectId is a 12-byte unique identifier consisting of: + + - a 4-byte value representing the seconds since the Unix epoch, + - a 5-byte random value, + - a 3-byte counter, starting with a random value. + + By default, ``ObjectId()`` creates a new unique identifier. The + optional parameter `oid` can be an :class:`ObjectId`, or any 12 + :class:`bytes` or, in Python 2, any 12-character :class:`str`. + + For example, the 12 bytes b'foo-bar-quux' do not follow the ObjectId + specification but they are acceptable input:: + + >>> ObjectId(b'foo-bar-quux') + ObjectId('666f6f2d6261722d71757578') + + `oid` can also be a :class:`unicode` or :class:`str` of 24 hex digits:: + + >>> ObjectId('0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + >>> + >>> # A u-prefixed unicode literal: + >>> ObjectId(u'0123456789ab0123456789ab') + ObjectId('0123456789ab0123456789ab') + + Raises :class:`~bson.errors.InvalidId` if `oid` is not 12 bytes nor + 24 hex digits, or :class:`TypeError` if `oid` is not an accepted type. + + :Parameters: + - `oid` (optional): a valid ObjectId. + + .. seealso:: The MongoDB documentation on `ObjectIds`_. + + .. versionchanged:: 3.8 + :class:`~bson.objectid.ObjectId` now implements the `ObjectID + specification version 0.2 + `_. + """ + if oid is None: + self.__generate() + elif isinstance(oid, bytes) and len(oid) == 12: + self.__id = oid + else: + self.__validate(oid) + + @classmethod + def from_datetime(cls, generation_time): + """Create a dummy ObjectId instance with a specific generation time. + + This method is useful for doing range queries on a field + containing :class:`ObjectId` instances. + + .. warning:: + It is not safe to insert a document containing an ObjectId + generated using this method. This method deliberately + eliminates the uniqueness guarantee that ObjectIds + generally provide. ObjectIds generated with this method + should be used exclusively in queries. + + `generation_time` will be converted to UTC. Naive datetime + instances will be treated as though they already contain UTC. + + An example using this helper to get documents where ``"_id"`` + was generated before January 1, 2010 would be: + + >>> gen_time = datetime.datetime(2010, 1, 1) + >>> dummy_id = ObjectId.from_datetime(gen_time) + >>> result = collection.find({"_id": {"$lt": dummy_id}}) + + :Parameters: + - `generation_time`: :class:`~datetime.datetime` to be used + as the generation time for the resulting ObjectId. + """ + if generation_time.utcoffset() is not None: + generation_time = generation_time - generation_time.utcoffset() + timestamp = calendar.timegm(generation_time.timetuple()) + oid = struct.pack( + ">I", int(timestamp)) + b"\x00\x00\x00\x00\x00\x00\x00\x00" + return cls(oid) + + @classmethod + def is_valid(cls, oid): + """Checks if a `oid` string is valid or not. + + :Parameters: + - `oid`: the object id to validate + + .. versionadded:: 2.3 + """ + if not oid: + return False + + try: + ObjectId(oid) + return True + except (InvalidId, TypeError): + return False + + @classmethod + def _random(cls): + """Generate a 5-byte random number once per process. + """ + pid = os.getpid() + if pid != cls._pid: + cls._pid = pid + cls.__random = _random_bytes() + return cls.__random + + def __generate(self): + """Generate a new value for this ObjectId. + """ + + # 4 bytes current time + oid = struct.pack(">I", int(time.time())) + + # 5 bytes random + oid += ObjectId._random() + + # 3 bytes inc + with ObjectId._inc_lock: + oid += struct.pack(">I", ObjectId._inc)[1:4] + ObjectId._inc = (ObjectId._inc + 1) % (_MAX_COUNTER_VALUE + 1) + + self.__id = oid + + def __validate(self, oid): + """Validate and use the given id for this ObjectId. + + Raises TypeError if id is not an instance of + (:class:`basestring` (:class:`str` or :class:`bytes` + in python 3), ObjectId) and InvalidId if it is not a + valid ObjectId. + + :Parameters: + - `oid`: a valid ObjectId + """ + if isinstance(oid, ObjectId): + self.__id = oid.binary + # bytes or unicode in python 2, str in python 3 + elif isinstance(oid, string_type): + if len(oid) == 24: + try: + self.__id = bytes_from_hex(oid) + except (TypeError, ValueError): + _raise_invalid_id(oid) + else: + _raise_invalid_id(oid) + else: + raise TypeError("id must be an instance of (bytes, %s, ObjectId), " + "not %s" % (text_type.__name__, type(oid))) + + @property + def binary(self): + """12-byte binary representation of this ObjectId. + """ + return self.__id + + @property + def generation_time(self): + """A :class:`datetime.datetime` instance representing the time of + generation for this :class:`ObjectId`. + + The :class:`datetime.datetime` is timezone aware, and + represents the generation time in UTC. It is precise to the + second. + """ + timestamp = struct.unpack(">I", self.__id[0:4])[0] + return datetime.datetime.fromtimestamp(timestamp, utc) + + def __getstate__(self): + """return value of object for pickling. + needed explicitly because __slots__() defined. + """ + return self.__id + + def __setstate__(self, value): + """explicit state set from pickling + """ + # Provide backwards compatability with OIDs + # pickled with pymongo-1.9 or older. + if isinstance(value, dict): + oid = value["_ObjectId__id"] + else: + oid = value + # ObjectIds pickled in python 2.x used `str` for __id. + # In python 3.x this has to be converted to `bytes` + # by encoding latin-1. + if PY3 and isinstance(oid, text_type): + self.__id = oid.encode('latin-1') + else: + self.__id = oid + + def __str__(self): + if PY3: + return binascii.hexlify(self.__id).decode() + return binascii.hexlify(self.__id) + + def __repr__(self): + return "ObjectId('%s')" % (str(self),) + + def __eq__(self, other): + if isinstance(other, ObjectId): + return self.__id == other.binary + return NotImplemented + + def __ne__(self, other): + if isinstance(other, ObjectId): + return self.__id != other.binary + return NotImplemented + + def __lt__(self, other): + if isinstance(other, ObjectId): + return self.__id < other.binary + return NotImplemented + + def __le__(self, other): + if isinstance(other, ObjectId): + return self.__id <= other.binary + return NotImplemented + + def __gt__(self, other): + if isinstance(other, ObjectId): + return self.__id > other.binary + return NotImplemented + + def __ge__(self, other): + if isinstance(other, ObjectId): + return self.__id >= other.binary + return NotImplemented + + def __hash__(self): + """Get a hash value for this :class:`ObjectId`.""" + return hash(self.__id) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/py3compat.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/py3compat.py new file mode 100644 index 00000000..84d1ea00 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/py3compat.py @@ -0,0 +1,107 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you +# may not use this file except in compliance with the License. You +# may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. + +"""Utility functions and definitions for python3 compatibility.""" + +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + import codecs + import collections.abc as abc + import _thread as thread + from abc import ABC, abstractmethod + from io import BytesIO as StringIO + + def abstractproperty(func): + return property(abstractmethod(func)) + + MAXSIZE = sys.maxsize + + imap = map + + def b(s): + # BSON and socket operations deal in binary data. In + # python 3 that means instances of `bytes`. In python + # 2.7 you can create an alias for `bytes` using + # the b prefix (e.g. b'foo'). + # See http://python3porting.com/problems.html#nicer-solutions + return codecs.latin_1_encode(s)[0] + + def bytes_from_hex(h): + return bytes.fromhex(h) + + def iteritems(d): + return iter(d.items()) + + def itervalues(d): + return iter(d.values()) + + def reraise(exctype, value, trace=None): + raise exctype(str(value)).with_traceback(trace) + + def reraise_instance(exc_instance, trace=None): + raise exc_instance.with_traceback(trace) + + def _unicode(s): + return s + + text_type = str + string_type = str + integer_types = int +else: + import collections as abc + import thread + from abc import ABCMeta, abstractproperty + + from itertools import imap + try: + from cStringIO import StringIO + except ImportError: + from StringIO import StringIO + + ABC = ABCMeta('ABC', (object,), {}) + + MAXSIZE = sys.maxint + + def b(s): + # See comments above. In python 2.x b('foo') is just 'foo'. + return s + + def bytes_from_hex(h): + return h.decode('hex') + + def iteritems(d): + return d.iteritems() + + def itervalues(d): + return d.itervalues() + + def reraise(exctype, value, trace=None): + _reraise(exctype, str(value), trace) + + def reraise_instance(exc_instance, trace=None): + _reraise(exc_instance, None, trace) + + # "raise x, y, z" raises SyntaxError in Python 3 + exec("""def _reraise(exc, value, trace): + raise exc, value, trace +""") + + _unicode = unicode + + string_type = basestring + text_type = unicode + integer_types = (int, long) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/raw_bson.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/raw_bson.py new file mode 100644 index 00000000..78d0aee5 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/raw_bson.py @@ -0,0 +1,176 @@ +# Copyright 2015-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing raw BSON documents. + +Inserting and Retrieving RawBSONDocuments +========================================= + +Example: Moving a document between different databases/collections + +.. doctest:: + + >>> import bson + >>> from pymongo import MongoClient + >>> from bson.raw_bson import RawBSONDocument + >>> client = MongoClient(document_class=RawBSONDocument) + >>> client.drop_database('db') + >>> client.drop_database('replica_db') + >>> db = client.db + >>> result = db.test.insert_many([{'a': 1}, + ... {'b': 1}, + ... {'c': 1}, + ... {'d': 1}]) + >>> replica_db = client.replica_db + >>> for doc in db.test.find(): + ... print("raw document: %r" % (doc.raw,)) + ... result = replica_db.test.insert_one(doc) + raw document: '...' + raw document: '...' + raw document: '...' + raw document: '...' + >>> for doc in replica_db.test.find(projection={'_id': 0}): + ... print("decoded document: %r" % (bson.decode(doc.raw),)) + decoded document: {u'a': 1} + decoded document: {u'b': 1} + decoded document: {u'c': 1} + decoded document: {u'd': 1} + +For use cases like moving documents across different databases or writing binary +blobs to disk, using raw BSON documents provides better speed and avoids the +overhead of decoding or encoding BSON. +""" + +from bson import _raw_to_dict, _get_object_size +from bson.py3compat import abc, iteritems +from bson.codec_options import ( + DEFAULT_CODEC_OPTIONS as DEFAULT, _RAW_BSON_DOCUMENT_MARKER) +from bson.son import SON + + +class RawBSONDocument(abc.Mapping): + """Representation for a MongoDB document that provides access to the raw + BSON bytes that compose it. + + Only when a field is accessed or modified within the document does + RawBSONDocument decode its bytes. + """ + + __slots__ = ('__raw', '__inflated_doc', '__codec_options') + _type_marker = _RAW_BSON_DOCUMENT_MARKER + + def __init__(self, bson_bytes, codec_options=None): + """Create a new :class:`RawBSONDocument` + + :class:`RawBSONDocument` is a representation of a BSON document that + provides access to the underlying raw BSON bytes. Only when a field is + accessed or modified within the document does RawBSONDocument decode + its bytes. + + :class:`RawBSONDocument` implements the ``Mapping`` abstract base + class from the standard library so it can be used like a read-only + ``dict``:: + + >>> from bson import encode + >>> raw_doc = RawBSONDocument(encode({'_id': 'my_doc'})) + >>> raw_doc.raw + b'...' + >>> raw_doc['_id'] + 'my_doc' + + :Parameters: + - `bson_bytes`: the BSON bytes that compose this document + - `codec_options` (optional): An instance of + :class:`~bson.codec_options.CodecOptions` whose ``document_class`` + must be :class:`RawBSONDocument`. The default is + :attr:`DEFAULT_RAW_BSON_OPTIONS`. + + .. versionchanged:: 3.8 + :class:`RawBSONDocument` now validates that the ``bson_bytes`` + passed in represent a single bson document. + + .. versionchanged:: 3.5 + If a :class:`~bson.codec_options.CodecOptions` is passed in, its + `document_class` must be :class:`RawBSONDocument`. + """ + self.__raw = bson_bytes + self.__inflated_doc = None + # Can't default codec_options to DEFAULT_RAW_BSON_OPTIONS in signature, + # it refers to this class RawBSONDocument. + if codec_options is None: + codec_options = DEFAULT_RAW_BSON_OPTIONS + elif codec_options.document_class is not RawBSONDocument: + raise TypeError( + "RawBSONDocument cannot use CodecOptions with document " + "class %s" % (codec_options.document_class, )) + self.__codec_options = codec_options + # Validate the bson object size. + _get_object_size(bson_bytes, 0, len(bson_bytes)) + + @property + def raw(self): + """The raw BSON bytes composing this document.""" + return self.__raw + + def items(self): + """Lazily decode and iterate elements in this document.""" + return iteritems(self.__inflated) + + @property + def __inflated(self): + if self.__inflated_doc is None: + # We already validated the object's size when this document was + # created, so no need to do that again. + # Use SON to preserve ordering of elements. + self.__inflated_doc = _inflate_bson( + self.__raw, self.__codec_options) + return self.__inflated_doc + + def __getitem__(self, item): + return self.__inflated[item] + + def __iter__(self): + return iter(self.__inflated) + + def __len__(self): + return len(self.__inflated) + + def __eq__(self, other): + if isinstance(other, RawBSONDocument): + return self.__raw == other.raw + return NotImplemented + + def __repr__(self): + return ("RawBSONDocument(%r, codec_options=%r)" + % (self.raw, self.__codec_options)) + + +def _inflate_bson(bson_bytes, codec_options): + """Inflates the top level fields of a BSON document. + + :Parameters: + - `bson_bytes`: the BSON bytes that compose this document + - `codec_options`: An instance of + :class:`~bson.codec_options.CodecOptions` whose ``document_class`` + must be :class:`RawBSONDocument`. + """ + # Use SON to preserve ordering of elements. + return _raw_to_dict( + bson_bytes, 4, len(bson_bytes)-1, codec_options, SON()) + + +DEFAULT_RAW_BSON_OPTIONS = DEFAULT.with_options(document_class=RawBSONDocument) +"""The default :class:`~bson.codec_options.CodecOptions` for +:class:`RawBSONDocument`. +""" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/regex.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/regex.py new file mode 100644 index 00000000..f9d39ad8 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/regex.py @@ -0,0 +1,128 @@ +# Copyright 2013-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing MongoDB regular expressions. +""" + +import re + +from bson.son import RE_TYPE +from bson.py3compat import string_type, text_type + + +def str_flags_to_int(str_flags): + flags = 0 + if "i" in str_flags: + flags |= re.IGNORECASE + if "l" in str_flags: + flags |= re.LOCALE + if "m" in str_flags: + flags |= re.MULTILINE + if "s" in str_flags: + flags |= re.DOTALL + if "u" in str_flags: + flags |= re.UNICODE + if "x" in str_flags: + flags |= re.VERBOSE + + return flags + + +class Regex(object): + """BSON regular expression data.""" + _type_marker = 11 + + @classmethod + def from_native(cls, regex): + """Convert a Python regular expression into a ``Regex`` instance. + + Note that in Python 3, a regular expression compiled from a + :class:`str` has the ``re.UNICODE`` flag set. If it is undesirable + to store this flag in a BSON regular expression, unset it first:: + + >>> pattern = re.compile('.*') + >>> regex = Regex.from_native(pattern) + >>> regex.flags ^= re.UNICODE + >>> db.collection.insert({'pattern': regex}) + + :Parameters: + - `regex`: A regular expression object from ``re.compile()``. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. + + .. _PCRE: http://www.pcre.org/ + """ + if not isinstance(regex, RE_TYPE): + raise TypeError( + "regex must be a compiled regular expression, not %s" + % type(regex)) + + return Regex(regex.pattern, regex.flags) + + def __init__(self, pattern, flags=0): + """BSON regular expression data. + + This class is useful to store and retrieve regular expressions that are + incompatible with Python's regular expression dialect. + + :Parameters: + - `pattern`: string + - `flags`: (optional) an integer bitmask, or a string of flag + characters like "im" for IGNORECASE and MULTILINE + """ + if not isinstance(pattern, (text_type, bytes)): + raise TypeError("pattern must be a string, not %s" % type(pattern)) + self.pattern = pattern + + if isinstance(flags, string_type): + self.flags = str_flags_to_int(flags) + elif isinstance(flags, int): + self.flags = flags + else: + raise TypeError( + "flags must be a string or int, not %s" % type(flags)) + + def __eq__(self, other): + if isinstance(other, Regex): + return self.pattern == other.pattern and self.flags == other.flags + else: + return NotImplemented + + __hash__ = None + + def __ne__(self, other): + return not self == other + + def __repr__(self): + return "Regex(%r, %r)" % (self.pattern, self.flags) + + def try_compile(self): + """Compile this :class:`Regex` as a Python regular expression. + + .. warning:: + Python regular expressions use a different syntax and different + set of flags than MongoDB, which uses `PCRE`_. A regular + expression retrieved from the server may not compile in + Python, or may match a different set of strings in Python than + when used in a MongoDB query. :meth:`try_compile()` may raise + :exc:`re.error`. + + .. _PCRE: http://www.pcre.org/ + """ + return re.compile(self.pattern, self.flags) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/son.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/son.py new file mode 100644 index 00000000..701cb231 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/son.py @@ -0,0 +1,200 @@ +# Copyright 2009-present MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for creating and manipulating SON, the Serialized Ocument Notation. + +Regular dictionaries can be used instead of SON objects, but not when the order +of keys is important. A SON object can be used just like a normal Python +dictionary.""" + +import copy +import re + +from bson.py3compat import abc, iteritems + + +# This sort of sucks, but seems to be as good as it gets... +# This is essentially the same as re._pattern_type +RE_TYPE = type(re.compile("")) + + +class SON(dict): + """SON data. + + A subclass of dict that maintains ordering of keys and provides a + few extra niceties for dealing with SON. SON provides an API + similar to collections.OrderedDict from Python 2.7+. + """ + + def __init__(self, data=None, **kwargs): + self.__keys = [] + dict.__init__(self) + self.update(data) + self.update(kwargs) + + def __new__(cls, *args, **kwargs): + instance = super(SON, cls).__new__(cls, *args, **kwargs) + instance.__keys = [] + return instance + + def __repr__(self): + result = [] + for key in self.__keys: + result.append("(%r, %r)" % (key, self[key])) + return "SON([%s])" % ", ".join(result) + + def __setitem__(self, key, value): + if key not in self.__keys: + self.__keys.append(key) + dict.__setitem__(self, key, value) + + def __delitem__(self, key): + self.__keys.remove(key) + dict.__delitem__(self, key) + + def keys(self): + return list(self.__keys) + + def copy(self): + other = SON() + other.update(self) + return other + + # TODO this is all from UserDict.DictMixin. it could probably be made more + # efficient. + # second level definitions support higher levels + def __iter__(self): + for k in self.__keys: + yield k + + def has_key(self, key): + return key in self.__keys + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + + def values(self): + return [v for _, v in self.iteritems()] + + def items(self): + return [(key, self[key]) for key in self] + + def clear(self): + self.__keys = [] + super(SON, self).clear() + + def setdefault(self, key, default=None): + try: + return self[key] + except KeyError: + self[key] = default + return default + + def pop(self, key, *args): + if len(args) > 1: + raise TypeError("pop expected at most 2 arguments, got "\ + + repr(1 + len(args))) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + + def popitem(self): + try: + k, v = next(self.iteritems()) + except StopIteration: + raise KeyError('container is empty') + del self[k] + return (k, v) + + def update(self, other=None, **kwargs): + # Make progressively weaker assumptions about "other" + if other is None: + pass + elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, 'keys'): + for k in other.keys(): + self[k] = other[k] + else: + for k, v in other: + self[k] = v + if kwargs: + self.update(kwargs) + + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + + def __eq__(self, other): + """Comparison to another SON is order-sensitive while comparison to a + regular dictionary is order-insensitive. + """ + if isinstance(other, SON): + return len(self) == len(other) and self.items() == other.items() + return self.to_dict() == other + + def __ne__(self, other): + return not self == other + + def __len__(self): + return len(self.__keys) + + def to_dict(self): + """Convert a SON document to a normal Python dictionary instance. + + This is trickier than just *dict(...)* because it needs to be + recursive. + """ + + def transform_value(value): + if isinstance(value, list): + return [transform_value(v) for v in value] + elif isinstance(value, abc.Mapping): + return dict([ + (k, transform_value(v)) + for k, v in iteritems(value)]) + else: + return value + + return transform_value(dict(self)) + + def __deepcopy__(self, memo): + out = SON() + val_id = id(self) + if val_id in memo: + return memo.get(val_id) + memo[val_id] = out + for k, v in self.iteritems(): + if not isinstance(v, RE_TYPE): + v = copy.deepcopy(v, memo) + out[k] = v + return out diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/timestamp.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/timestamp.py new file mode 100644 index 00000000..7ea75511 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/timestamp.py @@ -0,0 +1,120 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tools for representing MongoDB internal Timestamps. +""" + +import calendar +import datetime + +from bson.py3compat import integer_types +from bson.tz_util import utc + +UPPERBOUND = 4294967296 + + +class Timestamp(object): + """MongoDB internal timestamps used in the opLog. + """ + + _type_marker = 17 + + def __init__(self, time, inc): + """Create a new :class:`Timestamp`. + + This class is only for use with the MongoDB opLog. If you need + to store a regular timestamp, please use a + :class:`~datetime.datetime`. + + Raises :class:`TypeError` if `time` is not an instance of + :class: `int` or :class:`~datetime.datetime`, or `inc` is not + an instance of :class:`int`. Raises :class:`ValueError` if + `time` or `inc` is not in [0, 2**32). + + :Parameters: + - `time`: time in seconds since epoch UTC, or a naive UTC + :class:`~datetime.datetime`, or an aware + :class:`~datetime.datetime` + - `inc`: the incrementing counter + """ + if isinstance(time, datetime.datetime): + if time.utcoffset() is not None: + time = time - time.utcoffset() + time = int(calendar.timegm(time.timetuple())) + if not isinstance(time, integer_types): + raise TypeError("time must be an instance of int") + if not isinstance(inc, integer_types): + raise TypeError("inc must be an instance of int") + if not 0 <= time < UPPERBOUND: + raise ValueError("time must be contained in [0, 2**32)") + if not 0 <= inc < UPPERBOUND: + raise ValueError("inc must be contained in [0, 2**32)") + + self.__time = time + self.__inc = inc + + @property + def time(self): + """Get the time portion of this :class:`Timestamp`. + """ + return self.__time + + @property + def inc(self): + """Get the inc portion of this :class:`Timestamp`. + """ + return self.__inc + + def __eq__(self, other): + if isinstance(other, Timestamp): + return (self.__time == other.time and self.__inc == other.inc) + else: + return NotImplemented + + def __hash__(self): + return hash(self.time) ^ hash(self.inc) + + def __ne__(self, other): + return not self == other + + def __lt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) < (other.time, other.inc) + return NotImplemented + + def __le__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) <= (other.time, other.inc) + return NotImplemented + + def __gt__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) > (other.time, other.inc) + return NotImplemented + + def __ge__(self, other): + if isinstance(other, Timestamp): + return (self.time, self.inc) >= (other.time, other.inc) + return NotImplemented + + def __repr__(self): + return "Timestamp(%s, %s)" % (self.__time, self.__inc) + + def as_datetime(self): + """Return a :class:`~datetime.datetime` instance corresponding + to the time portion of this :class:`Timestamp`. + + The returned datetime's timezone is UTC. + """ + return datetime.datetime.fromtimestamp(self.__time, utc) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/tz_util.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/tz_util.py new file mode 100644 index 00000000..6ec918fb --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/bson/tz_util.py @@ -0,0 +1,52 @@ +# Copyright 2010-2015 MongoDB, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Timezone related utilities for BSON.""" + +from datetime import (timedelta, + tzinfo) + +ZERO = timedelta(0) + + +class FixedOffset(tzinfo): + """Fixed offset timezone, in minutes east from UTC. + + Implementation based from the Python `standard library documentation + `_. + Defining __getinitargs__ enables pickling / copying. + """ + + def __init__(self, offset, name): + if isinstance(offset, timedelta): + self.__offset = offset + else: + self.__offset = timedelta(minutes=offset) + self.__name = name + + def __getinitargs__(self): + return self.__offset, self.__name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + + +utc = FixedOffset(0, "UTC") +"""Fixed offset timezone representing UTC.""" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/LICENSE b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/LICENSE new file mode 100644 index 00000000..c2fda9a2 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/LICENSE @@ -0,0 +1,21 @@ +This package contains a modified version of ca-bundle.crt: + +ca-bundle.crt -- Bundle of CA Root Certificates + +Certificate data from Mozilla as of: Thu Nov 3 19:04:19 2011# +This is a bundle of X.509 certificates of public Certificate Authorities +(CA). These were automatically extracted from Mozilla's root certificates +file (certdata.txt). This file can be found in the mozilla source tree: +http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1# +It contains the certificates in PEM format and therefore +can be directly used with curl / libcurl / php_curl, or with +an Apache+mod_ssl webserver for SSL client authentication. +Just configure this file as the SSLCACertificateFile.# + +***** BEGIN LICENSE BLOCK ***** +This Source Code Form is subject to the terms of the Mozilla Public License, +v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. + +***** END LICENSE BLOCK ***** +@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/METADATA new file mode 100644 index 00000000..7a6860db --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/METADATA @@ -0,0 +1,83 @@ +Metadata-Version: 2.1 +Name: certifi +Version: 2021.10.8 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://certifiio.readthedocs.io/en/latest/ +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Project-URL: Documentation, https://certifiio.readthedocs.io/en/latest/ +Project-URL: Source, https://github.com/certifi/python-certifi +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 + +Certifi: Python SSL Certificates +================================ + +`Certifi`_ provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +1024-bit Root Certificates +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Browsers and certificate authorities have concluded that 1024-bit keys are +unacceptably weak for certificates, particularly root certificates. For this +reason, Mozilla has removed any weak (i.e. 1024-bit key) certificate from its +bundle, replacing it with an equivalent strong (i.e. 2048-bit or greater key) +certificate from the same CA. Because Mozilla removed these certificates from +its bundle, ``certifi`` removed them as well. + +In previous versions, ``certifi`` provided the ``certifi.old_where()`` function +to intentionally re-add the 1024-bit roots back into your bundle. This was not +recommended in production and therefore was removed at the end of 2018. + +.. _`Certifi`: https://certifiio.readthedocs.io/en/latest/ +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/RECORD new file mode 100644 index 00000000..824d4f82 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/RECORD @@ -0,0 +1,13 @@ +certifi-2021.10.8.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +certifi-2021.10.8.dist-info/LICENSE,sha256=vp2C82ES-Hp_HXTs1Ih-FGe7roh4qEAEoAEXseR1o-I,1049 +certifi-2021.10.8.dist-info/METADATA,sha256=iB_zbT1uX_8_NC7iGv0YEB-9b3idhQwHrFTSq8R1kD8,2994 +certifi-2021.10.8.dist-info/RECORD,, +certifi-2021.10.8.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110 +certifi-2021.10.8.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 +certifi/__init__.py,sha256=xWdRgntT3j1V95zkRipGOg_A1UfEju2FcpujhysZLRI,62 +certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 +certifi/__pycache__/__init__.cpython-39.pyc,, +certifi/__pycache__/__main__.cpython-39.pyc,, +certifi/__pycache__/core.cpython-39.pyc,, +certifi/cacert.pem,sha256=-og4Keu4zSpgL5shwfhd4kz0eUnVILzrGCi0zRy2kGw,265969 +certifi/core.py,sha256=V0uyxKOYdz6ulDSusclrLmjbPgOXsD0BnEf0SQ7OnoE,2303 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/WHEEL new file mode 100644 index 00000000..6d38aa06 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/top_level.txt new file mode 100644 index 00000000..963eac53 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi-2021.10.8.dist-info/top_level.txt @@ -0,0 +1 @@ +certifi diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__init__.py new file mode 100644 index 00000000..8db1a0e5 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import contents, where + +__version__ = "2021.10.08" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__main__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__main__.py new file mode 100644 index 00000000..8945b5da --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__main__.py @@ -0,0 +1,12 @@ +import argparse + +from certifi import contents, where + +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--contents", action="store_true") +args = parser.parse_args() + +if args.contents: + print(contents()) +else: + print(where()) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8a499e3c4af413d5ba134430dd465b6dd2a281e GIT binary patch literal 260 zcmYk0%}T^D6or$t$}q!#OPAeA7gIaqMnwi6K-`F%5(qW9Q=`ofNm}W=kq_aEbnD7j zaAmUd!2J$~1DDgT*Gm+2@pWwX(Z5spFA~FjJbxY`kib1sxWS4v1S3J3Ok_`}%ztpK zOENFG(E)Vu^U236I5;kM^=?~j>#DwfEb}?%#(_&uT^2E~7#qQPX*6S>$epGl;rChG z(jW}qbp6ovP*`W)fQQ29LQMrX$_@b>wbKZCysB>KgM6W02H4n^zqcKD%E1MBke7@} XEdyhfo#w@zGGgdqpZ5B+GO4UEY_9SWo3yFtamN z^tH9Uaudn~!=y43CPZ#O4sRwLRL46r8qjZ5DfKH-GiT-C>qZ=9S~NT7^ZGXBU4=(6AY_Vc`ErOfkryE62+ZbVWbfK|z9-Ky3&t+ns5$b+fyinN(X^ zU((m&UuYluBm5)t>XUz=FM4Lv*eaf34rk`f<@>&KqGr=4Xb->dN54Eme%QrT!#(m6 zr`kd%NRJ3ASW0_ze*q&WWh1A@M{duhM6jrWvnsf7k4VqkAlU*ZvbNWy#17FARpA}c zo-1n86PqMs%S8C1j^};BK9E*(U;42GoopxVV$c8j$9%s#OjIz+#Wkuk_nA4iwvBOsa`NR_b(x|T+;~GR@c_w zcf+@<-B-pNNFA1+*Jt}{-H*mm8cZz=5vGJNJR?xYe@l1%PCV;tk;jXJbUZ*63dnb4 ztOMjd+Cy@qVvLvi#on&Wb|1H&_TMC1eU)grSVZxsXdqSp0@+fWgG7Oi`*|oqUbFmc zsfp*+ecE8q#MrozijyR^3e1dSU=NmxtYDytrW5Rn118w9^X>MbbKsn?Q?fxAYQ=F( z9E!R;BC5Sy_5mfEwi_SEa9VcbmV$wWYq*GX zbSVxra1$)lC7jCQB=kBhcVfGk8O6Y6O9po_&}4_6U>#5C;WXw4$mi5{BkO>RC$M%b zSHLhdRgpjzjim9ya63t57#hBlCs~Ucy8SO4tKt)!7jPQvFC>^C_W2UY90u53*j2(2 z{Mf&m96zb>z=1LRP?{eL7Y(~`Y#@S?hjj#oU! R=se?;v&Nl<>sRI~zX3lV09yb6 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/cacert.pem b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/cacert.pem new file mode 100644 index 00000000..6d0ccc0d --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/cacert.pem @@ -0,0 +1,4362 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Subject: CN=EC-ACC O=Agencia Catalana de Certificacio (NIF Q-0801176-I) OU=Serveis Publics de Certificacio/Vegeu https://www.catcert.net/verarrel (c)03/Jerarquia Entitats de Certificacio Catalanes +# Label: "EC-ACC" +# Serial: -23701579247955709139626555126524820479 +# MD5 Fingerprint: eb:f5:9d:29:0d:61:f9:42:1f:7c:c2:ba:6d:e3:15:09 +# SHA1 Fingerprint: 28:90:3a:63:5b:52:80:fa:e6:77:4c:0b:6d:a7:d6:ba:a6:4a:f2:e8 +# SHA256 Fingerprint: 88:49:7f:01:60:2f:31:54:24:6a:e2:8c:4d:5a:ef:10:f1:d8:7e:bb:76:62:6f:4a:e0:b7:f9:5b:a7:96:87:99 +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +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 +mpv0 +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G4 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2015 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G4" +# Serial: 289383649854506086828220374796556676440 +# MD5 Fingerprint: 89:53:f1:83:23:b7:7c:8e:05:f1:8c:71:38:4e:1f:88 +# SHA1 Fingerprint: 14:88:4e:86:26:37:b0:26:af:59:62:5c:40:77:ec:35:29:ba:96:01 +# SHA256 Fingerprint: db:35:17:d1:f6:73:2a:2d:5a:b9:7c:53:3e:c7:07:79:ee:32:70:a6:2f:b4:ac:42:38:37:24:60:e6:f0:1e:88 +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw +gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL +Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg +MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw +BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0 +MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1 +c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ +bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ +2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E +T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j +5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM +C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T +DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX +wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A +2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm +nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl +N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj +c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS +5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS +Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr +hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/ +B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI +AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw +H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+ +b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk +2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol +IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk +5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY +n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft ECC Root Certificate Authority 2017" +# Serial: 136839042543790627607696632466672567020 +# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 +# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 +# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD +VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw +MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy +b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR +ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb +hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 +FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV +L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB +iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation +# Label: "Microsoft RSA Root Certificate Authority 2017" +# Serial: 40975477897264996090493496164228220339 +# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 +# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 +# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl +MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N +aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ +Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 +ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 +HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm +gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ +jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc +aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG +YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 +W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K +UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH ++FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q +W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC +LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC +gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 +tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh +SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 +TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 +pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR +xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp +GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 +dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN +AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB +RA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. +# Label: "e-Szigno Root CA 2017" +# Serial: 411379200276854331539784714 +# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 +# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 +# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV +BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk +LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv +b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ +BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg +THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v +IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv +xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H +Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB +eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo +jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ ++efcMQ== +-----END CERTIFICATE----- + +# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 +# Label: "certSIGN Root CA G2" +# Serial: 313609486401300475190 +# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 +# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 +# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV +BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g +Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ +BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ +R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF +dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw +vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ +uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp +n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs +cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW +xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P +rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF +DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx +DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy +LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C +eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ +d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq +kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl +qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 +OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c +NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk +ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO +pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj +03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk +PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE +1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX +QRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global Certification Authority" +# Serial: 1846098327275375458322922162 +# MD5 Fingerprint: f8:1c:18:2d:2f:ba:5f:6d:a1:6c:bc:c7:ab:91:c7:0e +# SHA1 Fingerprint: 2f:8f:36:4f:e1:58:97:44:21:59:87:a5:2a:9a:d0:69:95:26:7f:b5 +# SHA256 Fingerprint: 97:55:20:15:f5:dd:fc:3c:87:88:c0:06:94:45:55:40:88:94:45:00:84:f1:00:86:70:86:bc:1a:2b:b5:8d:c8 +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQsw +CQYDVQQGEwJVUzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28x +ITAfBgNVBAoMGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1 +c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMx +OTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJVUzERMA8GA1UECAwI +SWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ALldUShLPDeS0YLOvR29zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0Xzn +swuvCAAJWX/NKSqIk4cXGIDtiLK0thAfLdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu +7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4BqstTnoApTAbqOl5F2brz8 +1Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9oWN0EACyW +80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotP +JqX+OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1l +RtzuzWniTY+HKE40Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfw +hI0Vcnyh78zyiGG69Gm7DIwLdVcEuE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10 +coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm+9jaJXLE9gCxInm943xZYkqc +BW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqjifLJS3tBEW1n +twiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1Ud +DwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W +0OhUKDtkLSGm+J1WE2pIPU/HPinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfe +uyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0HZJDmHvUqoai7PF35owgLEQzxPy0Q +lG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla4gt5kNdXElE1GYhB +aCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5RvbbE +sLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPT +MaCm/zjdzyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qe +qu5AvzSxnI9O4fKSTx+O856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxh +VicGaeVyQYHTtgGJoC86cnn+OjC/QezHYj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8 +h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu3R3y4G5OBVixwJAWKqQ9 +EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP29FpHOTK +yeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P256 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P256 Certification Authority" +# Serial: 4151900041497450638097112925 +# MD5 Fingerprint: 5b:44:e3:8d:5d:36:86:26:e8:0d:05:d2:59:a7:83:54 +# SHA1 Fingerprint: b4:90:82:dd:45:0c:be:8b:5b:b1:66:d3:e2:a4:08:26:cd:ed:42:cf +# SHA256 Fingerprint: 94:5b:bc:82:5e:a5:54:f4:89:d1:fd:51:a7:3d:df:2e:a6:24:ac:70:19:a0:52:05:22:5c:22:a7:8c:cf:a8:b4 +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDI1NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqG +SM49AwEHA0IABH77bOYj43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoN +FWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqmP62jQzBBMA8GA1UdEwEB/wQFMAMBAf8w +DwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt0UrrdaVKEJmzsaGLSvcw +CgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjzRM4q3wgh +DDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +# Issuer: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Subject: CN=Trustwave Global ECC P384 Certification Authority O=Trustwave Holdings, Inc. +# Label: "Trustwave Global ECC P384 Certification Authority" +# Serial: 2704997926503831671788816187 +# MD5 Fingerprint: ea:cf:60:c4:3b:b9:15:29:40:a1:97:ed:78:27:93:d6 +# SHA1 Fingerprint: e7:f3:a3:c8:cf:6f:c3:04:2e:6d:0e:67:32:c5:9e:68:95:0d:5e:d2 +# SHA256 Fingerprint: 55:90:38:59:c8:c0:c3:eb:b8:75:9e:ce:4e:25:57:22:5f:f5:75:8b:bd:38:eb:d4:82:76:60:1e:1b:d5:80:97 +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAf +BgNVBAoTGFRydXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3 +YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0x +NzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYDVQQGEwJVUzERMA8G +A1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0 +d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBF +Q0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuB +BAAiA2IABGvaDXU1CDFHBa5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJ +j9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr/TklZvFe/oyujUF5nQlgziip04pt89ZF +1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8EBQMDBwYAMB0G +A1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNnADBkAjA3 +AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsC +MGclCrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVu +Sw== +-----END CERTIFICATE----- + +# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. +# Label: "NAVER Global Root Certification Authority" +# Serial: 9013692873798656336226253319739695165984492813 +# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b +# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 +# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM +BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG +T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx +CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD +b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA +iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH +38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE +HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz +kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP +szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq +vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf +nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG +YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo +0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a +CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K +AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I +36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN +qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj +cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm ++LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL +hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe +lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 +p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 +piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR +LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX +5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO +dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul +9XXeifdy +-----END CERTIFICATE----- + +# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres +# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" +# Serial: 131542671362353147877283741781055151509 +# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb +# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a +# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw +CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw +FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S +Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 +MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL +DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS +QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH +sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK +Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu +SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC +MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy +v+c= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa +# Label: "GlobalSign Root R46" +# Serial: 1552617688466950547958867513931858518042577 +# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef +# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 +# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA +MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD +VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy +MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt +c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ +OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG +vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud +316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo +0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE +y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF +zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE ++cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN +I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs +x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa +ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC +4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 +7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti +2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk +pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF +FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt +rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk +ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 +u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP +4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 +N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 +vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa +# Label: "GlobalSign Root E46" +# Serial: 1552617690338932563915843282459653771421763 +# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f +# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 +# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx +CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD +ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw +MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex +HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq +R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd +yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ +7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 ++RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +# Issuer: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Subject: CN=GLOBALTRUST 2020 O=e-commerce monitoring GmbH +# Label: "GLOBALTRUST 2020" +# Serial: 109160994242082918454945253 +# MD5 Fingerprint: 8a:c7:6f:cb:6d:e3:cc:a2:f1:7c:83:fa:0e:78:d7:e8 +# SHA1 Fingerprint: d0:67:c1:13:51:01:0c:aa:d0:c7:6a:65:37:31:16:26:4f:53:71:a2 +# SHA256 Fingerprint: 9a:29:6a:51:82:d1:d4:51:a2:e3:7f:43:9b:74:da:af:a2:67:52:33:29:f9:0f:9a:0d:20:07:c3:34:e2:3c:9a +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG +A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw +FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx +MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u +aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b +RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z +YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3 +QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw +yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+ +BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ +SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH +r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0 +4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me +dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw +q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2 +nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu +H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC +XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd +6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf ++I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi +kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7 +wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB +TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C +MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn +4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I +aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy +qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz +# Label: "ANF Secure Server Root CA" +# Serial: 996390341000653745 +# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 +# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 +# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum EC-384 CA" +# Serial: 160250656287871593594747141429395092468 +# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 +# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed +# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw +CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw +JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT +EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 +WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT +LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX +BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE +KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm +Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 +EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J +UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn +nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Root CA" +# Serial: 40870380103424195783807378461123655149 +# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 +# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 +# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique +# Label: "TunTrust Root CA" +# Serial: 108534058042236574382096126452369648152337120275 +# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 +# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb +# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL +BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg +Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv +b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG +EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u +IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ +n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd +2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF +VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ +GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF +li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU +r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 +eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb +MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg +jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB +7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW +5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE +ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z +xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu +QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 +FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH +22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP +xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn +dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 +Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b +nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ +CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH +u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj +d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS RSA Root CA 2021" +# Serial: 76817823531813593706434026085292783742 +# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 +# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d +# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs +MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg +Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL +MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l +mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE +4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv +a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M +pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw +Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b +LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY +AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB +AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq +E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr +W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ +CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU +X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 +f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja +H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP +JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P +zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt +jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 +/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT +BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 +aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW +xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU +63ZTGI0RmLo= +-----END CERTIFICATE----- + +# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA +# Label: "HARICA TLS ECC Root CA 2021" +# Serial: 137515985548005187474074462014555733966 +# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 +# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 +# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw +CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh +cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v +dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG +A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 +KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y +STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD +AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw +SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN +nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/core.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/core.py new file mode 100644 index 00000000..5d2b8cd3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/certifi/core.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem or its contents. +""" +import os + +try: + from importlib.resources import path as get_path, read_text + + _CACERT_CTX = None + _CACERT_PATH = None + + def where(): + # This is slightly terrible, but we want to delay extracting the file + # in cases where we're inside of a zipimport situation until someone + # actually calls where(), but we don't want to re-extract the file + # on every call of where(), so we'll do it once then store it in a + # global variable. + global _CACERT_CTX + global _CACERT_PATH + if _CACERT_PATH is None: + # This is slightly janky, the importlib.resources API wants you to + # manage the cleanup of this file, so it doesn't actually return a + # path, it returns a context manager that will give you the path + # when you enter it and will do any cleanup when you leave it. In + # the common case of not needing a temporary file, it will just + # return the file system location and the __exit__() is a no-op. + # + # We also have to hold onto the actual context manager, because + # it will do the cleanup whenever it gets garbage collected, so + # we will also store that at the global level as well. + _CACERT_CTX = get_path("certifi", "cacert.pem") + _CACERT_PATH = str(_CACERT_CTX.__enter__()) + + return _CACERT_PATH + + +except ImportError: + # This fallback will work for Python versions prior to 3.7 that lack the + # importlib.resources module but relies on the existing `where` function + # so won't address issues with environments like PyOxidizer that don't set + # __file__ on modules. + def read_text(_module, _path, encoding="ascii"): + with open(where(), "r", encoding=encoding) as data: + return data.read() + + # If we don't have importlib.resources, then we will just do the old logic + # of assuming we're on the filesystem and munge the path directly. + def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, "cacert.pem") + + +def contents(): + return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/LICENSE b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/LICENSE new file mode 100644 index 00000000..ad82355b --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 TAHRI Ahmed R. + +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. \ No newline at end of file diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/METADATA new file mode 100644 index 00000000..c062df69 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/METADATA @@ -0,0 +1,267 @@ +Metadata-Version: 2.1 +Name: charset-normalizer +Version: 2.0.7 +Summary: The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +Home-page: https://github.com/ousret/charset_normalizer +Author: Ahmed TAHRI @Ousret +Author-email: ahmed.tahri@cloudnursery.dev +License: MIT +Project-URL: Bug Reports, https://github.com/Ousret/charset_normalizer/issues +Project-URL: Documentation, https://charset-normalizer.readthedocs.io/en/latest +Keywords: encoding,i18n,txt,text,charset,charset-detector,normalization,unicode,chardet +Platform: UNKNOWN +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +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 :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Topic :: Text Processing :: Linguistic +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Typing :: Typed +Requires-Python: >=3.5.0 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode_backport +Requires-Dist: unicodedata2 ; extra == 'unicode_backport' + + + + +

+ The Real First Universal Charset Detector
+ + + + + + + + Download Count Total + +

+ +> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

+ >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

+ +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +| ------------- | :-------------: | :------------------: | :------------------: | +| `Fast` | âŒ
| ✅
| ✅
| +| `Universal**` | ⌠| ✅ | ⌠| +| `Reliable` **without** distinguishable standards | ⌠| ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `Free & Open` | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1 | MIT | MPL-1.1 +| `Native Python` | ✅ | ✅ | ⌠| +| `Detect spoken language` | ⌠| ✅ | N/A | +| `Supported Encoding` | 30 | :tada: [93](https://charset-normalizer.readthedocs.io/en/latest/support.html) | 40 + +

+Reading Normalized TextCat Reading Text + +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
+ +## ⭠Your support + +*Fork, test-it, star-it, submit your ideas! We do listen.* + +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 92 % | 220 ms | 5 file/sec | +| charset-normalizer | **98 %** | **40 ms** | 25 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 1115 ms | 300 ms | 27 ms | +| charset-normalizer | 460 ms | 240 ms | 18 ms | + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. + +[cchardet](https://github.com/PyYoshi/cChardet) is a non-native (cpp binding) faster alternative. If speed is the most important factor, +you should try it. + +## ✨ Installation + +Using PyPi for latest stable +```sh +pip install charset-normalizer -U +``` + +If you want a more up-to-date `unicodedata` than the one available in your Python setup. +```sh +pip install charset-normalizer[unicode_backport] -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Normalize any text file* +```python +from charset_normalizer import normalize +try: + normalize('./my_subtitle.srt') # should write to disk my_subtitle-***.srt +except IOError as e: + print('Sadly, we are unable to perform charset normalization.', str(e)) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🰠How + + - Discard all charset encoding table that could not fit the binary content. + - Measure chaos, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is chaos/mess and coherence according to **YOU ?** + +*Chaos :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess. + I know that my interpretation of what is chaotic is very subjective, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
+Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📠License + +Copyright © 2019 [Ahmed TAHRI @Ousret](https://github.com/Ousret).
+This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny VrandeÄić](http://simia.net/letters/) + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/RECORD new file mode 100644 index 00000000..79ebdd1d --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/RECORD @@ -0,0 +1,33 @@ +../../Scripts/normalizer.exe,sha256=k-UpiTJZzHwa1Z79fNb-Kgo4Jqllk68EReQ84INnJjM,106402 +charset_normalizer-2.0.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-2.0.7.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-2.0.7.dist-info/METADATA,sha256=IBf9rYJsfiUkX_1wIFO3ABSfIPbgA-k1gqrq_VfypyY,11350 +charset_normalizer-2.0.7.dist-info/RECORD,, +charset_normalizer-2.0.7.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +charset_normalizer-2.0.7.dist-info/entry_points.txt,sha256=5AJq_EPtGGUwJPgQLnBZfbVr-FYCIwT0xP7dIEZO3NI,77 +charset_normalizer-2.0.7.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=BVLv4gxL3YZ0xFHfrJacXqdV5YUm98fACgSaEtynXZc,1491 +charset_normalizer/__pycache__/__init__.cpython-39.pyc,, +charset_normalizer/__pycache__/api.cpython-39.pyc,, +charset_normalizer/__pycache__/cd.cpython-39.pyc,, +charset_normalizer/__pycache__/constant.cpython-39.pyc,, +charset_normalizer/__pycache__/legacy.cpython-39.pyc,, +charset_normalizer/__pycache__/md.cpython-39.pyc,, +charset_normalizer/__pycache__/models.cpython-39.pyc,, +charset_normalizer/__pycache__/utils.cpython-39.pyc,, +charset_normalizer/__pycache__/version.cpython-39.pyc,, +charset_normalizer/api.py,sha256=aTYqVTGki22DYJDVqiUyEheBjwo2BKBQNJwa_7SU3KY,17092 +charset_normalizer/assets/__init__.py,sha256=FPnfk8limZRb8ZIUQcTvPEcbuM1eqOdWGw0vbWGycDs,25485 +charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc,, +charset_normalizer/cd.py,sha256=xdMt8glWp1uX84nBJMynjBqr4g951q0jTQ1BX82TJNE,11003 +charset_normalizer/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/cli/__pycache__/__init__.cpython-39.pyc,, +charset_normalizer/cli/__pycache__/normalizer.cpython-39.pyc,, +charset_normalizer/cli/normalizer.py,sha256=H_2C2e81PqNCmUaXuwBJ5Lir_l0wwzELSxjPXcUL9O4,9453 +charset_normalizer/constant.py,sha256=W4u2KeC-RBJP4jxfTK_rOHUERMnejoY21VhIeFOgQKw,19387 +charset_normalizer/legacy.py,sha256=XKeZOts_HdYQU_Jb3C9ZfOjY2CiUL132k9_nXer8gig,3384 +charset_normalizer/md.py,sha256=iCAG4l121wZfZIgJhEDROnAaLcGsvlLNjXMitEBfOZY,17164 +charset_normalizer/models.py,sha256=wObDc9qaxz85xkqh6UozTpL0lLkQuvklO47e81lR89E,13332 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=6vfdA59u0VQD3_dDXf2B8viuUWPo9xIfKq4b0nXX6Mo,9026 +charset_normalizer/version.py,sha256=l3uyLlrnBh9G0hbagT5ZkEBPiFCyYfNhUn1Ea_qbRus,79 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/WHEEL new file mode 100644 index 00000000..5bad85fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/entry_points.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/entry_points.txt new file mode 100644 index 00000000..a67f60bc --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +normalizer = charset_normalizer.cli.normalizer:cli_detect + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/top_level.txt new file mode 100644 index 00000000..66958f0a --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer-2.0.7.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__init__.py new file mode 100644 index 00000000..ed525034 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,47 @@ +# -*- coding: utf_8 -*- +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('BÑеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'BÑеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" +from .api import from_bytes, from_fp, from_path, normalize +from .legacy import ( + CharsetDetector, + CharsetDoctor, + CharsetNormalizerMatch, + CharsetNormalizerMatches, + detect, +) +from .models import CharsetMatch, CharsetMatches +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "normalize", + "detect", + "CharsetMatch", + "CharsetMatches", + "CharsetNormalizerMatch", + "CharsetNormalizerMatches", + "CharsetDetector", + "CharsetDoctor", + "__version__", + "VERSION", +) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f7c16e28ab26c88465bb1067cf18ae0f670e926 GIT binary patch literal 1567 zcmcIk&2QsG6nD}zY2BvV z*D76uuZyj5ll1dQHo>Ap~ z_n*%_iYXjW!r^nKw1KY@Hls=-zqksYQA0x`mFEtCvxy=q2NM$mG3BX-TxOssiNMfr z4IC>efFzJ5Cy6{wAe_esnuIc9$<%ZAq+v5+XatkIQb*L>hohKjNJ)4?rWEjKRF2kQ zB>L8p&nSkp3Y}4V&yW+VCXmomAZe;331bAvISdD*LFJc(hAP0vLqY`Aa4Z#^#w?60 zS6}8PmWWR(di^SNGh-2&B32q|AgI$>no5OmJ=c9iGz%fqh_UAaK)>IgKX~!VAi2&m zFk!D%>R^%^s;@5Kdope`d~!>-z4hqwhvG%?TX7DTKNc6oFP4Ggy!gF1gW`|N?~5~( zT|n{D@)yO=mE_mT@(hLN#S0JiUnjnNUR=DlAqUDzUTHrndXX3W7C7}umca?fAE2A zxIrwiV~+-391PtaXCX~A?ZMvg=zay@$?);+=y12{F=1N@n;Ic%&;7fG)81*6uAPi| zCzP$~e4Li6)gdJ&E?2L6r?Xt%S_hM4@e?)~Yi8)qVlU}&INxTs=DZsOEMX=HyfiOY9wNAm)4t7+ws0G7-K)LZ+N^EX F{{_=>D{cS) literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a8aad81ba0f58d053752363c1beaf45f3ff9626 GIT binary patch literal 9895 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..589cb98ca6da29ebf1d1a1dc4bca7161148c2ca8 GIT binary patch literal 13185 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdf3c4dd81238859ca86d6fd634c91edbcc43ed6 GIT binary patch literal 7426 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 U{^U7~jGr0H8snqmnX%)41HW5+C;$Ke literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..122d1b4d0c484d00fea6e94966fdf3b0392e116c GIT binary patch literal 271 zcmYe~<>g`k0` CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocs of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {0}".format( + type(sequences) + ) + ) + + if not explain: + logger.setLevel(logging.CRITICAL) + else: + logger.setLevel(logging.INFO) + + length = len(sequences) # type: int + + if length == 0: + logger.warning( + "Given content is empty, stopping the process very early, returning empty utf_8 str match" + ) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.warning( + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.warning( + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.warning( + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence = len(sequences) < TOO_SMALL_SEQUENCE # type: bool + is_too_large_sequence = len(sequences) >= TOO_BIG_SEQUENCE # type: bool + + if is_too_small_sequence: + logger.warning( + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ) + ) + elif is_too_large_sequence: + logger.info( + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ) + ) + + prioritized_encodings = [] # type: List[str] + + specified_encoding = ( + any_specified_encoding(sequences) if preemptive_behaviour is True else None + ) # type: Optional[str] + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.info( + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested = set() # type: Set[str] + tested_but_hard_failure = [] # type: List[str] + tested_but_soft_failure = [] # type: List[str] + + fallback_ascii = None # type: Optional[CharsetMatch] + fallback_u8 = None # type: Optional[CharsetMatch] + fallback_specified = None # type: Optional[CharsetMatch] + + results = CharsetMatches() # type: CharsetMatches + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.info( + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload = None # type: Optional[str] + bom_or_sig_available = sig_encoding == encoding_iana # type: bool + strip_sig_or_bom = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) # type: bool + + if encoding_iana in {"utf_16", "utf_32"} and bom_or_sig_available is False: + logger.info( + "Encoding %s wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder = is_multi_byte_encoding(encoding_iana) # type: bool + except (ModuleNotFoundError, ImportError): + logger.debug( + "Encoding %s does not provide an IncrementalDecoder", encoding_iana + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)], + encoding=encoding_iana, + ) + else: + decoded_payload = str( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :], + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.warning( + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test = False # type: bool + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.warning( + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if bom_or_sig_available is False else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) # type: bool + + if multi_byte_bonus: + logger.info( + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up = int(len(r_) / 4) # type: int + + if max_chunk_gave_up < 2: + max_chunk_gave_up = 2 + + early_stop_count = 0 # type: int + + md_chunks = [] # type: List[str] + md_ratios = [] + + for i in r_: + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") # type: str + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0 and sequences[i] >= 0x80: + + chunk_partial_size_chk = ( + 16 if chunk_size > 16 else chunk_size + ) # type: int + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + md_chunks.append(chunk) + + md_ratios.append(mess_ratio(chunk, threshold)) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + + if md_ratios: + mean_mess_ratio = sum(md_ratios) / len(md_ratios) # type: float + else: + mean_mess_ratio = 0.0 + + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.warning( + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if encoding_iana in ["ascii", "utf_8", specified_encoding]: + fallback_entry = CharsetMatch( + sequences, encoding_iana, threshold, False, [], decoded_payload + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.info( + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages = encoding_languages(encoding_iana) # type: List[str] + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.info( + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ) + ) + + cd_ratios = [] + + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, 0.1, ",".join(target_languages) if target_languages else None + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.info( + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ) + ) + + results.append( + CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + decoded_payload, + ) + ) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + logger.info( + "%s is most likely the one. Stopping the process.", encoding_iana + ) + return CharsetMatches([results[encoding_iana]]) + + if encoding_iana == sig_encoding: + logger.info( + "%s is most likely the one as we detected a BOM or SIG within the beginning of the sequence.", + encoding_iana, + ) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.warning( + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback." + ) + + if fallback_specified: + logger.warning( + "%s will be used as a fallback match", fallback_specified.encoding + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.warning("utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.warning("ascii will be used as a fallback match") + results.append(fallback_ascii) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def from_path( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def normalize( + path: PathLike, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: List[str] = None, + cp_exclusion: List[str] = None, + preemptive_behaviour: bool = True, +) -> CharsetMatch: + """ + Take a (text-based) file path and try to create another file next to it, this time using UTF-8. + """ + results = from_path( + path, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + ) + + filename = basename(path) + target_extensions = list(splitext(filename)) + + if len(results) == 0: + raise IOError( + 'Unable to normalize "{}", no encoding charset seems to fit.'.format( + filename + ) + ) + + result = results.best() + + target_extensions[0] += "-" + result.encoding # type: ignore + + with open( + "{}".format(str(path).replace(filename, "".join(target_extensions))), "wb" + ) as fp: + fp.write(result.output()) # type: ignore + + return result # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__init__.py new file mode 100644 index 00000000..b2e56ff3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__init__.py @@ -0,0 +1,1244 @@ +# -*- coding: utf_8 -*- +from collections import OrderedDict + +FREQUENCIES = OrderedDict( + [ + ( + "English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + ), + ( + "German", + [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + ), + ( + "French", + [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + ), + ( + "Dutch", + [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + ), + ( + "Italian", + [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + ), + ( + "Polish", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "Å‚", + "g", + "b", + "h", + "Ä…", + "Ä™", + "ó", + ], + ), + ( + "Spanish", + [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + ), + ( + "Russian", + [ + "о", + "а", + "е", + "и", + "н", + "Ñ", + "Ñ‚", + "Ñ€", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "Ñ", + "Ñ‹", + "з", + "б", + "й", + "ÑŒ", + "ч", + "Ñ…", + "ж", + "ц", + ], + ), + ( + "Japanese", + [ + "ã®", + "ã«", + "ã‚‹", + "ãŸ", + "ã¯", + "ー", + "ã¨", + "ã—", + "ã‚’", + "ã§", + "ã¦", + "ãŒ", + "ã„", + "ン", + "ã‚Œ", + "ãª", + "å¹´", + "ス", + "ã£", + "ル", + "ã‹", + "ら", + "ã‚", + "ã•", + "ã‚‚", + "ã‚Š", + ], + ), + ( + "Portuguese", + [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + ), + ( + "Swedish", + [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "Ã¥", + "y", + "j", + "x", + ], + ), + ( + "Chinese", + [ + "çš„", + "一", + "是", + "ä¸", + "了", + "在", + "人", + "有", + "我", + "ä»–", + "è¿™", + "个", + "们", + "中", + "æ¥", + "上", + "大", + "为", + "å’Œ", + "国", + "地", + "到", + "以", + "说", + "æ—¶", + "è¦", + "å°±", + "出", + "会", + ], + ), + ( + "Ukrainian", + [ + "о", + "а", + "н", + "Ñ–", + "и", + "Ñ€", + "в", + "Ñ‚", + "е", + "Ñ", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "Ñ", + "ÑŒ", + "б", + "г", + "й", + "ч", + "Ñ…", + "ц", + "Ñ—", + ], + ), + ( + "Norwegian", + [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "Ã¥", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + ), + ( + "Finnish", + [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + ), + ( + "Vietnamese", + [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "Ä‘", + "s", + "e", + "v", + "p", + "b", + "y", + "Æ°", + "d", + "á", + "k", + "á»™", + "ế", + ], + ), + ( + "Czech", + [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "Ä›", + "é", + "Å™", + ], + ), + ( + "Hungarian", + [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + ), + ( + "Korean", + [ + "ì´", + "다", + "ì—", + "ì˜", + "는", + "ë¡œ", + "하", + "ì„", + "ê°€", + "ê³ ", + "지", + "ì„œ", + "í•œ", + "ì€", + "기", + "으", + "ë…„", + "대", + "사", + "ì‹œ", + "를", + "리", + "ë„", + "ì¸", + "스", + "ì¼", + ], + ), + ( + "Indonesian", + [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + ), + ( + "Turkish", + [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ÅŸ", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ÄŸ", + ], + ), + ( + "Romanian", + [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "È™", + "È›", + "z", + "h", + "â", + "j", + ], + ), + ( + "Farsi", + [ + "ا", + "ÛŒ", + "ر", + "د", + "Ù†", + "Ù‡", + "Ùˆ", + "Ù…", + "ت", + "ب", + "س", + "Ù„", + "Ú©", + "Ø´", + "ز", + "Ù", + "Ú¯", + "ع", + "Ø®", + "Ù‚", + "ج", + "Ø¢", + "Ù¾", + "Ø­", + "Ø·", + "ص", + ], + ), + ( + "Arabic", + [ + "ا", + "Ù„", + "ÙŠ", + "Ù…", + "Ùˆ", + "Ù†", + "ر", + "ت", + "ب", + "Ø©", + "ع", + "د", + "س", + "Ù", + "Ù‡", + "Ùƒ", + "Ù‚", + "Ø£", + "Ø­", + "ج", + "Ø´", + "Ø·", + "ص", + "Ù‰", + "Ø®", + "Ø¥", + ], + ), + ( + "Danish", + [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "Ã¥", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + ), + ( + "Serbian", + [ + "а", + "и", + "о", + "е", + "н", + "Ñ€", + "Ñ", + "у", + "Ñ‚", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + ), + ( + "Lithuanian", + [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "Ä—", + "b", + "y", + "ų", + "Å¡", + "ž", + "c", + "Ä…", + "į", + ], + ), + ( + "Slovene", + [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "Ä", + "c", + "Å¡", + "ž", + "f", + "y", + ], + ), + ( + "Slovak", + [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "Ä", + "é", + ], + ), + ( + "Hebrew", + [ + "×™", + "ו", + "×”", + "ל", + "ר", + "ב", + "ת", + "מ", + "×", + "ש", + "× ", + "×¢", + "×", + "ד", + "ק", + "×—", + "פ", + "ס", + "×›", + "×’", + "ט", + "צ", + "ן", + "×–", + "ך", + ], + ), + ( + "Bulgarian", + [ + "а", + "и", + "о", + "е", + "н", + "Ñ‚", + "Ñ€", + "Ñ", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "Ñ", + "ÑŠ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "Ñ…", + ], + ), + ( + "Croatian", + [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "Ä", + "h", + "Å¡", + "ž", + "ć", + "f", + ], + ), + ( + "Hindi", + [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "à¤", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + ), + ( + "Estonian", + [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + ), + ( + "Simple English", + [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + ), + ( + "Thai", + [ + "า", + "น", + "ร", + "อ", + "à¸", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "à¹", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + ), + ( + "Greek", + [ + "α", + "Ï„", + "ο", + "ι", + "ε", + "ν", + "Ï", + "σ", + "κ", + "η", + "Ï€", + "Ï‚", + "Ï…", + "μ", + "λ", + "ί", + "ÏŒ", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "Ï", + ], + ), + ( + "Tamil", + [ + "க", + "த", + "ப", + "ட", + "à®°", + "à®®", + "ல", + "ன", + "வ", + "à®±", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "à®…", + "ஆ", + "à®´", + "à®™", + "எ", + "உ", + "à®’", + "ஸ", + ], + ), + ( + "Classical Chinese", + [ + "之", + "å¹´", + "為", + "也", + "以", + "一", + "人", + "å…¶", + "者", + "國", + "有", + "二", + "å", + "æ–¼", + "æ›°", + "三", + "ä¸", + "大", + "而", + "å­", + "中", + "五", + "å››", + ], + ), + ( + "Kazakh", + [ + "а", + "Ñ‹", + "е", + "н", + "Ñ‚", + "Ñ€", + "л", + "Ñ–", + "д", + "Ñ", + "м", + "Ò›", + "к", + "о", + "б", + "и", + "у", + "Ò“", + "ж", + "Ò£", + "з", + "ш", + "й", + "п", + "г", + "Ó©", + ], + ), + ] +) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44d8f14e5d5fb10d25ef7bfc8b8ca37c1fed4438 GIT binary patch literal 7356 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 List[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise IOError("Function not supported on multi-byte code page") + + decoder = importlib.import_module("encodings.{}".format(iana_name)).IncrementalDecoder # type: ignore + + p = decoder(errors="ignore") # type: IncrementalDecoder + seen_ranges = {} # type: Dict[str, int] + character_count = 0 # type: int + + for i in range(0x40, 0xFF): + chunk = p.decode(bytes([i])) # type: str + + if chunk: + character_range = unicode_range(chunk) # type: Optional[str] + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> List[str]: + """ + Return inferred languages used with a unicode range. + """ + languages = [] # type: List[str] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> List[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges = encoding_unicode_range(iana_name) # type: List[str] + primary_range = None # type: Optional[str] + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> List[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese", "Classical Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +def alphabet_languages( + characters: List[str], ignore_non_latin: bool = False +) -> List[str]: + """ + Return associated languages associated to given characters. + """ + languages = [] # type: List[Tuple[str, float]] + + source_have_accents = False # type: bool + + for character in characters: + if is_accentuated(character): + source_have_accents = True + break + + for language, language_characters in FREQUENCIES.items(): + + target_have_accents = False # type: bool + target_pure_latin = True # type: bool + + for language_character in language_characters: + if target_have_accents is False and is_accentuated(language_character): + target_have_accents = True + if target_pure_latin is True and is_latin(language_character) is False: + target_pure_latin = False + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count = len(language_characters) # type: int + + character_match_count = len( + [c for c in language_characters if c in characters] + ) # type: int + + ratio = character_match_count / character_count # type: float + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: List[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError("{} not available".format(language)) + + character_approved_count = 0 # type: int + + for character in ordered_characters: + if character not in FREQUENCIES[language]: + continue + + characters_before_source = FREQUENCIES[language][ + 0 : FREQUENCIES[language].index(character) + ] # type: List[str] + characters_after_source = FREQUENCIES[language][ + FREQUENCIES[language].index(character) : + ] # type: List[str] + + characters_before = ordered_characters[ + 0 : ordered_characters.index(character) + ] # type: List[str] + characters_after = ordered_characters[ + ordered_characters.index(character) : + ] # type: List[str] + + before_match_count = [ + e in characters_before for e in characters_before_source + ].count( + True + ) # type: int + after_match_count = [ + e in characters_after for e in characters_after_source + ].count( + True + ) # type: int + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> List[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers = OrderedDict() # type: Dict[str, str] + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + layer_target_range = None # type: Optional[str] + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios = OrderedDict() # type: Dict[str, List[float]] + merge = [] # type: CoherenceMatches + + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + for language in per_language_ratios: + merge.append( + ( + language, + round( + sum(per_language_ratios[language]) + / len(per_language_ratios[language]), + 4, + ), + ) + ) + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results = [] # type: List[Tuple[str, float]] + lg_inclusion_list = [] # type: List[str] + ignore_non_latin = False # type: bool + + sufficient_match_count = 0 # type: int + + if lg_inclusion is not None: + lg_inclusion_list = lg_inclusion.split(",") + + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies = Counter(layer) # type: Counter + most_common = sequence_frequencies.most_common() + + character_count = sum([o for c, o in most_common]) # type: int + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered = [c for c, o in most_common] # type: List[str] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio = characters_popularity_compare( + language, popular_character_ordered + ) # type: float + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted(results, key=lambda x: x[1], reverse=True) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d61c35228fa97f80409026ffd3e7f9e9337e5c0 GIT binary patch literal 191 zcmYe~<>g`k0`Gw;(Y& zJ25@AI3_tGv8Xt;Bt9>{C^s=DvnsVnKRG8;KR!M)FS8^*Uaz3?7Kcr4eoARhsvXGo I&p^xo0FzNOk^lez literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a275d61b956d21e71292175314cbf3e09fbc7f7 GIT binary patch literal 6139 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/normalizer.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/normalizer.py new file mode 100644 index 00000000..f1911259 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/cli/normalizer.py @@ -0,0 +1,291 @@ +import argparse +import sys +from json import dumps +from os.path import abspath +from platform import python_version +from typing import List + +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") + + +def cli_detect(argv: List[str] = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.1, + type=float, + dest="threshold", + help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {}".format( + __version__, python_version() + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + + matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "", + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + o_ = my_file.name.split(".") # type: List[str] + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + else: + if ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = abspath("./{}".format(".".join(o_))) + + with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: + fp.write(str(best_guess)) + except IOError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding if el.encoding else "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/constant.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/constant.py new file mode 100644 index 00000000..2e5974d9 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/constant.py @@ -0,0 +1,496 @@ +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from collections import OrderedDict +from encodings.aliases import aliases +from re import IGNORECASE, compile as re_compile +from typing import Dict, List, Set, Union + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS = OrderedDict( + [ + ("utf_8", BOM_UTF8), + ( + "utf_7", + [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + ), + ("gb18030", b"\x84\x31\x95\x33"), + ("utf_32", [BOM_UTF32_BE, BOM_UTF32_LE]), + ("utf_16", [BOM_UTF16_BE, BOM_UTF16_LE]), + ] +) # type: Dict[str, Union[bytes, List[bytes]]] + +TOO_SMALL_SEQUENCE = 32 # type: int +TOO_BIG_SEQUENCE = int(10e6) # type: int + +UTF8_MAXIMAL_ALLOCATION = 1112064 # type: int + +UNICODE_RANGES_COMBINED = { + "Control character": range(0, 31 + 1), + "Basic Latin": range(32, 127 + 1), + "Latin-1 Supplement": range(128, 255 + 1), + "Latin Extended-A": range(256, 383 + 1), + "Latin Extended-B": range(384, 591 + 1), + "IPA Extensions": range(592, 687 + 1), + "Spacing Modifier Letters": range(688, 767 + 1), + "Combining Diacritical Marks": range(768, 879 + 1), + "Greek and Coptic": range(880, 1023 + 1), + "Cyrillic": range(1024, 1279 + 1), + "Cyrillic Supplement": range(1280, 1327 + 1), + "Armenian": range(1328, 1423 + 1), + "Hebrew": range(1424, 1535 + 1), + "Arabic": range(1536, 1791 + 1), + "Syriac": range(1792, 1871 + 1), + "Arabic Supplement": range(1872, 1919 + 1), + "Thaana": range(1920, 1983 + 1), + "NKo": range(1984, 2047 + 1), + "Samaritan": range(2048, 2111 + 1), + "Mandaic": range(2112, 2143 + 1), + "Syriac Supplement": range(2144, 2159 + 1), + "Arabic Extended-A": range(2208, 2303 + 1), + "Devanagari": range(2304, 2431 + 1), + "Bengali": range(2432, 2559 + 1), + "Gurmukhi": range(2560, 2687 + 1), + "Gujarati": range(2688, 2815 + 1), + "Oriya": range(2816, 2943 + 1), + "Tamil": range(2944, 3071 + 1), + "Telugu": range(3072, 3199 + 1), + "Kannada": range(3200, 3327 + 1), + "Malayalam": range(3328, 3455 + 1), + "Sinhala": range(3456, 3583 + 1), + "Thai": range(3584, 3711 + 1), + "Lao": range(3712, 3839 + 1), + "Tibetan": range(3840, 4095 + 1), + "Myanmar": range(4096, 4255 + 1), + "Georgian": range(4256, 4351 + 1), + "Hangul Jamo": range(4352, 4607 + 1), + "Ethiopic": range(4608, 4991 + 1), + "Ethiopic Supplement": range(4992, 5023 + 1), + "Cherokee": range(5024, 5119 + 1), + "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1), + "Ogham": range(5760, 5791 + 1), + "Runic": range(5792, 5887 + 1), + "Tagalog": range(5888, 5919 + 1), + "Hanunoo": range(5920, 5951 + 1), + "Buhid": range(5952, 5983 + 1), + "Tagbanwa": range(5984, 6015 + 1), + "Khmer": range(6016, 6143 + 1), + "Mongolian": range(6144, 6319 + 1), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1), + "Limbu": range(6400, 6479 + 1), + "Tai Le": range(6480, 6527 + 1), + "New Tai Lue": range(6528, 6623 + 1), + "Khmer Symbols": range(6624, 6655 + 1), + "Buginese": range(6656, 6687 + 1), + "Tai Tham": range(6688, 6831 + 1), + "Combining Diacritical Marks Extended": range(6832, 6911 + 1), + "Balinese": range(6912, 7039 + 1), + "Sundanese": range(7040, 7103 + 1), + "Batak": range(7104, 7167 + 1), + "Lepcha": range(7168, 7247 + 1), + "Ol Chiki": range(7248, 7295 + 1), + "Cyrillic Extended C": range(7296, 7311 + 1), + "Sundanese Supplement": range(7360, 7375 + 1), + "Vedic Extensions": range(7376, 7423 + 1), + "Phonetic Extensions": range(7424, 7551 + 1), + "Phonetic Extensions Supplement": range(7552, 7615 + 1), + "Combining Diacritical Marks Supplement": range(7616, 7679 + 1), + "Latin Extended Additional": range(7680, 7935 + 1), + "Greek Extended": range(7936, 8191 + 1), + "General Punctuation": range(8192, 8303 + 1), + "Superscripts and Subscripts": range(8304, 8351 + 1), + "Currency Symbols": range(8352, 8399 + 1), + "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1), + "Letterlike Symbols": range(8448, 8527 + 1), + "Number Forms": range(8528, 8591 + 1), + "Arrows": range(8592, 8703 + 1), + "Mathematical Operators": range(8704, 8959 + 1), + "Miscellaneous Technical": range(8960, 9215 + 1), + "Control Pictures": range(9216, 9279 + 1), + "Optical Character Recognition": range(9280, 9311 + 1), + "Enclosed Alphanumerics": range(9312, 9471 + 1), + "Box Drawing": range(9472, 9599 + 1), + "Block Elements": range(9600, 9631 + 1), + "Geometric Shapes": range(9632, 9727 + 1), + "Miscellaneous Symbols": range(9728, 9983 + 1), + "Dingbats": range(9984, 10175 + 1), + "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1), + "Supplemental Arrows-A": range(10224, 10239 + 1), + "Braille Patterns": range(10240, 10495 + 1), + "Supplemental Arrows-B": range(10496, 10623 + 1), + "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1), + "Supplemental Mathematical Operators": range(10752, 11007 + 1), + "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1), + "Glagolitic": range(11264, 11359 + 1), + "Latin Extended-C": range(11360, 11391 + 1), + "Coptic": range(11392, 11519 + 1), + "Georgian Supplement": range(11520, 11567 + 1), + "Tifinagh": range(11568, 11647 + 1), + "Ethiopic Extended": range(11648, 11743 + 1), + "Cyrillic Extended-A": range(11744, 11775 + 1), + "Supplemental Punctuation": range(11776, 11903 + 1), + "CJK Radicals Supplement": range(11904, 12031 + 1), + "Kangxi Radicals": range(12032, 12255 + 1), + "Ideographic Description Characters": range(12272, 12287 + 1), + "CJK Symbols and Punctuation": range(12288, 12351 + 1), + "Hiragana": range(12352, 12447 + 1), + "Katakana": range(12448, 12543 + 1), + "Bopomofo": range(12544, 12591 + 1), + "Hangul Compatibility Jamo": range(12592, 12687 + 1), + "Kanbun": range(12688, 12703 + 1), + "Bopomofo Extended": range(12704, 12735 + 1), + "CJK Strokes": range(12736, 12783 + 1), + "Katakana Phonetic Extensions": range(12784, 12799 + 1), + "Enclosed CJK Letters and Months": range(12800, 13055 + 1), + "CJK Compatibility": range(13056, 13311 + 1), + "CJK Unified Ideographs Extension A": range(13312, 19903 + 1), + "Yijing Hexagram Symbols": range(19904, 19967 + 1), + "CJK Unified Ideographs": range(19968, 40959 + 1), + "Yi Syllables": range(40960, 42127 + 1), + "Yi Radicals": range(42128, 42191 + 1), + "Lisu": range(42192, 42239 + 1), + "Vai": range(42240, 42559 + 1), + "Cyrillic Extended-B": range(42560, 42655 + 1), + "Bamum": range(42656, 42751 + 1), + "Modifier Tone Letters": range(42752, 42783 + 1), + "Latin Extended-D": range(42784, 43007 + 1), + "Syloti Nagri": range(43008, 43055 + 1), + "Common Indic Number Forms": range(43056, 43071 + 1), + "Phags-pa": range(43072, 43135 + 1), + "Saurashtra": range(43136, 43231 + 1), + "Devanagari Extended": range(43232, 43263 + 1), + "Kayah Li": range(43264, 43311 + 1), + "Rejang": range(43312, 43359 + 1), + "Hangul Jamo Extended-A": range(43360, 43391 + 1), + "Javanese": range(43392, 43487 + 1), + "Myanmar Extended-B": range(43488, 43519 + 1), + "Cham": range(43520, 43615 + 1), + "Myanmar Extended-A": range(43616, 43647 + 1), + "Tai Viet": range(43648, 43743 + 1), + "Meetei Mayek Extensions": range(43744, 43775 + 1), + "Ethiopic Extended-A": range(43776, 43823 + 1), + "Latin Extended-E": range(43824, 43887 + 1), + "Cherokee Supplement": range(43888, 43967 + 1), + "Meetei Mayek": range(43968, 44031 + 1), + "Hangul Syllables": range(44032, 55215 + 1), + "Hangul Jamo Extended-B": range(55216, 55295 + 1), + "High Surrogates": range(55296, 56191 + 1), + "High Private Use Surrogates": range(56192, 56319 + 1), + "Low Surrogates": range(56320, 57343 + 1), + "Private Use Area": range(57344, 63743 + 1), + "CJK Compatibility Ideographs": range(63744, 64255 + 1), + "Alphabetic Presentation Forms": range(64256, 64335 + 1), + "Arabic Presentation Forms-A": range(64336, 65023 + 1), + "Variation Selectors": range(65024, 65039 + 1), + "Vertical Forms": range(65040, 65055 + 1), + "Combining Half Marks": range(65056, 65071 + 1), + "CJK Compatibility Forms": range(65072, 65103 + 1), + "Small Form Variants": range(65104, 65135 + 1), + "Arabic Presentation Forms-B": range(65136, 65279 + 1), + "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1), + "Specials": range(65520, 65535 + 1), + "Linear B Syllabary": range(65536, 65663 + 1), + "Linear B Ideograms": range(65664, 65791 + 1), + "Aegean Numbers": range(65792, 65855 + 1), + "Ancient Greek Numbers": range(65856, 65935 + 1), + "Ancient Symbols": range(65936, 65999 + 1), + "Phaistos Disc": range(66000, 66047 + 1), + "Lycian": range(66176, 66207 + 1), + "Carian": range(66208, 66271 + 1), + "Coptic Epact Numbers": range(66272, 66303 + 1), + "Old Italic": range(66304, 66351 + 1), + "Gothic": range(66352, 66383 + 1), + "Old Permic": range(66384, 66431 + 1), + "Ugaritic": range(66432, 66463 + 1), + "Old Persian": range(66464, 66527 + 1), + "Deseret": range(66560, 66639 + 1), + "Shavian": range(66640, 66687 + 1), + "Osmanya": range(66688, 66735 + 1), + "Osage": range(66736, 66815 + 1), + "Elbasan": range(66816, 66863 + 1), + "Caucasian Albanian": range(66864, 66927 + 1), + "Linear A": range(67072, 67455 + 1), + "Cypriot Syllabary": range(67584, 67647 + 1), + "Imperial Aramaic": range(67648, 67679 + 1), + "Palmyrene": range(67680, 67711 + 1), + "Nabataean": range(67712, 67759 + 1), + "Hatran": range(67808, 67839 + 1), + "Phoenician": range(67840, 67871 + 1), + "Lydian": range(67872, 67903 + 1), + "Meroitic Hieroglyphs": range(67968, 67999 + 1), + "Meroitic Cursive": range(68000, 68095 + 1), + "Kharoshthi": range(68096, 68191 + 1), + "Old South Arabian": range(68192, 68223 + 1), + "Old North Arabian": range(68224, 68255 + 1), + "Manichaean": range(68288, 68351 + 1), + "Avestan": range(68352, 68415 + 1), + "Inscriptional Parthian": range(68416, 68447 + 1), + "Inscriptional Pahlavi": range(68448, 68479 + 1), + "Psalter Pahlavi": range(68480, 68527 + 1), + "Old Turkic": range(68608, 68687 + 1), + "Old Hungarian": range(68736, 68863 + 1), + "Rumi Numeral Symbols": range(69216, 69247 + 1), + "Brahmi": range(69632, 69759 + 1), + "Kaithi": range(69760, 69839 + 1), + "Sora Sompeng": range(69840, 69887 + 1), + "Chakma": range(69888, 69967 + 1), + "Mahajani": range(69968, 70015 + 1), + "Sharada": range(70016, 70111 + 1), + "Sinhala Archaic Numbers": range(70112, 70143 + 1), + "Khojki": range(70144, 70223 + 1), + "Multani": range(70272, 70319 + 1), + "Khudawadi": range(70320, 70399 + 1), + "Grantha": range(70400, 70527 + 1), + "Newa": range(70656, 70783 + 1), + "Tirhuta": range(70784, 70879 + 1), + "Siddham": range(71040, 71167 + 1), + "Modi": range(71168, 71263 + 1), + "Mongolian Supplement": range(71264, 71295 + 1), + "Takri": range(71296, 71375 + 1), + "Ahom": range(71424, 71487 + 1), + "Warang Citi": range(71840, 71935 + 1), + "Zanabazar Square": range(72192, 72271 + 1), + "Soyombo": range(72272, 72367 + 1), + "Pau Cin Hau": range(72384, 72447 + 1), + "Bhaiksuki": range(72704, 72815 + 1), + "Marchen": range(72816, 72895 + 1), + "Masaram Gondi": range(72960, 73055 + 1), + "Cuneiform": range(73728, 74751 + 1), + "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1), + "Early Dynastic Cuneiform": range(74880, 75087 + 1), + "Egyptian Hieroglyphs": range(77824, 78895 + 1), + "Anatolian Hieroglyphs": range(82944, 83583 + 1), + "Bamum Supplement": range(92160, 92735 + 1), + "Mro": range(92736, 92783 + 1), + "Bassa Vah": range(92880, 92927 + 1), + "Pahawh Hmong": range(92928, 93071 + 1), + "Miao": range(93952, 94111 + 1), + "Ideographic Symbols and Punctuation": range(94176, 94207 + 1), + "Tangut": range(94208, 100351 + 1), + "Tangut Components": range(100352, 101119 + 1), + "Kana Supplement": range(110592, 110847 + 1), + "Kana Extended-A": range(110848, 110895 + 1), + "Nushu": range(110960, 111359 + 1), + "Duployan": range(113664, 113823 + 1), + "Shorthand Format Controls": range(113824, 113839 + 1), + "Byzantine Musical Symbols": range(118784, 119039 + 1), + "Musical Symbols": range(119040, 119295 + 1), + "Ancient Greek Musical Notation": range(119296, 119375 + 1), + "Tai Xuan Jing Symbols": range(119552, 119647 + 1), + "Counting Rod Numerals": range(119648, 119679 + 1), + "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1), + "Sutton SignWriting": range(120832, 121519 + 1), + "Glagolitic Supplement": range(122880, 122927 + 1), + "Mende Kikakui": range(124928, 125151 + 1), + "Adlam": range(125184, 125279 + 1), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1), + "Mahjong Tiles": range(126976, 127023 + 1), + "Domino Tiles": range(127024, 127135 + 1), + "Playing Cards": range(127136, 127231 + 1), + "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1), + "Enclosed Ideographic Supplement": range(127488, 127743 + 1), + "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1), + "Emoticons range(Emoji)": range(128512, 128591 + 1), + "Ornamental Dingbats": range(128592, 128639 + 1), + "Transport and Map Symbols": range(128640, 128767 + 1), + "Alchemical Symbols": range(128768, 128895 + 1), + "Geometric Shapes Extended": range(128896, 129023 + 1), + "Supplemental Arrows-C": range(129024, 129279 + 1), + "Supplemental Symbols and Pictographs": range(129280, 129535 + 1), + "CJK Unified Ideographs Extension B": range(131072, 173791 + 1), + "CJK Unified Ideographs Extension C": range(173824, 177983 + 1), + "CJK Unified Ideographs Extension D": range(177984, 178207 + 1), + "CJK Unified Ideographs Extension E": range(178208, 183983 + 1), + "CJK Unified Ideographs Extension F": range(183984, 191471 + 1), + "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1), + "Tags": range(917504, 917631 + 1), + "Variation Selectors Supplement": range(917760, 917999 + 1), +} # type: Dict[str, range] + +UNICODE_SECONDARY_RANGE_KEYWORD = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] # type: List[str] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_SUPPORTED = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())), + ) +) # type: List[str] + +IANA_SUPPORTED_COUNT = len(IANA_SUPPORTED) # type: int + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["cp1258", "iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["cp1258", "iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp1258": ["cp1252", "cp1254", "iso8859_9", "latin_1"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} # type: Dict[str, List[str]] + + +CHARDET_CORRESPONDENCE = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} # type: Dict[str, str] + + +COMMON_SAFE_ASCII_CHARACTERS = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", +} # type: Set[str] + + +KO_NAMES = {"johab", "cp949", "euc_kr"} # type: Set[str] +ZH_NAMES = {"big5", "cp950", "big5hkscs", "hz"} # type: Set[str] + +NOT_PRINTABLE_PATTERN = re_compile(r"[0-9\W\n\r\t]+") diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/legacy.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/legacy.py new file mode 100644 index 00000000..cdebe2b8 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,95 @@ +import warnings +from typing import Dict, Optional, Union + +from .api import from_bytes, from_fp, from_path, normalize +from .constant import CHARDET_CORRESPONDENCE +from .models import CharsetMatch, CharsetMatches + + +def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + """ + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + "Expected object of type bytes or bytearray, got: " + "{0}".format(type(byte_str)) + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + return { + "encoding": encoding + if encoding not in CHARDET_CORRESPONDENCE + else CHARDET_CORRESPONDENCE[encoding], + "language": language, + "confidence": confidence, + } + + +class CharsetNormalizerMatch(CharsetMatch): + pass + + +class CharsetNormalizerMatches(CharsetMatches): + @staticmethod + def from_fp(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_fp(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_bytes(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_bytes(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_path(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_path(*args, **kwargs) # pragma: nocover + + @staticmethod + def normalize(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return normalize(*args, **kwargs) # pragma: nocover + + +class CharsetDetector(CharsetNormalizerMatches): + pass + + +class CharsetDoctor(CharsetNormalizerMatches): + pass diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/md.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/md.py new file mode 100644 index 00000000..2146d61d --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/md.py @@ -0,0 +1,540 @@ +from functools import lru_cache +from typing import List, Optional + +from .constant import COMMON_SAFE_ASCII_CHARACTERS, UNICODE_SECONDARY_RANGE_KEYWORD +from .utils import ( + is_accentuated, + is_ascii, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + remove_accent, + unicode_range, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError # pragma: nocover + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count = 0 # type: int + self._symbol_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_printable_char = None # type: Optional[str] + self._frenzy_symbol_in_word = False # type: bool + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation = ( + self._punctuation_count + self._symbol_count + ) / self._character_count # type: float + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count = 0 # type: int + self._accentuated_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + ratio_of_accentuation = ( + self._accentuated_count / self._character_count + ) # type: float + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count = 0 # type: int + self._character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1A" # Why? Its the ASCII substitute character. + ): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count = 0 # type: int + self._character_count = 0 # type: int + + self._last_latin_character = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if self._last_latin_character is not None: + if is_accentuated(character) and is_accentuated(self._last_latin_character): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent( + self._last_latin_character + ): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count = 0 # type: int + self._character_count = 0 # type: int + self._last_printable_seen = None # type: Optional[str] + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a = unicode_range( + self._last_printable_seen + ) # type: Optional[str] + unicode_range_b = unicode_range(character) # type: Optional[str] + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_suspicious_range_usage = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count # type: float + + if ratio_of_suspicious_range_usage < 0.1: + return 0.0 + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count = 0 # type: int + self._bad_word_count = 0 # type: int + self._is_current_word_bad = False # type: bool + self._foreign_long_watch = False # type: bool + + self._character_count = 0 # type: int + self._bad_character_count = 0 # type: int + + self._buffer = "" # type: str + self._buffer_accent_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer = "".join([self._buffer, character]) + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and is_latin(character) is False + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length = len(self._buffer) # type: int + + self._character_count += buffer_length + + if buffer_length >= 4 and self._buffer_accent_count / buffer_length > 0.34: + self._is_current_word_bad = True + if buffer_length >= 24 and self._foreign_long_watch: + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + elif ( + character not in {"<", ">", "-", "="} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkInvalidStopPlugin(MessDetectorPlugin): + """ + GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and + can be easily detected. Searching for the overuse of '丅' and '丄'. + """ + + def __init__(self) -> None: + self._wrong_stop_count = 0 # type: int + self._cjk_character_count = 0 # type: int + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character in ["丅", "丄"]: + self._wrong_stop_count += 1 + return + if is_cjk(character): + self._cjk_character_count += 1 + + def reset(self) -> None: + self._wrong_stop_count = 0 + self._cjk_character_count = 0 + + @property + def ratio(self) -> float: + if self._cjk_character_count < 16: + return 0.0 + return self._wrong_stop_count / self._cjk_character_count + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf = False # type: bool + + self._character_count_since_last_sep = 0 # type: int + + self._successive_upper_lower_count = 0 # type: int + self._successive_upper_lower_count_final = 0 # type: int + + self._character_count = 0 # type: int + + self._last_alpha_seen = None # type: Optional[str] + self._current_ascii_only = True # type: bool + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and is_ascii(character) is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +def is_suspiciously_successive_range( + unicode_range_a: Optional[str], unicode_range_b: Optional[str] +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + keywords_range_a, keywords_range_b = unicode_range_a.split( + " " + ), unicode_range_b.split(" ") + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if range_a_jp_chars or range_b_jp_chars: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] # type: List[MessDetectorPlugin] + + length = len(decoded_sequence) # type: int + + mean_mess_ratio = 0.0 # type: float + + if length < 512: + intermediary_mean_mess_ratio_calc = 32 # type: int + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence, range(0, length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum([dt.ratio for dt in detectors]) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + for dt in detectors: # pragma: nocover + print(dt.__class__, dt.ratio) + + return round(mean_mess_ratio, 3) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/models.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/models.py new file mode 100644 index 00000000..68c27b89 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/models.py @@ -0,0 +1,393 @@ +import warnings +from collections import Counter +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union + +from .constant import NOT_PRINTABLE_PATTERN, TOO_BIG_SEQUENCE +from .md import mess_ratio +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: "CoherenceMatches", + decoded_payload: Optional[str] = None, + ): + self._payload = payload # type: bytes + + self._encoding = guessed_encoding # type: str + self._mean_mess_ratio = mean_mess_ratio # type: float + self._languages = languages # type: CoherenceMatches + self._has_sig_or_bom = has_sig_or_bom # type: bool + self._unicode_ranges = None # type: Optional[List[str]] + + self._leaves = [] # type: List[CharsetMatch] + self._mean_coherence_ratio = 0.0 # type: float + + self._output_payload = None # type: Optional[bytes] + self._output_encoding = None # type: Optional[str] + + self._string = decoded_payload # type: Optional[str] + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + raise TypeError( + "__eq__ cannot be invoked on {} and {}.".format( + str(other.__class__), str(self.__class__) + ) + ) + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference = abs(self.chaos - other.chaos) # type: float + coherence_difference = abs(self.coherence - other.coherence) # type: float + + # Bellow 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + # When having a tough decision, use the result that decoded as many multi-byte as possible. + if chaos_difference == 0.0 and self.coherence == other.coherence: + return self.multi_byte_usage > other.multi_byte_usage + return self.coherence > other.coherence + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - len(str(self)) / len(self.raw) + + @property + def chaos_secondary_pass(self) -> float: + """ + Check once again chaos in decoded text, except this time, with full content. + Use with caution, this can be very slow. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "chaos_secondary_pass is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return mess_ratio(str(self), 1.0) + + @property + def coherence_non_latin(self) -> float: + """ + Coherence ratio on the first non-latin language detected if ANY. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "coherence_non_latin is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return 0.0 + + @property + def w_counter(self) -> Counter: + """ + Word counter instance on decoded text. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "w_counter is deprecated and will be removed in 3.0", DeprecationWarning + ) + + string_printable_only = sub(NOT_PRINTABLE_PATTERN, " ", str(self).lower()) + + return Counter(string_printable_only.split()) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return "".format(self.encoding, self.fingerprint) + + def add_submatch(self, other: "CharsetMatch") -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> List[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as = [] # type: List[str] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> List[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> List["CharsetMatch"]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> List[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges = [ + unicode_range(char) for char in str(self) + ] # type: List[Optional[str]] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> List[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def first(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def best(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + self._output_payload = str(self).encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: List[CharsetMatch] = None): + self._results = sorted(results) if results else [] # type: List[CharsetMatch] + + def __iter__(self) -> Iterator[CharsetMatch]: + for result in self._results: + yield result + + def __getitem__(self, item: Union[int, str]) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) <= TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> Optional["CharsetMatch"]: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> Optional["CharsetMatch"]: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: Optional[str], + encoding_aliases: List[str], + alternative_encodings: List[str], + language: str, + alphabets: List[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: Optional[str], + is_preferred: bool, + ): + self.path = path # type: str + self.unicode_path = unicode_path # type: Optional[str] + self.encoding = encoding # type: Optional[str] + self.encoding_aliases = encoding_aliases # type: List[str] + self.alternative_encodings = alternative_encodings # type: List[str] + self.language = language # type: str + self.alphabets = alphabets # type: List[str] + self.has_sig_or_bom = has_sig_or_bom # type: bool + self.chaos = chaos # type: float + self.coherence = coherence # type: float + self.is_preferred = is_preferred # type: bool + + @property + def __dict__(self) -> Dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/py.typed b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/utils.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/utils.py new file mode 100644 index 00000000..b9d12784 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/utils.py @@ -0,0 +1,333 @@ +try: + import unicodedata2 as unicodedata +except ImportError: + import unicodedata # type: ignore[no-redef] + +import importlib +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import List, Optional, Set, Tuple, Union + +from _multibytecodec import MultibyteIncrementalDecoder # type: ignore + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed = unicodedata.decomposition(character) # type: str + if not decomposed: + return character + + codes = decomposed.split(" ") # type: List[str] + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> Optional[str]: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord = ord(character) # type: int + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description = unicodedata.name(character) # type: str + except ValueError: + return False + return "LATIN" in description + + +def is_ascii(character: str) -> bool: + try: + character.encode("ascii") + except UnicodeEncodeError: + return False + return True + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "P" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + if "S" in character_category or "N" in character_category: + return True + + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Forms" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + return False + + return "Emoticons" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in ["|", "+", ",", ";", "<", ">"]: + return True + + character_category = unicodedata.category(character) # type: str + + return "Z" in character_category + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +def is_private_use_only(character: str) -> bool: + character_category = unicodedata.category(character) # type: str + + return "Co" == character_category + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + for keyword in UNICODE_SECONDARY_RANGE_KEYWORD: + if keyword in range_name: + return True + + return False + + +def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len = len(sequence) # type: int + + results = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: seq_len if seq_len <= search_zone else search_zone].decode( + "ascii", errors="ignore" + ), + ) # type: List[str] + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, # type: ignore + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks = ENCODING_MARKS[iana_encoding] # type: Union[bytes, List[bytes]] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + cp_name = cp_name.lower().replace("-", "_") + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name == encoding_alias or cp_name == encoding_iana: + return encoding_iana + + if strict: + raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) + + return cp_name + + +def range_scan(decoded_sequence: str) -> List[str]: + ranges = set() # type: Set[str] + + for character in decoded_sequence: + character_range = unicode_range(character) # type: Optional[str] + + if character_range is None: + continue + + ranges.add(character_range) + + return list(ranges) + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module("encodings.{}".format(iana_name_a)).IncrementalDecoder # type: ignore + decoder_b = importlib.import_module("encodings.{}".format(iana_name_b)).IncrementalDecoder # type: ignore + + id_a = decoder_a(errors="ignore") # type: IncrementalDecoder + id_b = decoder_b(errors="ignore") # type: IncrementalDecoder + + character_match_count = 0 # type: int + + for i in range(0, 255): + to_be_decoded = bytes([i]) # type: bytes + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/version.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/version.py new file mode 100644 index 00000000..98e53fb3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/charset_normalizer/version.py @@ -0,0 +1,6 @@ +""" +Expose version +""" + +__version__ = "2.0.7" +VERSION = __version__.split(".") diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/LICENSE.rst b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/LICENSE.rst new file mode 100644 index 00000000..d12a8491 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/LICENSE.rst @@ -0,0 +1,28 @@ +Copyright 2014 Pallets + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/METADATA new file mode 100644 index 00000000..2c8da01a --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/METADATA @@ -0,0 +1,111 @@ +Metadata-Version: 2.1 +Name: click +Version: 8.0.3 +Summary: Composable command line interface toolkit +Home-page: https://palletsprojects.com/p/click/ +Author: Armin Ronacher +Author-email: armin.ronacher@active-4.com +Maintainer: Pallets +Maintainer-email: contact@palletsprojects.com +License: BSD-3-Clause +Project-URL: Donate, https://palletsprojects.com/donate +Project-URL: Documentation, https://click.palletsprojects.com/ +Project-URL: Changes, https://click.palletsprojects.com/changes/ +Project-URL: Source Code, https://github.com/pallets/click/ +Project-URL: Issue Tracker, https://github.com/pallets/click/issues/ +Project-URL: Twitter, https://twitter.com/PalletsTeam +Project-URL: Chat, https://discord.gg/pallets +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.rst +Requires-Dist: colorama ; platform_system == "Windows" +Requires-Dist: importlib-metadata ; python_version < "3.8" + +\$ click\_ +========== + +Click is a Python package for creating beautiful command line interfaces +in a composable way with as little code as necessary. It's the "Command +Line Interface Creation Kit". It's highly configurable but comes with +sensible defaults out of the box. + +It aims to make the process of writing command line tools quick and fun +while also preventing any frustration caused by the inability to +implement an intended CLI API. + +Click in three points: + +- Arbitrary nesting of commands +- Automatic help page generation +- Supports lazy loading of subcommands at runtime + + +Installing +---------- + +Install and update using `pip`_: + +.. code-block:: text + + $ pip install -U click + +.. _pip: https://pip.pypa.io/en/stable/getting-started/ + + +A Simple Example +---------------- + +.. code-block:: python + + import click + + @click.command() + @click.option("--count", default=1, help="Number of greetings.") + @click.option("--name", prompt="Your name", help="The person to greet.") + def hello(count, name): + """Simple program that greets NAME for a total of COUNT times.""" + for _ in range(count): + click.echo(f"Hello, {name}!") + + if __name__ == '__main__': + hello() + +.. code-block:: text + + $ python hello.py --count=3 + Your name: Click + Hello, Click! + Hello, Click! + Hello, Click! + + +Donate +------ + +The Pallets organization develops and supports Click and other popular +packages. In order to grow the community of contributors and users, and +allow the maintainers to devote more time to the projects, `please +donate today`_. + +.. _please donate today: https://palletsprojects.com/donate + + +Links +----- + +- Documentation: https://click.palletsprojects.com/ +- Changes: https://click.palletsprojects.com/changes/ +- PyPI Releases: https://pypi.org/project/click/ +- Source Code: https://github.com/pallets/click +- Issue Tracker: https://github.com/pallets/click/issues +- Website: https://palletsprojects.com/p/click +- Twitter: https://twitter.com/PalletsTeam +- Chat: https://discord.gg/pallets + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/RECORD new file mode 100644 index 00000000..3471ffe8 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/RECORD @@ -0,0 +1,41 @@ +click-8.0.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +click-8.0.3.dist-info/LICENSE.rst,sha256=morRBqOU6FO_4h9C9OctWSgZoigF2ZG18ydQKSkrZY0,1475 +click-8.0.3.dist-info/METADATA,sha256=_0jCOf3DdGPvKUZUlBukeb1t6Pnxmm_OMGpaBoDthfc,3247 +click-8.0.3.dist-info/RECORD,, +click-8.0.3.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +click-8.0.3.dist-info/top_level.txt,sha256=J1ZQogalYS4pphY_lPECoNMfw0HzTSrZglC4Yfwo4xA,6 +click/__init__.py,sha256=YkIrDg7-0g5aBS6D2pDe58j3MOaFylHED2_8OXh2fnM,3243 +click/__pycache__/__init__.cpython-39.pyc,, +click/__pycache__/_compat.cpython-39.pyc,, +click/__pycache__/_termui_impl.cpython-39.pyc,, +click/__pycache__/_textwrap.cpython-39.pyc,, +click/__pycache__/_unicodefun.cpython-39.pyc,, +click/__pycache__/_winconsole.cpython-39.pyc,, +click/__pycache__/core.cpython-39.pyc,, +click/__pycache__/decorators.cpython-39.pyc,, +click/__pycache__/exceptions.cpython-39.pyc,, +click/__pycache__/formatting.cpython-39.pyc,, +click/__pycache__/globals.cpython-39.pyc,, +click/__pycache__/parser.cpython-39.pyc,, +click/__pycache__/shell_completion.cpython-39.pyc,, +click/__pycache__/termui.cpython-39.pyc,, +click/__pycache__/testing.cpython-39.pyc,, +click/__pycache__/types.cpython-39.pyc,, +click/__pycache__/utils.cpython-39.pyc,, +click/_compat.py,sha256=P15KQumAZC2F2MFe_JSRbvVOJcNosQfMDrdZq0ReCLM,18814 +click/_termui_impl.py,sha256=z78J5HF_RTsOBhjNLjoigaqRap3P2pWwEDDAjoZzgUg,23452 +click/_textwrap.py,sha256=10fQ64OcBUMuK7mFvh8363_uoOxPlRItZBmKzRJDgoY,1353 +click/_unicodefun.py,sha256=JKSh1oSwG_zbjAu4TBCa9tQde2P9FiYcf4MBfy5NdT8,3201 +click/_winconsole.py,sha256=5ju3jQkcZD0W27WEMGqmEP4y_crUVzPCqsX_FYb7BO0,7860 +click/core.py,sha256=k4PA2z0BT_dmed9I52Q2VLi8r6ekTMCtCQzw2y915Xs,111478 +click/decorators.py,sha256=sGkXJGmP7eLtjtmPl_Un2uBTlrhK8s2L22n-yBiDwTw,14864 +click/exceptions.py,sha256=7gDaLGuFZBeCNwY9ERMsF2-Z3R9Fvq09Zc6IZSKjseo,9167 +click/formatting.py,sha256=Frf0-5W33-loyY_i9qrwXR8-STnW3m5gvyxLVUdyxyk,9706 +click/globals.py,sha256=kGPzxq55Ug4dFUrgRV-5oHVPOPdLCUhmYolbrrVBo8g,1985 +click/parser.py,sha256=cAEt1uQR8gq3-S9ysqbVU-fdAZNvilxw4ReJ_T1OQMk,19044 +click/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +click/shell_completion.py,sha256=_hPI12T9Ex-y5a3WunWnlH0Gca2_urzXFXkDnt7G6Ow,18001 +click/termui.py,sha256=Rp2gFE8x7j8sEIoFMOcPmuqxJQVWWTrwEzyC14-sPAw,29006 +click/testing.py,sha256=kLR5Qcny1OlgxaGB3gweTr0gQe1yVlmgQRn2esA2Fz4,16020 +click/types.py,sha256=VoNZnIlRBAtRRgzavdqVnyfzY5y4U4qzVGI1UvvX1ls,35391 +click/utils.py,sha256=avYwX-3l2KkdJNUo8NmncZSoAdEmniQ_M5sdsSYloJ4,18759 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/WHEEL new file mode 100644 index 00000000..5bad85fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/top_level.txt new file mode 100644 index 00000000..dca9a909 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click-8.0.3.dist-info/top_level.txt @@ -0,0 +1 @@ +click diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__init__.py new file mode 100644 index 00000000..a2ed5d13 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__init__.py @@ -0,0 +1,75 @@ +""" +Click is a simple Python module inspired by the stdlib optparse to make +writing command line scripts fun. Unlike other modules, it's based +around a simple API that does not come with too much magic and is +composable. +""" +from .core import Argument as Argument +from .core import BaseCommand as BaseCommand +from .core import Command as Command +from .core import CommandCollection as CommandCollection +from .core import Context as Context +from .core import Group as Group +from .core import MultiCommand as MultiCommand +from .core import Option as Option +from .core import Parameter as Parameter +from .decorators import argument as argument +from .decorators import command as command +from .decorators import confirmation_option as confirmation_option +from .decorators import group as group +from .decorators import help_option as help_option +from .decorators import make_pass_decorator as make_pass_decorator +from .decorators import option as option +from .decorators import pass_context as pass_context +from .decorators import pass_obj as pass_obj +from .decorators import password_option as password_option +from .decorators import version_option as version_option +from .exceptions import Abort as Abort +from .exceptions import BadArgumentUsage as BadArgumentUsage +from .exceptions import BadOptionUsage as BadOptionUsage +from .exceptions import BadParameter as BadParameter +from .exceptions import ClickException as ClickException +from .exceptions import FileError as FileError +from .exceptions import MissingParameter as MissingParameter +from .exceptions import NoSuchOption as NoSuchOption +from .exceptions import UsageError as UsageError +from .formatting import HelpFormatter as HelpFormatter +from .formatting import wrap_text as wrap_text +from .globals import get_current_context as get_current_context +from .parser import OptionParser as OptionParser +from .termui import clear as clear +from .termui import confirm as confirm +from .termui import echo_via_pager as echo_via_pager +from .termui import edit as edit +from .termui import get_terminal_size as get_terminal_size +from .termui import getchar as getchar +from .termui import launch as launch +from .termui import pause as pause +from .termui import progressbar as progressbar +from .termui import prompt as prompt +from .termui import secho as secho +from .termui import style as style +from .termui import unstyle as unstyle +from .types import BOOL as BOOL +from .types import Choice as Choice +from .types import DateTime as DateTime +from .types import File as File +from .types import FLOAT as FLOAT +from .types import FloatRange as FloatRange +from .types import INT as INT +from .types import IntRange as IntRange +from .types import ParamType as ParamType +from .types import Path as Path +from .types import STRING as STRING +from .types import Tuple as Tuple +from .types import UNPROCESSED as UNPROCESSED +from .types import UUID as UUID +from .utils import echo as echo +from .utils import format_filename as format_filename +from .utils import get_app_dir as get_app_dir +from .utils import get_binary_stream as get_binary_stream +from .utils import get_os_args as get_os_args +from .utils import get_text_stream as get_text_stream +from .utils import open_file as open_file + +__version__ = "8.0.3" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb9ca7ae56e9ca04d0bf9a886a40044eeef3da4b GIT binary patch literal 2692 zcmd7UX;R}j6bJACNk~H2muANeP19^)Z}v4TO*dOL@Z}X%F2@#$25%)f&~Spe%G4ZT z4lsAf*ZDM8m{0TG3ro)p28usF$(CfviXE%5F%!d|KmT~Le$U2Ye^KG*pIR*J;GdqY zi^ZH6#GD$Z)~)esp|*xxhpvM`vrW4EE(p`G21?tl(< z2f7nF*`4Sv=wf%d@4Rm4X1_!CKo7ec-3z_!9&{h{v3t?|(9iBe55NGsA3X?z>;d!; z46z5%1{mxi_q{g^!)yaR0we7A?gwuaM%lyeM{f+q*dy*IZyd(iAJ7vp!5&3V!X*16 zdJ3l4W9Vs^W`9EGAjcj@&%g|O0zC_}>`C+-%(17?^DxhzMlZkuJBMC`MfMDO36|Ki z?q_cqmf3UY6-y?|bWHTEKU9oE@P=ndFle@1V@CVLsZ1zYSD^fqj>SJ6AL z!(K!0!Y+Fqy$5^j4Rjvz>`nAO?6bGr1Md(H+1uzNIAZUhzrYvvF8Uab*?Z`(@RglM ze}ixAee?;Opby~GIlPRGA3aqvc~{zZhSY{-Xz7KnFfJaWQs5h2;FPf>eH}_A9Ha1P zL?vP9$Z=)C2*N0|lom!57@l<}G7m~d(k~iz;CYts7_Rj3WLwEF(#CDs&l%UgEANC6 zU@z*qcRgjuXiOUgOA9Assi2H4UoT|$;uwdtBEt!UHvAx>&V}(HqY@5_)(kDJO-I;)vZ8=GPrf$H@-gi6`7%>n4hp~ES=|ky?1Eu&vTTZ3c zxGR2cl06G9@y5L_TZa37Y0>xv7vM0U6{;>|`axNt`8>V$qKHhptQ6i(^KI7IYG*i# z=EYCguCQpKaOHWqX)eMp1?Ii9a5;;7R$MreX5LDj;$WWiE!WiYiKbqUm3E0cNxD|q zw@X-=2(7ZFqYa@7ib`l*sGfmEFXU~aX&5?HM~^OdRQ6vO-#b4)!DGpMDUdcDOzm5d zxRM?@P76mZ4^Pf_uMn9-H?X4bme2R1?)Z!mRdvH%J%-%;!iwk`lb2WDkI#;% zqpLE0oDmJzXBXek^9Prg2m4rzUtb^d|L03>zUAdMZ*hDdH!!uJC9%TLbR;b!uTTM( zM?IQ4Qo{0H&Iz=M8(m|uxw?u!qPH{BK`4Cg_9?NFo6Rkpjh|KOP16Z%)2zgCKMO@K zaE0&gn2J**D3TQQ6e)@{1$_;G%OGZ`A@4vnj0H&2 zmMTj%f(7+~VwB<|#TdmWigAhwib;woifM`*#SBIz5#b%yYL+VIDCQ{^C>AM}C_Ymx zQ>;*|Qmj#|Q*2OdVpJ04NaE#gQN=dJ4#h6T9z~vFAEVM>nlDca^S78fr2`cITsmtv z5#Gb;qFXNF8v-}~FZjqb=$-LMkLa+BQ@;rx?}dNAkXyYuk%b#ABQYIX_8ors^o>m~ jof*@VzKl#W7d}=}8`bv>zB=*S+^-n%WVYsi@LT&YPwdJI literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_compat.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_compat.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4cf4eed30573aaaa55121ff7acd18364d65c7ea GIT binary patch literal 16041 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

>r**3u)wt0-L-jPajPm3 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_textwrap.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_textwrap.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4cd8a5f28949bf9eff39256c24f9f528ed3704c8 GIT binary patch literal 1534 zcmZWpQE%He5GE-~mL11!v$RbH3<&lxK){*}+rzM-7z%8_)}ipjR;+{IjZj3^ku6gW zDJ8KXKPCGW?SSNQzhOUM|ADW2%3tV9cPD#=uu$NMcf8Xbzx$|Ud%H(q{QcK5dFm7L z4=U}!L3skxeg;AkNpljf-!x{Rv)r5Um{al{k)Gt2L~=zY{)HF&lKw;@{|4g7Frsdd z7P?gDFKFBYyDvkqbY<_7$6HN3TW;$)6!F3&^SLs^$ai;)I#tFhDbnLgPpu2n z%7{GE%5|ER(#}82WO?iYqsq$Y6o7g+y0Ai!zJY0f15uKi*WMmLb-`ACO(xWQUqi|J zWEIqbB(?uLt~+&5`;s*4ux3}R?p#w!>JWV&6TMS28#i`(&5L=|b=<1_rNJ@{)@~4M(*fancAlh4BHsV%`InH_zo)qf!>>qj6r1b9FE`#YCm$L7@+3i-WY7&8t$G(R^{L z^y%k^Uyhz-MJfZ;3ca?YG|$rMCj#4l2FM@I7w(=oPPEJ+^?y}kJ$45K=?qvv zL)wR@2M?#q4_Zw-ycHQS7i3y0U78TWQ-&Ye3_NsWgtz?>1ayR~81`l5)zG>Lsp%Jl z5dk}((Tzrz4WYtLpRc%ZW zH+P@_^8iG=Q{)ot?U49B+HQq4U091XaSZM={g$dQK6Kfq!PXaT3`6}=`G^jq@l;fSrg6$b>7-=3sXZaxOh1C3qr z+J6N%;1&6UA!kqSN_GYIYy25_LxbFPv=;@gt8_I}CMgw?FwaW7a@ITq2eXG_8(sON z$aEB}fqNe<%$zzeljlHJ2x!3kKSEpU7KlRUi;p124nPpf*)9!O2y>S$AGV=s`A2;h z3Zavk62kR_m=&@DmI~Jw;-pIQ%?^d@@+`A(Q*3FV9-!WR$YGFrE_@0XA}I@Fus!BO z6nK?d0$XN05Qulf`p^r3^9-Li{T)X4`prHd6=J9G-ngJ#%riYUcqrG~{801ks7c$n Yw^B428^(l>*QfXz(YKfpQ}w-n0W=1D#Q*>R literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_unicodefun.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_unicodefun.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6baef0642d68d781f1c9f732b9907f8af5aa542f GIT binary patch literal 2329 zcmZ8i&2QX96!&<&UdP$=BTdo|Dm2_!(cQG7hY$g32q~%*m5Q{`u7XyMXLi?#?Qv(u zo9wbalyE>um3l)+2<;x}kqZZqIPyQtl@tF$TdBOUy=|za`Fd~Od%yQJ_7)ag1HQli z7LDQo){u@B5Ah(86bR_J7v z(Yxcy{v4?hr)R>>)q_;X9C064C-YNq=Aw~VrKS4tm(tRFW)+s?!m*K6Njv2 z(4IL)`c8afYy;BECG~7U)hDu;^Kr>JcZ~Lz$kJq4u8hIcDI&{{a}C7G=D_FklM7^J zipt&jDe9Vl@@nReUC=)myRR`8=WK555-UY;x{r(}=;04A?vLk6+SAhR1#K6o7Yl3h zBDpkK9-C8ijJ}2FLfYRNUE7L9%BjGz?@5>_rtu))ERJX_aUgJyF@n2{<9l)7GeTP& zl5RkCEJ2|poOUVal+YM>LEKYSPxwJ_d-T_482AVHFbG5J?J+KKH|3z7V|qmWR0b@@ zd(`(*LGhiT?8EWU6WC{QH|PN%f+fS6xv{f(>lOyq%tQ|64WKQ&$-s|L;=YuLSYKWB zwfR=!g&~z9;cTD!QnY*)t)_(^O_3%E;9AY~MS%=@UXDsgnuwOFCQJlJ$_|+;# zJyqj02|b@SEM*HxSSs@s0-&53I%UI=aiNTx4Rd6-QrT^;jjDQG(*!@?jcWPYT)R8^ zX@d|j&SEdbK@5S8av19vA|m^c05Jqa5sn!aX&}A5km7rHZ#LI(flS~-$|)v+@Yw)% zq=oNlv4{zY!{C61L(J*JG|)+g!NLLL3GZp@EZUl&BU)%IEw)BK=88)DWw>;qP`ueX z2>~DW1HZ3}MXQXUa)^fUfTcJJdVL9rh8h6ekkSGH#Y2{IkPs==Q0S3P#SBK5g&{lC zr<1if@OYrLi1pDm3|}FGw>LW*+uI+Nh}@H$joY8i=%Ys`eF+00A+Ri(g|c)`o18^8 z?*~AMeJ{p|uH`Ogkq$0}ikSg?m6Dm*8_8J5-;|teWM07y)UK6hWf#bmwGB8&zZd=T zI*kx#Xh;p9a1=Vi`(NVmURpG4p>S3wK1)La)glYfX_Di{fzCqFZm=Z`ib3C@M-Ym_ zsaIx7eUQ!)`#U_#je#H#wOAQ1$Z`Ym8oUQ1({&q{@-4UEtZe;O_(Jy&J4h2{#a=|! z+}4p#6J6~Jb(G13az(la?dek?RP_!^XsoO|x9)7Id0k1mS3OBp?em>2-Bzk1s05iL z3}hI@6l8?tL87WqFf?yNA`S!DR~3&CWqS!IgtcfZW$m*dhMt95qeRup>QWVW$yEJ| zG?qa`b32Xs+>5r|6&>hoRfQiS_xOtT%;bZ1UB8N*GLvn$?}?7z(Jihl4J(gB+uieK zciJx4D)0Yl@b^H^voFc|E<7TBvlpg4XpZuc(tRHd;USEYR8qd13r)&)7Yyk}L-=fIoeO~BHq@-wjTWj&dCTGEqd+YMK8zSiL;A7) N0SWDsgB(<^{0G;;&1nDt literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/_winconsole.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d70096b98178d992657c45265100a72841ff180 GIT binary patch literal 7785 zcmcIpO>7)TcJAu#>FN39h@xcbf9&kLm!!;9N1OI=s)ib> zXL`1}NqLA-emqK?0Q(0739wl$ARTp20we))-9vx?Ipop^ki+KUOD@Ug;OtuYUiAz) z{827OdeE<5RlWLu@2gjDs<~WR!}H6(->m-CNlp6|C59gxiK}>n|IjtM%{2Na(JKkAGsJ`et&b5QXk;K!UX@CAOrJJdYv z9A=teYcKK9`+D&2A8DV(Ga7fsG5UjO{fKi!)f@wV)Hw?2oJjYWb4(mrJMJ78$Jb6c zCqPd+CqYj+r$CEN5%gu}WpPxD^%y@yvUMG`UO`Td^29-WQ$5x*_+gZOLzTXY(yYk# zbpFy-jcl2uh3^r3U&Hq(zNfk7lz72;9p5+jG3QNw+&Ke&0(o!o6V6$F(s`So za?WiQFq0xif8IIIv}LU|ZffG4pR&%sGL3$mIp4mcwN9VaZfN{v{>mebzamC@hV!mC zzxJN<9_ahd`}{J0m4EXQWFhq}{u-oS6WZDZ$X!IvX`3{8-9Z;;pF_>Ol7IOK;rF=>#wYdnyR}P%Jo{fE(J;w*O%uOu7j~|UaMT6ErUzW z&QC2bE>S&ecAmH|7>0-BxLfgCQ=T6*TB}Rq({N^PSytO^A)~~DM(g}JssV<39=Oc% zOlA6ZWoqfpd^sAqA;KxY*{rtsY@;QXqtT(%l7CIEZY)QsS-)2Grlk;#|9<}bdE?ha z{tM&_0*A)03{Cq2;Gq2{4d-a%`R}ViVQ%3)zg2BFYRKO4WRbdxH&_4>8leafgbAar zb6uFAhDd;#iY9~w-cmFvlHhG&gQgTsE1IFYs~IQ7v)H#>l$!6jE9><-mcYO_GO)^# z;fYpcH$u^*EsAU@s@!jRoyctQMl-VNzHC;*C=uMNwndZ-LfPOVh|A`BcG z+bm?O>QzeV$adXUwJBUTO1o~;=j$HvS=ar+dew_dB(0Dngq0SN1Q8QtTT|L-r``}A z58P*(e3Jx-eEBiIcsJyJ?aZpTzUql$Tl%CZMZZ;Sc8WE>*(9QvpdtS*6vqVMR2#~HEQ?Ya;R_bd7d( z@X*jxc&G3NzY7v-J?)|1WilVKmLBR4jnD|quGV8=q6@I=8a;z)o3DmeS6@qxX%Ee= z`NRgFddilyFda+v7}FMaq|V~tSk#`eN-3j;5#{GQleeec<%OB0Ym>9(C>y62XKu|S zH9Fs!Qzqm>mnYSp#|ut_m(Wd3o&t%ob?GmP^#V>T2L*VvTac4oqunqvRQ?kzN&HU*o=ybTA5{VQI5$OxIbOW%cY= zx-Q>E?jCcXG13#f3bJhuTz{lF#^+j{af6$WY{&duGc_jx1y8`_mtoNUgJ3G&*@fzZ znYl?!VaJ})640ymjI^-Jx|*xjS56>Fz;F+??}?HgnSt=?@_l6Qo*Wdt(Q1UQyN1F* zDFxen`9&j`7)aL$4+anMRFftfXw#2d;rvb!ao&kd(7$KWUm*NsLTw_kOCq)Zi%5K3dVC-6IAj3AtzGX!X=4 z(p2eek{^JH*W$_+r-rN4QDGY?aDc+Wj-A}MuL*)d65XLWNz^06Ql0(As>R!@WGw_6HN6ERx zSllSjO-G3h>a>(pHW9HEr=TX~hQ7NZT$*!a#R%mbqItRNu-Ra!*clnhR`R;s*kkKd zfK$%jz^H?>AR4ooiJ#4Mraw2$EI13GrqX~o{eR44T2Diwpl3lh{|`N*hATkXT~

b3u zpwc8VoEKSN+|9(`q}gNgq&3R=UIEjE{XzS)%JQ_3fgk5OEWzk1E5Ss}N|cMWYVr2e zRC#f6pk$S~CAVCeyM5!Pd#ikFZsE>meur8YOS&XSOfG`pL`Xo{TmH~aC`1``>4Za( zFWn|iP&gPrgM6TFk2+}xy_=_ZVN8FPdn>;fZ9FtPK%0;$)G>fAI?zPtOyP>Da3ulH zLR(Aram60s3SDV{4=H#YR@dS>;R_+seUoset3Ant*`D?kXa;1luyRI4!G{8pQchX8 zvg*iaHd@hvTi3qlPTpB6FDegYsa%PzJ*TGj0&|zMw4fgmxlLpmq;I+M7I^32u+d!$YNFb#l#D17 z;=1MHrhs&mp}iO+EGcl6Yt;yq1`qLDW?euccE`FpoH87VIMtO?rsEDV)UK>RvScXO zmv_NS@-T;1n6_FuGJgZ6?+jUN^YD(*Zh2)mcC z9l4LYAwNNtzr!12oxX`%q&iXKg_@vxaPHWranG~_gNJzPP$AtU7_$73^>ld{W6+-% zUG@~?*v!IiO>!0yz!){PFwuD@4qqU2p`WGkS_9d5%*iO-zYmCbhh4gi%`ctNQ#U zg!+15v(52+hNr}U`=3B^?+9sAXq0M%SuofXr~{xFN6tV;lQ<9Hq{qvOrY=xZpAgx( zbWz47^e0i*{YR7!4#Xon$2BCiM>lCeYB1^!1Kp&H!`4vL<|!wBU*#n4{-1{W9oyM& zd^6b7C0%z_mxsaNKtZQJ$00)NfUofja^KC$=GdhjtrbbtFK?z}*An5F%U`l9{dJCP zT$zhP1|L5eok=%0tiy2plNkMFpgLlS#jtmvL_p@s_e|nDNKlL1P*Yg3Ollf zhSd&5*0oj#wiy}l$6|}HXW;Xw8}B_xMFs>U-S#4L#rM5Ps-lEn`7}yDR}^`M|#7L z^6~Xw@C7)%@NEcyqU_?*^_hwr$K7O$vdkJhcj<#wvw5b=2gEBd-d+%Ok;z*U#BHMqv3rQM9l>r@7J3PcAcWU`^|-X58y5x zjFL24d5O`1{t55atF_RV4H3}MR^O}82C8fY%$ATK6y?CsAWyElI?@1R4-pJ&9mSCb zRbNBwbNgT;sk1oho>+7UKGZ`}cs)#o=^lb?JzR~I^NPS_1CdRCx|E5M_o@^*k@8Pz zyvqMnx-fRTg~&?Vm!aTuKm+(}ek-z?!A4DnQI1@DKd8r{Ai06MQT_%+hSe#43ztbr z>M64zSdl*=UiGkFv?${?0=E`d{SuN273jz`acRu5QD)<^D1SmtnQ>Dd_{dUsi~e~@ zYd3fZiMP&62Z;~?taTX!rt`>5Iz()&*a38XX=qjetZ+487T|hB2htZLbGT7vA}EDi*RB z@|!C1D9a@AJt99QGEL+V2qN(J5Q{s1PSO!9Un25*M0!O2h{#zYZxPwLz{(p)I(-bE zo|(nX*BOA`P?B&XPD%=f%Vi?RK%&e{lkB9t9o#uiWp5KXPXei}SgQ*E#o-A8By~2( zHgP@?f_O=QC<#eojY;0ZA2YN&0kR@{s_J=k>P923t72EmFe%JQMyQM=vgeeGTJ_=s zoc4W4o8F|PI(h6%@qZ9kXd?sKfwa2sL1SM0)3dtLDblJP{{@Vap*}Z_F=!ipIwC;y r4pW$Of#r>~Q5eC02zoj@nksywP|O#{()eZ6QTN-^$fY literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/core.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/core.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a9c3d55a9b9b8d1e7203e346f3a6509b5893611 GIT binary patch literal 88513 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 RN3I>Og=yYx?;g(`{y)3y9U=e# literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/decorators.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6883440b76b5e868586c4ea85a6723e5ad19fc8 GIT binary patch literal 14295 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/formatting.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd4de8bda3ff61365adaa49fb9a098023c2f1cec GIT binary patch literal 9413 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/globals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5444ac8bfeaa6b83ccecfb6972c90698a6e1f64b GIT binary patch literal 2435 zcmah~Pj4GV6yI5|9mjG0wP{IOkOm0^My;t-QGtaJC~6^4xm6ko)dbn&ow2>?cxN>; z>%>;dq3xA#&_jDHUx5=RBtF7kIrS@Wf%j&;At{jm#*WAX%S9(p`@OnxG9Eq~tdZonJJU706DbmrST!cz9t90QHjcf#YkBoDa z=xEGzB&UdakV-mGnvR4_gf`Tq;RpknyB6U{_2}U!g16&nII<9|a}ogyS{MsqM==dY zEFMPjkVe*k#fVKJ@Y!d`3LJcf#W{a9=VnjQBsHV+EUwYkSlCgkH*cDz2~{F`rx|bN zPMS?R0qhVW<6Q7oi+<9)k#DsUrrDV0J=LPofEr6*i6hA1ZW`NYEN*M9 zbg${`oF2UX8^-M2JuDA|27nmk5-Q+qF}52E8L?RqG6Txdb)u7%jfGCmR=%=UM}6pa z=RT|L#9SQZ^ZMz78@|(!jEH|_M4xozW$Z|7c5l@u8{`5B2=zg)N})Z{6?lE7Pf?{% zpj@AB!o+$9DYTo2`o;r9>sCpq+?cwgejm zyqj=Z0q-izf$egrq|*Q88xfY^awtE9$uXcyiLM`m8d_kQmwqOXLHpd>_m0T{{HGlL zVD`%n_HxYRTm+DM5PFBbDCoR7)WE%T80bK=&jpm?`iyFK&9fZM!%iU@o{dlFM&cSIT1i8 zu-2Ui^C_6;m0Yfpz_0mLQt|aW=!@KGkfyu08|zucP7@F{y$oB~q8(|$IIfZGYS)RzOFBj=NT#mn;;DmWpu~Ko<0sl3Dd$g8Iy) u#v;_1Y6s`s0;zsJRy>vB3v4lip;t+j)cs0+F9l>H2*{OSb91e{QvL@t_H+;c literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/parser.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c5d8f1f6140bbbd2389739b70cb7aaadc785b37 GIT binary patch literal 13568 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 R4;N?i2Tn|VYRa1`{2w=7|CRs% literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/__pycache__/shell_completion.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb3a6653114324f504e3c271ecafe6c8547e3b00 GIT binary patch literal 16687 zcmc&*U5p%8R<5e9{+XWkc>ELp#c?W=i9MZoCO@0NGO>e`iM?@1CSKb~NXMq9-BmNw zazOk_EJ^5D)xpK=ukDEFRz)Bwj#5LgJN&0g8Hl z>Lt`iYok&hLA_F|NWF~uj@k~XkG98Fch+`Fz0w|E-BsIV8eYlEt?c&ppxnD?9W+qm z_aS%3#|3xH-Fe%t?faVHj=Q^V8}6=KR&Bq#yLQ0cQ#U5 zCk*#_T#?; zkKxQww0^>!LW`>VB#w{azA5%8?VdurMYZx~uN}08mkMvK1+8ueS4Pe?RAbc(JcWau$-#wgPc=Q9 z8u!=Qt)SjeOLad`tm zp~BHt2lw`xd}LTqUeHsWW}YL8J|p<&@f?2sB8q{12UB*}yp-F>ZxlA{z#QannH$AH z(Y1Ppnsjp)j6rc=49tNw$lbCxN(0-quUhK$z#5e9Ox@{W|BV#jaX){AI7*b|T6_s)MsmuDXvaKJK|H{S`m&RWCgzqDu13k&FUX0>tEt2gx| zE-YkvOISVY%!A=hcTp(yZhFmL(74j}oK{E9$e=Q}rl)4p-JR<#)$LH49L!rw`U#dB zfwSCgyM96)d6HsNYIZXZN}Zo|-f6UZLMDcml8uE0=SC}77E*^@CQnLr;XtVM6djMp zCbPD%kZM$y;U>J&qBiSX2pU1p2hFZWZhJRdfjm}|8=Ccbm4noU1z*HoQMVx25uMdM zM7yDamdNj3C?F<9#2Z3VZ?-Xas)9SzUKS6bsE()|tdFtS$zq(vE)-#2NK|`JugN3O zgCE-L@t&a$;q?9Y-Pucl+igxSwR=mLN=){O*9;tp&hj+6?oHYjpo(HlILH7_%yFREsshOJF~VPj%7}Iq{%;k!q_uzmaLL#TVp6I_}8U6 zjB8CcNPm(A>NTA83@%AE%QdkiSvA`o_3|qPuZXhb6=5iGETEQ*B zsE)X0n7OiRLmw;Q*j&Qdvw^qTsA68uduz(`A(Xz;NXy-I5h;oV>{r8W1W>9g-CiKV zBo}9#i_4w}lj|)uU;>9NTRxO5SYPuXfe?vS$89wmf#>*ZUbEF`N5)_oy|%vAup>dEm#A! z4igaBVaREt13Mx{!E>D(%P>Aok8z?xzX@D$AYN$XkgL-?}cJ$r6GIfyB)A6YwU#hS@JbK6@G6CQb+yB zSOD@DZDCen-Ec?5uBK|O2}dB<*IUrZnCU~cl5x=zM!ZdIF}s{`<|y76u17K_+?JZa zjOgi^SZuXD9A*gNbkGcN0h3wkq-O=jj>ZWy8a-{3>Are{>)Wg|oUB;jM8KRYy;eJz zhQV#oD$smluDYF}!F0RiILHMTTK;j|5ID`AA9Pn8jwi)QAM?^uoON17-Db!OS)gK$ zG`qbvryPU_da(EGFfT(1ZFU>l9Cnzmw>pd6Fu&Grv^w+Eym}NWs~i@Op$H3lcxpEe znl_5~!xb6Jqwx#)`LqI9ZH>Bt71yYngB(h0V55W^dcnA7&Z{G617m6XUVCxVQ`97` ziFMP(!#E5}b&v+g1Wr^fHG#h{2Mdn+QPkBG3mV-NS)=tjT2Nu?^3| zN6Y!@C-Df)udjC9UYqqwy?(9NXh&Cy^*YQuPLI^}h)yADx_>!rJ4^z4hj~`nzwP zfAzx2iOCO!NAEv*d1FFfo#W+`lX6Y!PKpY68CCz}m4?3@uTq{f`D|4`i|*IZB5={4 zj357^;|`rAQhn_BF&M6ftMy6i^NABDoQcU{4->juS{11J`|mrGqI@S$I>%r^jyabv zzep?9N%V~^LHGI7=iYela4OFTd?Udi*f_Ak2q z;0K(OAv|?*YEn2e9LZu!I)!~o=9kX7^Gtc8Tu#lCmX^8?*L^LKnOK&{gHG4S3g}Fq zNzbmn3uh8hwH)+TeG-B%1Vs$%BxzSbVZHtmj zP0hW1{`~3ri__1d>lFXBp7hgdk|CwKF_BUl5$mhox+9|$#rYr})<#Bkw46?eB1|~Y zgb9(PiS2bEZY|yF=Jf|OrRqfTK^8;wCMH1u5pi zCX*BiF1*9(cbr~_N(X1*Gg;IXk*;}8)J{zu!yEBj4M$6DKtOeU^t&OOO z*O;sxL&@)9C8BAdkCYa2Z7yCEB4KHq={8hLFFr30SA@t{>o~FiZPAg%R$57hE7D0W zeNU@V9NNAU=m%2T&K8FM+?LcUDblD z5AS~N^6)MyCKt(VA0YBSY`fhPs7yae*V_7I`zF}*puWgzK3{mQ86QiZGdA~tnIe9Nru$lf8>M%@ac<*}&c4tESkJJD_&zg_a| zf&hr@XQw-ktGkC+q((4w7eLG1?jBs-3vjdG?nN9dZ58MFO30r)EYS@BlO|@E8ql2UJNYmf}w*3jQ*9PnVW5HnlKL*&=HB4}Y)R37H1>4o{1 zFU*}i8wIQ3h~HTBB)Z%jvW}24x$*-H)R!nee;8qOmR(7!W|~o~^A2GYr=F2Beu(y0 zfa!fqmRSAYeW#(ct`l~Ja#Go6sid=!jwNChLq;6;EA&D&_D1X@G8BT_#HuK<=)%Hr zKsm`NIJ`KMa8pA&iSoth4j)j>)pjJeaex|YCF)wush99KJOMEg@ym)@I2x%19_s%G zZiqzAM*M95sDCia!&KWXT+HES;Ua-w&BZ(BU1J~ck*eAM`*R9#K$9TQW+;ppyOt>p zlx-tWvFy!kVd=uc6AKH|ey|RxSkKKc6n(%14MBIno-yPn@|>`I7H-9IGPPt)1gQzr zE%gF9dy2)+v&gbkpz!~}d5xVE`g^xy;uii<5`}-%+ran`>MFALdv6PL=3$+`&dh`# zF)L9(t)5!v2(@Yq(`h85LEH-NAWO2aKrD|bgji^ZkzS-|t^$!G?wTwwS%$=mm*)?) zdj6gn?wRifXJg>cb5ASPRon3-+_NcjKteuAc$DuymgUhlt*g1v=3QZVNWM0Fl)U&u zW6hs%@)=ZuM4KU#xq*p%SuU`F;30cGbPS*if(%r#&YNNzQ44I-4-DrWQz(%P$K6}=AqXqII3&{w08Z!^&(PQ1( z5&PgL>Sx#>&TK__zlbO9jPqt=ox+5bHdr4D46>%uQwun&W2wkAOm2@S2alA5EWK3; zyhsBm(8h5%8T0C8FyvkY1rvnc%*I{%mRKaw*&Z^Iu7y$PKbmFYmbMxDMvdeuOHK8k zNAWG=j&aw3_L&OiWgeH*!tj74!%ZkGnRSCPlwu-)7p=qGXPs@?ym^ePfbFb665 zFANfiGMGi=0i%?YPP(MHw0T8luG)7ZbDtF($?Icb##vdH5>5}F3sVZ!LxL*Z%N9;7 zNRZ$)n#FLbxrXwIHng5}zch&{{BN{2`cGyjFt!IXCj<@jUqU6mDKyJ)CumaD>nK8drQ3qz zru~UTA#0;4&OkAHftDyChIB}J_+iSBc55rhwC*U!A`YzMl(Ltv73i@etVI$Tp=r@8@ko@V=$39*kW?`G|rGi18$0`U)!H8S9W!^GBG&>bJ zD(WMq;i{#1*}VW+y#zA))^xMKS0gANyz=se*Xr+_K7ZltTk{*(##8XI$)FeXcmLAV zCHJZ7rJ3jt2ch|Ve{KsO;3Gl8hDp+dF>%!CJJ=`UanlSk&d<+0Khr-o$1EkYpDw%! zxSHf+-2Awc zSXffs-kKj)&i6V&Yt_>(8SO~5pcS?*%`y13UJ&LH%`}(!x6)PkYjxnjW&PQ3tlnJq znpf*lcs)Z6cF>7|JrlNB{Q^#AIVJBmSwfNYuojKUo#G(lSiA;G}L2CLE>^CYuOp*)70?)8N~+9qtGWUO61CrL4D(*3%}1)*CHm!W{Bv zTTS;*Mc7pb16J2qTxYRq+R6I*110j&)c8KXKqkx4Bs$09lM+Y~OiLZ+lGL$W3nGf0 zlGWV2I#1%nQ07vS`WVkXNL;U`#PyLhrCX$RzB=|`aUG4twH8b3Ch>fZL}X<&#YSPM z2;~6n-Xl$ARAQloK=S-gNgyj{kZy@h$OHTdHi19E#LQNiq^YK^aJc?!C^i{j8e^JS zF}|*$jqkuxrv^FxT>Bt)>0s9@>f8%!(&$<=y4C!=>Y_ij#)6Od;ivdiZ85V-@vM&` z%wcl_&eE=`8!S$<5Ri4nN!GeuD#`6K7!a(IKmUBt!ZaljOwko;mv^Mfq1i zPj?$p=K09MQ@@J3+CUNRsyD7TT5WFH)!Sfwz(v@i?F;t5eJGy@87CDhxrxoyV+1bY zxnj*9nAl4%5L{ywbe#8=5FWt4YdEvwXv{8T0;q)~EJtcu`+@Q1X=3R*&btVpMv!&M z_5dM)YsXE136>WHKN7eP_l*b zHOC{sml)!9n^tA^;>k)T2(iYn3oWsl_24#{uBs@2EC|!GOjrAH=`MLJj#^QUp^~)K z*l9@=bgRNq*=X74@RJ}HxU329-txz&WH4p0>OIpx{5p_tjnuA0R(=H-&{b<~d0+sg zMZ3FZP*^GUOq?-s&Aw`Pm(iQWaB$JOW#Om{Y?lVpzRIvL-~Z1coXf;MxS(HaNFZAW z{NP66=)D96aR7O72K##3ZJERd_6cLpn{2^|fwxE<07T9@XFJ!ik5DkT7%q+!iP|S1 zF)~|#Ke0tNQTRm1KnXW7M|z3`Fo9yZ8a+cu#{PsGbsZNeszYrQamt%7&%gS{+4<99 zUUCVcO=u|0wY^R>@9JCZ`B4^GVF~xwTRwKW#sed&Ca-?{83l;aWdIt1=Zr9t0w z<*N~gwX_QWPqn-)VD0=*fJWZf70IDRCge4N*0cM{OWX0$@4AQPLk7xH^ zm}4L-n>!!_dN)lQ8tyyo*3~FC72s_L0_2!{>~Vx8o;f3^!hQ2;;0DE(kDaW&)rhdr zY;GR#INlXP7xnI9UElvV9BBz88WJOvEcH96gK^?f2;*dUqD^du4;@&lj12DzDqGb> z9pG?X!BmjYKsO;x;i4zW4v42Zu;&WKkJ>1cJkj)pdAuLtA=7~2 zY@X|fHVL<8%s+6#3ECP3igp1%+u957kgt_sJ^FoI!Q(dV1CXbSAlSS$`ta>A4n_pw z2dK~yj|TVsRVT?=oS6*h`!TXb`9fZPFK9{Z2=rSmr5AN26efG zSp?*@4!g{kl3@DMZ%~PmMK(_CCf+O&zzS`|FNq+|#Kt2JCz;P~r@am^uift6Nb=9@ z$k!QoycFVgJy~<{1_j>qP{`;2Iiu@_^cGM*Y}5w+&#c4dW#MzZ8;5@Mi-TW$SIw7F zu#4d?EJm$%3+oX!fMVxNX9<3ntPD7%{s6*u24T>5@n0Lq2)j4xc$r5v^b3#s^%=lX zP$z(KP${_}_fRy*7ri5(tf(Qsl#8v^r|VE%H>pxs2B}YCDIyLRmkz zzF8(Z^BQhZf5c*nH|LtGZmkH|w2ozYlfo)uFaJ*UoJGYLEtv$;)7O78`x`Ktqqn{?#OPnd8|sk=o!tCVK9&%H)U`Z-LjIXP)|b+! zh|b|CzCd>TzIjq0U!*Lit3_Fr6c>=N&{$hTPE*7?EEAB`ew(Zz+CwUCmO^TQ;8^N6 zSo;=>tW&1GhI0quZ}>-0F?M2ALSB5_EEn*zDs~At##mHJ+p0NVozV!1&OBh3Ja(h2=$(@Rhg!@qpW1F?dL{EBTcn=i<)2-KS5VK7C$&y8XR-M+*4-#^2rWXRa0s|B*lP zp9A>uv-pPJD-{ZF7F0nwt-_r7>&!Xw+nsaeZ*i_De@k;E`CFbV+rJh3bz4L2p}DG4 zP(@X04Yx<;M&!PX`#p1ebN9;q-qxY^eRKE8{TS}=pS#~F1eGff=-&Y*`&yrCKREXw zpWJ##jeqRSeLgrm_XWK7f+I^#aAeVapb#8Y`(G%i1L_`iP~EEzsr%IZ>H+mR^`Lr4 zeO?__Ur?SpqK>MEZ|jr^4@z^7ss^6~j{)v6d?x_Y+~144 zBkJ*+L+S~2{Dbmbjc@r?Cs2D*okZ=&l|tRYnoppBDj~eh%F$RXQl_)Q?}24 zg#P5sJ?gZ23N0R2frb8We6GA}C&&RL|aY)N|@fz~`h|1dJ!}Jrx|0 z*1RRQDZhkXM;40~3&2#4nz~t3&#M;z>q)hQlBB_@;PWZ2r)_CMGjuVyB>muDl*V}Q z4y9~ANmKqiZDBr@wHlmOXVlr7MM)@P^UG(5R^*+j< zLD{nbI6=ng>uMgoI;T2m%Z~x~I!47;3n=}PaxN8W-P@E^Gc_k3S_+~lxE|eh@BqIn z&Crjc^-r95B#d-(b>8oUO*}7NzQE$;GYefE;b!E`&|eD9Yu(lOb*~P>Zfh-=Z**H- zJ+FdAzt>{1%DLrkvk~BKw9)OX1v;9K)>rv^_@b}<_N@6)3L48@JgmOzZ>&!@Tfrwz zyyv3sE&*C@&B5@(3@F z@^XxqIbPo76+=M3aw;n^-7SaWp^W%U!dd{WTI@#oIh)YN;C>NZX+wR%gfz(b=~f=1+Z zJ6?O;YhY-4QJ~*jU0(}2Yfnvn>AhE*3-5)X&WTl!6jTe}YqXk;m6Isd?lmV@*W&}r zO-Slaeqf(LQz0~Gq2N?qJ&C{5v$dhPL{^O}VQ+Dp!WcmxOAo4?8L>kzZw@Y4dbDtH~Z!nySnX1Nv~@|`Xnmo zQ@lLM%V}Po;^k>xWc)aAGJ5(1?&7`k3%zDbS$aQ@N8uis$22~OyM6($zKU-sgXw(Eskrj&jyvVm_84Li>39T8 z70fp~V8{3#$ezU}>DKHfY$oK1N7j5yXHudO@3n%(aFjgB*H)C+;qQF_>QyaDpwUh7~LEJPnCKFJrOzmQXeGQEJtp?(697|`c8kiU%FA* z+|w^=1wJaH+)Pwdl^f0`chsq zGydKf?U(zbD6#i)q4V`pA*!tZSEsNEYj9)wyN>>~XbA9!ZaCj9sOpEVQ|R0;Plj(e zSE~InHS%Hl=5pa3@bc!^H^#22?7lN%o}DV30&d}t`+F}H@|XfY@c!n${yzQV?>Scw zUHx%?w7+k~{hp&Ak+N(bJxJQWs#FQAG3tAmj2A_)ho0~Cz!Dxf-IMW~^t{>SX6WI+ z4+#S`(rE^mD;`wY8g@E;y7j-F|penWj^jbco&*X>{zp#kvQbl_{ zwOc5^rDbnn-3x<`YIc?Yq}f3&-2=d|xzzDn$5F5u3Xl|&Yt2>*m_&_buZe~`%F})` z3{ZP2xZaqmi~g*8xDQr|xudB+}5#0e#cqv_71v}kKsp=T=DAD%EZ zYl9A6bJ6Q`4I#Z{e|0tJgdnK&+9FS)`n z2GGeS-4q)peK>5;ibN;Uy@0*rfB`YiO^Yj=kZ$Giu=f~GqaX%a+F?phd4_{P>@dK4 zut2ko2D@Y$&VM$WwjxBD^v?Mma*V|gHDUE&v?-4RUwPd{uU?-8-u1cw>V;9a-Q38) zuqSO;DbQ>K_)+cHp~PJ>7{p~cXsieU%rN;&J{udToJpmOjKU!SIFJOzXskiLDLWE_ zGa>Eb7GiQNI&0k(R?E7_4iH&0vver)sk<8tnSPp6%Fs{BSza_OGH>MP6h}eyH2R9! z2}bU<6iMwv*~{!?%cjmi=kr>9N+v+)K@^a+%+wrY^QPgZ9ROjn3i-BhpSK7D)3ZPT zv5OH7BZbl!rDWg6g*oCyxAqHA+)m z6AwLx3w#mrBIEsE4b~UBzE&3!9U529zdn7Q{-dsUJ|4}$BS5hVzlnD z(uJD#J9rh+{wly&b&Cg!BhGlKg!_#Ltr&Qr)ou8#@XM3AS~Ig7_q`FU1`tLxE%J=D zQ4>t2U}pqYBdvFP9z47NZku-vvmBDsZ#C7VeihAb9I)m8R4{3U|0dj5C)ju*2PnGM zO+kpX3_aBq)e1|ru{>ED)>8ncX?%;p9Xs=}6UC*552|rMEfI~)UmMTNTSJ|fSVYYH z^SqnpMVtU3pf~|<@EM(exGX5pI}G8Q>q~exSCMC@4Vk~jqNKHyXT|U=E`?_f?XNl` zuIr5cv;-fGG?^S~)P54=T4a(s%Sjs@QQ==?2`b4I0{&TdpdD+v(5^k=tQ( zmTx$>N*@<)l|L?Q4#7A+48E^KL*V;m!}n1YeC{NC-XBucwSvB`hBvEMe}G>j`1Ng7 zkzZ`x(KqpQ&x(t`4xdI&G^}8Hqs_gXH&>5d{lV3va0`FEUk!hq(7)yMtC&4w{(3Pp zcDJ&kH?basCt+>{Q6?|5s*ef+V%5AFd2&z|=J5q#D%OC{5G! z8g)r(oI=lt$vFw*G^YS&x*Zr_$31PPt~Ef#c1&wXachMLYh`8=%2@qx%sA-RPOt<| zaE&T1yapvHHN>JJ;Ud(^Fl?Z zXK{h#r?xW@4u&PSib6_k{WdPKtJjQp&Q#%$Rb4;C`;ZE^@OjrU{|^0OsY-=-&>4q7 zu0jCwJB}#HI7(1lR~+3y4TM)j+_HA^p&3!eSH$fEZW#AMkkI^vDbYuWM-?GVOR6kJ zM1dj|BCWFVpWcw5qcPAMJ*}ZT;U;gu2r~XPG-f1 zmXCYO0pq7Nj(!Jvy47oUU>DPu9x$a;u&M+2+S}OcGM#Xko;qlE*TmcL&N1c))AGql z@69mt-lk|yOu-K9!L6M{*mFL?bDqej{(za}5+9w}=pB;?=Jw(fwPWPh3@<@i+~-fj z#yhrK`vTCoYLmA)JTNj4mq#GA6|4oVS{boWK|QWs^K}QJ2?0;u#Rp!p#DNC6Y+l9t zxAhNJ*CL?mC0>NVQZCb1@a(7f8bhl}wO?{vm;vq|Rx0wgR*d)4LzqX%AJOnY`%xEM zFKYmXyNGh~A!kv!3wM1RH&Es@ayPdXh`D)N;E;bv& z#H)w{Xd3?TDB&w^6Iq!&d@8g2b1sPxukJ0j{3TmA7aAHM^kAHb?H;GA=eNMY9no(s zcw7DsDlJoPo|lfB7qpvEMCC>YBndwe?0|w3{HAC;N4nbrNzCjv-L^hZ=$)Clbb%AM ztHpIkG)ZE3*}Th8NDKqa8^0I9lZvpK0H!sqHu7O-audVOA-@be_Y3bo1pWaZNu>T@ z-|19f{(-CBf+KSkP7KD^nE{tG;4H>Aj253M58e!orD;M@1_2n)6M#{2J*7g?N}RqArF26K)w1q*__85NL~U zo#xz_%*?c9skODsV}sp8K0qNnfck}fRd>YkV7yn|L&Y(7)YW}Fz2iK5$2oE5@S_tz z7}6*7ymud+Snzc%eBbjPooIFzyS4C+>v(V+oA5_d>&sZ*5H%|Jm3f~ui6A^7;3kwRE*7N6c~4Ztr;+XfycZxU!W5%MfL zX(P!9qys;g2nf1aFnMI@Ob{CrfUa}g>Ifd0MP*nIh>DAFt!3&J%SPmcghKHB8$GfC zO#n;|5o?SEQF`iO z<_9wwaCR);k`T{E#BCjEJYfQ~k%S?(R+VUB3yh?&@GAVI2u;F~V2yQwlZ}b6%T^dB zl$i{B8jCao0LDQZ0>)QsT%J@yK>{)FJTsG|-6XERwdcY0W)zy}BYm%Ht!768ovR46 zgNss#d8)8$i!>KugdqqIb&3uK$!f_=H$rTEb_*q0$6B5(jx85yP?-)kolOK)FyG*E zf`QQi=~dK?V3DQ`+o&Rx00cLxk`G}Cc!(Ia0>otCNrJAZVU`yV)uSFe3mcRTh@smI z4Mi_z^3Q9u5aIQ@3$jjrt=l;kd8!#gOqmf%o0s{;PIQrTAyWewbiGBi3`GvkO-rV| zkQENWVj+kS<)z&Lc}7ySuqc6!LcsVIU(1~{To(iBIVsu*pW4aF8NZb~(jYFPoER(A zL72AHGI)c+umRS&0wfrmw-MRWLY`ojRaxg z^k^9Y@TFxTP~GtSM6Hg6pJ=%|u$rQpa7iLdA!%9YyyM)%WF-$9a0x8G!IeSdM|FDb zg+L2^z+7fzDgQf|3}Sk6yf_g_hfk%rk>oEnmV2F*a8lTQeqkL7X!lW&vf_YArNLq1 zNPs{{un3`i0dzvHwSlo@Az(LY>17)?&6@FI_v;xwQ-UINYo?wk$gZrEV%kZx(vIP} z$aFi8u}olG&Ux|<{6@@J(gxDTg9XtPgA&9B2jD*@>te5EqE9)!3h#(ZCc>@tIss)i z2S9@GX0d@zErG+l=K>};IUveZjvgC`4?%cyN|tZU~}}*+&pV;AAeg2 zD;<&c8_~q44t`QtI_BA5cGg-CM`jDmU*MWEipcMrz}DWuoIxOzS{H;gOQ0MJL%g(S z9S9v1SBxJDAC{oe6^b-c$PniW~$mEtt)8fTU zH~A7|hJ4EdwG&Tc3MLg@5phnTip@Q%GUSfM8B&AhqE*u(s6}?{)Dce{S0)$1?4;#k z075Mo-`Eh1q~_2qWbKENQw1};e5hQW_xtr=ng!z1e_;vI-WfQ3j~+bTv;y;9%GS4eT=HJkZE{~2N% z8V|jq{hD-+bYWT034#KWN7y*UWPodTpKF<8eizMkx}6h)P43d12+>{VHzZ9O05GjG zxC}{>4Iewo2(%3oi1ucOX{YSgrZLk}p$Qv8(xT`I*XtsNU>?v6ARzfYsFMdMR<%mq8Y)nj45vu->-FdjQMz%#}S-2srX9zX)B9af_U%vDS)J_kr* zZ1gN5Hs!q`;TgC|pr{BMp+5}V#8V2PBGxid$JFl@lo(0t$__?9 zMYHk6@{;*@N>VI9tu?zn7!n=C$?vL_R~hv*1I+L%hSzFd>rdDL^S#;GcP23kpc>pk zB)-Z@YC6tf1!Og0Tp`|)buN(HdL`R%*&(?qx9VVBux$7teo}e24VJ-#Yr4B+FV)Q| zMjnQ@y*0F9{pTo4Hzc2$NXfQllP;XL3nvnK*9_Fw_US*3Kl)p|e89_};f0G#nz=&y zyS)5aUj7^}KhMjDyxidB7kFXZT>m02wW7Yxdq#gHl#jfd47yaf+a?6Cw39+NV2=~F zT$pbYGq*`XwNMRDF$mAa*TOdo#Zk9v7j}~c-fe$>Pycz8ZLmWAQ^b#R_{#b)GSjhg zd&3FG6gGN9MSYk#+Y0*_kO4l*ceg64$X|S4D{cJ2ImElLcEi!gq@oGIS$QVrI|YCg z3Kkckho~JItce*fjLQ1gmb(z0E zr;#t>N_TM)IVw9ZnKEZU2J#ASnExb8U56Exx$Y}qlL?kiRq^|!kBS&rzD@RE%=HWJ z6*sYEV6&8#E%mW{|9vdpV*%9sElJ%W)I|iEAl#7IJhF-XF&v z4Nwn)G&0pJeA}75uL4H93Or;!^A`EMY5Fx258uYPRFy9>epD zEXP$kv2s^wBD&jb#MsT%?5xB?kk!aE4dT5t2Uig7k(i$5WHYpvR@pK>d+|+a|GU5` zp?!D&ON^k=W?`v-jTqSav+=q9C^F8RsK}*9j>$(dnUH06v;@kozhyJb$_gdE?|y`- zs7h(388XN=9!en~bM1z^1B}0vgW+z2fs_nnr2Rbu1=~q}peo3S8_MAHOH$%L*b*iE z+p4;y1UITU*r-vmWy<=;Y8Yika!@L^%;UC91?3N`Jt#GrD>Y zrK+~nnk`jDsViz9N{#1A4ck&TZK+|D`kva4QU`LSuq{P!|Di24f>OVx?m?-8xl$M< zCK@0OU=QB^4$DRr5qtOE8tRYAF1SPf5p2P_6s z!rV%~Cyu?sJ&@kzu5PI#$Bui8OD`Uit&GQNS@3VSx@Tr*&(F+WczuR7Wk$ZpeHC|6 z^Ah6yAS1dEqN<(6QrV!uJ&|{V!E0Ff1L>HRV340U{me7Ry(dre`&V!3|zV_gxG)`;S=!M&%nvRL}Esd^}Iw^VHv`E_tbF@-1EK(+oU#6VY8u?1YLB`Q8t0qB# zCCTN5g`7nDA@{`iT)-YL5ex`dq2VQHbBJXj@qlZ)a5oSZFcEf#06SwhEKDSs;dvYP z^=OqK$sieH+YeYNcMk%E4TLm!kPb8%ik}5v!7;bPz9nd!8bf#AVp?T@bcrc-_i&OL z17M6DcK1L``2i53Fzz0L6oOg@&hQI~`4mQohPt3Qwis6`8Mj~<<`Gs(o;4LM&5%Lno zyIVB#Thj8r3HLoPDn&Pj_vEE|J(*)xag$_eu;$YuYTI|g<-1^1uEBmgl&!&+4fnx! zW2e0__GV|LgXIg`>zUj1b0so!`w;IGF1P7K-@cz0p6hU%nT@xLyxhkN6N7I*zzbdL z+Yj=>T|c)!kBjEn9JOkez!_I$53>@FFs@=>nPlh3!?V~0X>Ru!CsbH@9;~dNBMjp_ z>c2{$zsk#B)E&;X8WDq|Lc;%oD zm>SYWBi%F^3i}&mhsAN+n_-h^!%z>|^cb^ckTWDn3&Z+{EIt$uS?OQ`gI{I6mw9R7 z!r%`bLK7w+{Nz)?4cV6EL-H99zJM$KmAA46!Mu;?^#rpT{4zlhKQ56D2~ zD9?2$DfdGhkx?u9{{;w1=scx4gx&(&#L%<*6i9d^w?GOc8yAQccPW502tf<&xWx49t7rP9`i!#8TL>4dsXujh%=Iy>8mX+ZAeTu^;O;Pmh=I?!)uPBwzK*_8G z>&Rum3Wr|mF{8<#1&NAH47pw6#yXLdpM*9haROT{ppw`ztN|Fs!@Mr^Yu#JI`Vq`k z%WT*}lqdr3mriZSK|L@fxq8?T66yM+_X@W0Ku4I>yyTVSFJTa1>e`*#NzNDN%@jl0 zQ*|>?Y@TTzkXS7uFWnYSk_9bpF}>y^7Z&y8DO53Yf^AG6emu^ez+32TI4u}7sc&15 zqLT_XumS_%bORnCAO${and6VI6cN&pTxFeEG0CQNn-`b#)O3UWMULGzeDc$rtTR(9 z?KImEH>8R{+>Xu0!~6rI!CyDxksFHaEG{wrHBn4@u*E3nhz1?j)yS}I6DJwOzMTg5)Mt|Ag&f=np;zXf4)9ypme zlgWq{S!f+ntmR1@$>5D?56>52AoG)Ej#Lr8n80F|J%T}G0+wgN!8p4B?8gUYF^#z} z-U67GkKk1yjT-w|kYIxRmV|>P?u|$m)3^)>G$c7hw1t3>%*a8QHMrhsevz5HEMWF~ zAjXn*;B}kr$K5N;^c>i0vxc<=ldWS+MClk?Ha(XnWdy~-Yr$YN$sU}A#ze#dwaKGk z2@}IJwL1b!)<}KkKR~@e(*YPjWHVfd!sE4UG9t?OEg0~~?2t{06wU&uo@X8-v+F4b z8S#PqWcaPgG_fHIJ96kAmp2fb0PPtlOb(FA&Rr8LR!)~mK+GU7S{!kE>HxfLNEU7y zX)ZEFyc>omxH|%))W&!rUC1OW+oWs}zJmOqCeJKou_G?Ne(A#7glt=3m$ANsWgU7; zex`bi+~k;8)ryUMkeb=bQN8{iLRZYkNYcXFzFq+kD>-(x0!X9*SH@6n3dBlMlnqN8 zUI4D(5g_(bZVy4)N9i%eQSP&48wg<4xvxGQw2x>Bj zD+g}KP;fgm(p7v}3bRw(^lc|B4Z=dtHuKa;YMZiTQe|z3#IWW7Dk&?Ph)nuZut$_P zPd>?21ogx=vB?8F<}Csr(4kI&S{E52Q%=kdcGSd4%{27Fb%emL@6xMfge)a&iMj)5 zCxUm-9Zt?DBBg*hnlkfu;EbN3w94uXGIUX~@wPc@L_6DummXBRr z%VOvxn|$7U<5h1$bca!_&=w}u#j=}_e61PCc70kGz>L(TzR3ohhFziv%*3K9lpGN% zjpI;30?06;LBlY5T88b)E)}RZteRjSBKdyHw6ck|qHU0H2ev`VtX-+GorA#6&;$(Y zanYSW#rOj_gv2$|2zEMMFDvzSUyw1dCypf{Sz~&y!ZHk^5S+{nCZPmpk8NF#NvfV~ zub;$$G@Vx0hkbpLOpCP;Gty=~W~&jIH`;`HRv3a&raX>YZrBncU`QBv>LMGCLp?Bs z$y-z2WnAs(*?cA*e}?l?NY8};I_*qK5>lWcJ8g=s;V8R929OreBW!f= zE_4_gL1r$^7^9CUH0$;2YUul&lZKQZcGih-JppSd3Ox**Z8(mn`GV=rG3f%jw8{lAv<%6^0UX4|%42DdiYB$H?Qn=rw`76p;bdpH z`OKwr7qI(1A-rq|+A_T!y=D@C*@04u`IW z_bcRWN%)b+%_6MG9HouvenG#$+%D!G;Y2r>Xd5Fu)6FR$Kj}~j2WmuBoPzb9$uBae zyj=zy{d1`0;Gh@C!_GKa!iR`dLi6CDjHrw4r&(SupOMXBl8dQk z53s^~V|a_!vN5O0k9bG}9J-iRT*BV)Uz?0U*eRMgoeOft>d{rQ{!w8qivp@zS6Z?v zVGLlNQ=;e|O-i$mGZQLgUlg#Fjc7waJJsc8)r$7ar-rkn;`S+&OOQR2E%IQKRX#V? zSX|buA`_Us&56@2w4%PXW)Ztgbn@P8I=AZeqZbpxGP*iI)XB-Cb)@}p4kjM$;1QWg zlS@pmM7wh2C9$Q&n%FjJTghCOQi!l{g-WC-B4c#w#RQ?yFip;EJoIU(nIo9Yu}Z^| zcd7pZ7@emmA)KUt3HNe#lF{p&%Gt?En0Ei34`lKTPI{iq0TvnIjN@tXh4F(po{p#4 z@I0h3EY;xfKsnn6$J-%E5hZG+>6zJ?+VITu^vsMtizl-1yfA3~WR6p4qBve8B;&rprwN0X&Gk{&Z0nzN@ULU81NtGj^A z7jsTYS)$>34=d3r)J%Mg%RCP$G^F0g2YYAVxp;p5+$-nLef7f3%SPPp=Zm3PI9+cc zJWD|tm(AH&_uyXlc#*8oee+n6!xS_|$Naqh%Y60sd6~q8iJV;=1d>Gl;^LXkx;a>j z5!AR0jn?g$qs$w8us5*?@u>CJV3}iji9;+#rBN_sxOnWGIo07cb3%tmZef|6rV;j&#ir^D z$O7rLf-jQ;!e7D_>w~#}qc|mThktGbN@1jQe{ox`H<)$c-+!yzQ!0)RLzMI1o#fpJ zN+ECjC!^yBlXs>Bum6*!Sc1pAA4=hs{>P}ca4e);=J`)XUmQPF_#@YOgmC}&=#jK! z1~b?^Gcr-*&;4Z>QkMce;?4?@S?!Z>u_1%N25_;ir7NI$p~c@^bIs zexfiT_i5Zu7AECBQ=O_!7p6@k$W~_5H&H8FovqCk=1k)m!yof=uNi*shEj!5}z<(}YZa18gyH&TZU z)IN&)d;RIRQ~r!U`KYYF-qT>zjB=M}exf%D8h{QMnr8X0EtVuKUHy<+`VKiYoB@ zKp}hlNiPh}G-@@k?w8ob@W;l(X> zKZBfXFcysYSv-@3b|L2<3C59=N6v&l`I=M6`}g#7ru=E-O!!CpIV6lzm_(~n!59cV z_qOTJ`wM7k8hJDQyhZ;I@@9jylvwf)<7rMvb}Y`HEp0VGkqePuuCFbpVy9ehwxT%Q zXhrg^f~ckHr4*)@e0Xo+I)f`*MA9)kM$zb4NKK#jU`8y6we~a`Oc!;FnPRWWOtI;; z!obHnI}EBDip;OZk-TH58GPM2@2|cT`Hj*;o7L84HE^4%Q3*9kVRj^yqF6jg52=!o@cC-#b0>9cA|D&=d!CAFhOKGb4jy?L8~^kq6N2rJ0JVsVHv zNfm5Gn=getLoN4dA_7rre+msJgc)U_r2Rc~Asd`wHHvO60!axiVbHS*ntOU4EILFn z3lxiw+@)t-V%b#ppwOl9tiL>WGDlcj%^|O3UULBH0 z{i&%jyr8TPxq?}9(V0z6r)N|Ao5!EL$I_(HZs67S-*F3cuYN~OEB_9Vjd?tnnKaM0a zZirUiFv~{A{v-37RDqjH&t*O}h z&~_el%>h1(OYdZ>y|iDqB<4ry?a70BBPE{yu-=4-d9}huC}fn#v4?rbov$b$)u)-r z?#u$_VI`uS0kPwW9+gW$wVF^`=1lS^GPe48B#+|?32Cxc-n8DI&RFJj$};605D!^B z&Xl%16$a5>e3HUzQd&sv_DvmGLyWqVEJO?%}`qgD0YdLwda zez@BFaH-G&<-%rh1wXr5WUPoDSkA|pEiV+9nZbY+i5lA_FN|XA+zas-?VhtrHB_7{ zhvj-0dG%5t1dr1}y~N#Ql^b#9NlHM7$Dc#}9--7TY;Zp?I8*bk1RBj3^=Q6`q9Ns- zVdu`;8fCq4g1fjh$z7m zOdH8{Dmi?^K*IA_kk@viZ@&$b%1_fY3MPXoKLgQ|2%71BPR<_}(KFM}Ni5RYUL9Jc zG>fpT%QJEMd=R#(QTx$n8&yAaqpiR#c}-YCfsd8pE4Q)XdUdSLcH;^%&pdz54NI!r zj8@j-u`|{3`BojU?VU`VR&p2TLzpzJs3=NDo*;FSCv9aFx4mjBh{uBKFjQoba9awR zQMpl%v$zHEHyWiZD3^SAPlX}8%bhlCi;1waI^f-6s^cKFJK)Wt)5#!(L!c)F)dkdB z&T46Q5%=m#Ouo$I5|ghmd67whiEKbgWCL>ZZsC#*XiTIn{MnLP?I}&ik1p?)&G!8l zLG}B|y1u9UWmlVzt{1wkdYRPWmY{V98yyOj#NAgiQY(C&<0GAnRC}T~Cf(j1aY#iX z)FgPN@V$loU9l=D-@I+zvVF@>-6oUR?N4%m$@mT)UYr4zslp*~$C}8+W)6CV^o`Sg zz*#7vxNN$YkiG8|ehDvr4OdUE%$oKG{b}f#A3P1>UQWX|fg@%kfP5{oFfnMv3f&Z# z&@IQeeMcsiZhvBAVqjAUp}k~ZYad77cq_6i44NJgQc#6~-rFfk=JPTq^;IOxX^HF;Cqw-8<&#Wm|6owiMeDM6Bqxp8X8ygAEFn z+`T^t7Jm;{NX|0Md2?u2Bq(=nd489kj5Ea|Tp&<-l+9YeXI~Ie;8nHOB#etE=$$&- zmlDp!R8sz`)dS$7ctvI{?cn4&rv@GWPqV+I@h+#eh|7F zt$K-?#;ca29XD$9berqBP-mqp^t;go>e3j`x%g;(ClCb^IqEsv+-6HP8zCAj*HO0| zHmVQ{z6)1fSvBglpdPKb?!~Qg2!CF6M_RhpP*o)`a^wQp)#3D`nwI7^tBuQE75&3#YeKaGM?p+S!AeeEuToOg zSc`aYRcm)VcqJ(r0Ej{0p)s@oPa`_@6Y1`Ik+(A32xhg4S^8y7I<+H19iFVa?WwYN zxk?J7*~T`cR2k0J&Czz?Lxb=@{;FHvK<6M2{xLqT#QH_m3f3RwnCgNIQQh58jT+{K zDz5nPLKznqX4eM|XeE)*9Sy?)yV0u3h{CPLHMSRA_iB(GT!({N3L7;5p|UEqY8q08 zXmYI)1sItZVPu=Fs;9_OwPtkSc&?SJRo81p4S3_r@aRBg1epGS;vAlr3+Y9_)ZDLN@5F1qXRhWA#Qk++jIP`aw5rm9}(Kfrq=A zx8q(8+*;s;grf(wF*KpxCcA?`$HqgCtv!7a2!wbePJw&l9BHpvFU}2!t<5BA&*Z~< zYLqj$LKjH_HJf=@*>L?2!_7XpgwhmjQ$qz+XVO5D*w*{J+O0kbFTal~6xf@gZ2_x# zwhyrf*pda{TuH(Azt_m)$oqCRHB!f{7|pDNL9F)gKT}350UJ3Ha*fLpae#0UZq@i) zIMfd|JmP;a`6k5(ZR-9ah`FZaTi_-o!9Wxy>nyqM(r7DRMgYTwG+19hp&E_o#QHjS zJ#4^!OW65(8<17uQ9~(sc4*}%{`w~FcM&UIK(L_L>$k`eibLb?QBtE{r+x2$aQl`8 z0mphW3cfK~Ya?##6f$@T6VNT6c>iD-n`)_J^&<|%$Y%So^AbPO6c|zgi5%=nMKPl& zguKLxVswaGMv-yibgK!`8^A=J#-j?E>}R58#Y9Cv|A-QrV_=!u;F)2LNeY2C$qBj( zr_`vzzb7*mq=q;A&{ask+I_gfe+L_3#srY?4|EaX>pJibq`GPP2)Y@hPB$B+E1B*X zfMvP}OA9^#So~d!K7iXsH;208>Z?)y)_}Y`gv0K(`(mKEBmx-?L2Uoc7M_VhrkNYlKvg=4D52u8*{|GF~?b%;~eMM z86)@9UpcV%KijwWKRvK_>+1GL?foQ-M(pAvUL9Nh2?DPOep+atI%2FuNKkK(Q$Q0< zk#HL80YVC{=(KDPy#7!NJ=`j^(5Q9T zGf13Bw2F}f@9l&uLdd~Hd$mC>U3Y(B3@Ef8l@iEI5xMGK+rrR<0ieX>oPY}uNiQZ@ z#KUw%mLi2+v4WWos6>E*4H(HqHcw)0d$9T6TVts2e4|W@N*}4MkItAANGd0XrPEk z+Mw$cj#xVTxI&3WhuWs^sYJ#7A*1^Au2DVV`xpirTVEF{VR&MX&`cSu*4n%Dp0+cm zWED@xrh-Duit83?a^N9X*qKH<%VJmwl)I)MFu~LD^zP|F;k8kIP#xZ2p#)=6nt`i=cb5-*s{9ImjhF+=G1-_siBx60t2x}M-MPEZ1L z)*>gjeAmeh*TiDm1pWIjH5uvxuJ8dQdZJwBE)a-1is#fVTc0VB`@ynWYr>1YsUfUJ zIj%#hqtnDKjZ3K0LB!A^-FX=g*vds(9(# zQx~6A+bprh
    TcRkFzb4(s#!cesY$Z!zp%(Guwd#-rlT;Z%(XA%rnTP*M>lGwfs zJ*|F`&olxHbIDfGBBMypQDL^nVnccA*I9);s@_C`vt@MV#8xAWGd=Yar?B4fSl@xU zd`KhwJ}y^W#=^KnO*G>dw8bjAuP}!Aj5b~ix!x`0VE-P{tuW1e7-prwFJ3GA(N-a^ zThpp5X(Uii02jC=BkxG{V$e^w6Bw=}Gs{0CXMWOE_;Hp<{VT(_1uaPj?KHk&q&!=gU!q|MneJ7s)eK~OS&+HbShGF`sY_{-rt4{@5c zCb1<)pGWIt|Ko0N+jINu285t!)5f+$`THCYPXi&8wu*4C>rhxIJP|uk0?N}nJVR>q zKBN}C+|S_(e~euS(2$A?_AaZ8)jWbLc0^%fVgS4KiNJGpF(y6Ck>k0zSEh2^V;fU zc>185L;WA1{um68qo&ctx!QIo%H0}=L745Eg89l+Gz~LpM!R!6la<-qR(Gm1C9#`- z#yEMOx{^}=+L`Q*W6UUj!@6mPc9g5k-I_-vW9o+JWc}=CsDJ$|>vi*&VC-PNldnwH zpVr?eq1K`WjOi=AF@3z_ptVoGYOsCO%O_(Ts!N)ojg!Vn7)R32qUiQ9A18Nj9m0&J zLG2|NUSC7WnR>nhv$OYRrvAuXYkYri4ff)jHb#0Q#S<_O!$1pvcoJHce=p*S4tI>s zbY})eTONikqQ7rufHQJl3~6;v0<@t!aP0t|GH`p4Upj!#aI-}>H7X5x4Fq|r`san-u(!lCOf_BK4+16SQh2S9%zPQxaR^^Aa5O7yumuWaIY zfVkaPYQWX&ee(i{v=3B=#xMj%#oo|)_|Qs~ucJ2 z>FpPX94xVcdw)RL;l}9J^;|k;VV&UoNU}~V?&lkdSRR%N>^pDZa~r9>O0BlK9&S~G z>nkB_kO)veDbXXr9#f1Ksu;iPeG6=Ft-G6Gdpg-I{Z>gCtT_zu2COECMi6$#ZAjKY zNP;!JdVj#l!1sKwuV0WD%UPT`pfQsa=*>_#Sg&%Ai-)!c`X}>p96h!bCf(DBfTjO0 zX5&TdXha6&h=+Cp*7L_K=Sx>-QogOn$^c z*SNQh%}T*BU@rVxVc@=Ku+ZV^0p!fNk*>p zsht=3N{;Su>aiIV(t(^R8ZsTkfEidZY0a81({%As$#~Glc?Fw)u)lJEl7M~YG(hHY zfWfTk>LXuxi(I_1ttEiMv_MQ7Z*$0l@ncQCm)xz$83KaP-rrB#(?d{Dlr`+rEDVKa z5sG%N0Y__R5?2XVNV-IFULF2*_~Bv9nQxli6!Pp2jBmiK)18#|<4T@5Bv8tN$@f-! zGIDOEb-7E%)wckKGCPF?SX_Mze&NsTsr8$qwd%7{>t<4m-emYq8U09kKLQ~S@SB#f zQizyCLvgAN0NI@$uxQ|JI5?<1Tv`O_z&CUt0_F^tXeh!O)Vv5h^}LJ{b4L~Y{$&t` z6@RUVW3~7x4dsyda|v^L-mNp2o?7jLXK|!SKvERXULcXI z;HrB@rYc?TH`f-Tu5>1s2P5V7?@tX-VngEqjjA-|5*Wt0!@bAjlPajebvOzJ;Hs>{ zg;%ZC7}tEw#T#Xu$H~;L_-rF~ zN?Rz2^GsX()fwDeHEdbDf8m127&z!8!1X6=CWSV%Oxd+f=MwOWAFLr@FZ%l*xMxqG znlYWluH# ze5^1TxH2fP03tqJKJpA+OFPS$pn$SFy!!Un<83rzI_$?&R~+S(?O4=Ir}TM=}&g5%MzJ~;sDh2!J5?FeR@jQ6gv(rXH~!n373>g3MY5bx25#H?kMYodLMu zVi&qIAc+-_q^1(f$x-S!uG82`O2(-Zrm5?+&ZBlt+mrm!N80p}HcjT7wx>-`S|?5G zB<*o6yHbC@@7|f&1r{Wo)8vn)AouQ_nLGFK-S2+)d);qqLqkOifB)dio!Wc8-?Dy( z7u|nZT%5uuc)+nN&+_c1Rngye#g=QQlEJsrbXVMpYx7yAnO(_Na*}tE&sXxuXT4mr zurg2?kbEBbVx=hg0`h~ELCFs^ODjW_A;}k;!z;TgyCgq|{77ZQw*1WUsQLwId91P< zwU(OWD|;$?q|^}d6O{?c4>$L&?5pgvt*0$-mpAgV<&9i-D*JIY>W$%Q%-?@KQ#pX^ z-QGB^$L0DhxZdMU;Ce!?58`^Sw-49*j^X;4Tt9^C^tFulnD=cjXDi43gV(Lflz$J>x1*m{92^sj}y-7@*F*eHk_V^!R! z*3{CKs^6-&y+&&ZclYwp|$RbUzwwullWO5Gud6a?6fNPu9F=YpS;5hrVJ1 z&(u2Wvv`yFptk7OYt1I|`I&ah^kE<=kN1aX+AFI~^t9bNi-k-sKIy<_cD4E2AE3l^VU# z*Bo!m+l_a}w%i@}_TcXB+txSX?M0b!>B}DW(A$Uli0y7=0{F>3_Vk39kA4u}vz5Ib zo=KT~-dpi*8Bd7mZe_oh2VNYGG|=bQSN+w`{njxxmI3{ z=W?q2e686a76s*6%PZI0tt-Al`75>NnjaL)_*+!%6?wnjURhzGW}}6ARQcKU@KU=~ zZnVO-d9IXS52c-{qP#obE;l&yE9eB;t*-?kD?>+)m4mg5^=2*54R@6a%T2!)pqfj* zZol1Zwyy$Zr*)mj(WiL~XSx=KYI>mstXwFYnsBFaaV_-AD`=^F(Ju#nI3>04tr=h` z>cL3S=^(7N>H?1hHdh!7o2RJW9VB?tzP$6!{q%-H2_=r zN#8iYdRrzZ842egh0NJ7fmrQg6R6UTQ310i-6}U0Ws(;b>ftp&hlsGSAc(ZEkkkqi zv&OjwT+sd&Xw?DtcD=r)%2zM>t+)XWd=)6R8YZlx;=|oC z%GOjPT#sB%{aiHex2{~NscN$kgwGoxFG1FYFM@?&Y1@I8%i%7)-vo4P9f*t>PkJylRpvYBf6eoJ zZ+g1?uBj8rQ#A_UD1xpslu&XKmPscn%B)w3L24W&Cf&&8MO3I(IVII*f|1nQ26cjpu%m#L=HCs(=ST~U0a5geGGZ(<6 zU9fK1+@$knmEUsJK@?Z_F*(HKekO#4PVPmHFyv-ht)9VEAPwgVc4sW@eO%y{qic~K z60zey<~eiHL)IW%gVTB9ybv?J8336P8tlXkwVME!319G+Vx76Bsb<(0D`+8@&d=owV-^}Z#MCrG%gJj)pp*CG^0@F-cwu0W)&oxPEt!-Xf0_0 zh@)&wver{7Hjlw1+mP9m%m$TgMXVikIo^$cH03&&oLVE@*Fjd+g!~5NOX`u%U}iKp)5G8?2E?HlUZ^gWDIPI*fZCNEY5iXEa@S zF}-ynM_thbd@HHJ64T^y1epzcHRstN-qtdB0IWf$wuXiIG%m)L5y{Mtu zEn#RuKO34|A~1#Z08bc}*H)8}33D8*U~QJ`m)2UB0}xz@R+PZF(Qz$;RRlu~=~dVm zaM$2mV>YG>4Gf;ePsn?Mx#jF>hV>Y@ss=E3#jmx@y2A}H_Sh}K2a_)fjwSs4p@pf|@`K`2gOo~Bl74}c2sf}WK*C})krWmok zV5b;P&9(K02>vB+mR;AreEW@m3=M&Iv^O#v;2dAgd<48BFelS_?7e;yd=aJr!jTM{ zOWv$_${pxu!!t+~FLsRbeh!eE>YN%tI%$}NN8;OknFW`1ucL?_bG|d2j+u`X(Hne6 zQh8Ja$U#jZi~Idqo1PtM2}}%jq<@c_8dO*gf}iblmzfsPYkJ|kgc+L(E@2}OhF#11 zU|PFH|Alh9HIu%O!5 zk%-bL zf^v%0cSDwy{~{!A3JG1q+g3#irD=-pYra`Y@uXs<8fq=8t*i5Q;P=VO#YmT+iy{-f zb=eK~OtJrw1pRh(_ND08TWHdmo0HE0MV2`#R;w#*Z>>pLp;WED2tr{bhkUgPnV?!# zTw#$NMuizF37)U1$h`<*D%w@8$|kF~YZTngf*BCnCy*ot9NBack0y`_od6!U?IU*)clt9T4thDm?h+as_A;1|Dijb%on%TTGa7W1 zwbe67CXEcnd>6E0`LWSzgw^Vg;h~lvfo+|Mo=#0wp+I1v?fAhCWy~j_xK8}IVc(=) z#9DSB?Aj;MQH<1?)1Ap+zh1)}>h;AwnN7PgkZ37@RRfS)xsuUnx{SCaZ{ni`b-Rdv zoddmH?Uw0NVO^E+);4i!5H|&yA4aBA(h~Vi`vX93*9z_R@34XUHlBnS$aQ-YPg?il zNoM_wegf5x>j5=xI-B+ft(J2F^Kl~^OZB#;?}==mnd@ZN!o}n7it@@|ZGy>~%n3lE zq7Y_THtG~Q5|y57HK29(*d_ea>6p{m(+eKM>`o4C zU0&~I%LS@D$)YNPMNueMPck{hL<4MyY7wLmZG5RrUskDxjS$|ouV5RV`5Q0HG(6gV+w4VJJdfQDGdXI*Bk&=rEZOEjw;l(Q_tX7HjruT$i0JXv#sS8l-JUTO(2h$CaTiY9=?8SA+ zWQu)O&ogxV%s5T3#_f&)U#qiEc$so9Taw;V77cv z8f^I`Z_v+sB`^p>-Z1FTP;yN>w_6$Jd-&|~V8fH|QTZP9#z4Vn?S^d;HK10pb-S=3 zjOMd+_ zbt_BIWvLtKMT}ADpC!mzCxbJ9%;E`tIvLBm4 z+A5e7jbE%62-ei9;u2YcayNk0EN+`1(0BMudI~|BddB9}+B%g8R7{((z#`dLYG_R{ zJBb0CJ_#h0zf@BmIs|3*Vi{JfTHse<8-?Z%dL9_GXs&6k^GSFO7J|#Le?#>F%}t}@ zSINK`Gndv}1gn0%vDl#MLaM*u!&amGMOgS`&W^WN!(c%hfuJ;oebe zmNdiFWB!=u!kxiK*biYvEf_VxmZl7;qkI%li%7tn3c*TlbggJ%8OU?|0juN2Yk??r zcFjn4?v@E973|A|!Yl`N)G_R6X0EGKuA0MJn!!nXc8>RinMr94d7wYUCnzAXgaZW+ zy4!SdJM(!2rFtwE1Q|a9vd54~Rf(J6GM6271S$L&E+gkbUGy1vF#H%TL|Mt_n4iqg zy>4$*3bFk(vR{hq&DZVkeBJ&K&1=i;MoWel6{shGeb1}xTBQ|V%y43Mi)VuHiU!S; z(}!d0j2uOQui;~cT*{2trA%kc4Ec5z8cv~%Qws(jcDZHDzzv|sG7YAgS1A~{bDh1Y ztPM1#)^xf!@RI4xW+!v3I526;P%tjL8s)SZRW(typ1?k47m?L%@Kf=wa-h4jy*3uH zc33AuXP4i;LYqSFx$bDH~R`S!Ex>e#4)e~u1JKK#+M5l z*&EJH^9BbVEN-|rTu4Z+=i<55^W5FYUa`~_G8p?IhIrW<*)SL8+2(Zz_2wX86v6>+ zOJPy&+SfD7gIIUDjht6_6$tZ+bu$BpE9&9~=6ZyAE>+IS1rCZ5WCMfwP?09=4f}_k z7hUimg6d2lh&odzl!t73Q`q{bc#@`M>X4o&0m^@jB39>+fwAFnr%pDZ@M;E6Or?c; zIzz~k<=>5u@FLQg@fRRUZDI`2uLF)7PFJ^J93AgRX>VoJi>RbBL;~!4RgFDSA*S$9 zM%<6*dK5xrDD1;^O%s`%lY4Vp&k`_E|0F#d(>((V2N85@zY3(3i|wYT){>S|qQU0& zb~pFBbFADs@RDp%_o+=P=c%tWc)vN-IkfGW*}0OXF@^PeAKQ`%BGH;G=>-uYA7w>v zE+ki7V=*q6D6>*qja&)kfAkAR_suM#0fD$(JD0|E$Vs-C1 zT3Qm#xcW9c>ro<*Ehioel_0xG=DumI*dK#57dl}E-Eyxxn=Zby>XDDy&=OIHRM>De z1!*04#lDfdX?@I=XAo)AXNgV;6ojR*o(r|Npp#UZQ6r!1_F^@Kz@S2HH~_0gTS;6@ zCaz1h8#5F%!~MUemnL$kT}XORCMJB3;(^c_kiBv7+_69{ZH0~ZdCb_0T}m`NDhfmc z8egHIB87?UI%vr|*hI3pqk)t3*SWT;o_HLMs{l_sM-2M*YPGvaV*JX^y)2_1^m3o> z8gP7p}mfxtV_-xj17-Aiok6cZ9TP0_v=xmffS(k|4B6H^() zGB-Ow06SeRgv{efZ=nVqVGS~WLZ{w|%j4*BKy86FSaM2E&K`FPHuYwG2QX>RPwv^O zH<@Ow1fCM*$rG|<4N?AOIVi|k+c4@Gh8(RWVfxNe63%(_#^rZE zNm%Rh==BXrSmfO?5Wjs<;S4-a=i$FxdtXLNyzvb!^BUFz_CJ)11yfK$2&xObMc3!V zqG$*rg+|R&CNF5iI6V>*d71fkYq7DkCSs~s5ffi1R8K>q2zFQoD=^d_X|-F&*<6SF zcI_%En=GHbaIXBWcbs_Gv=@u5AE0er3yA9!T#v?sIvN)|R$jloSY6YCwKo54k*HyR z@0F&H-Muuu1uz6jqEI!CAqxp)r?B$ilmZYhqy|+3lvW@nvk)2q?Y}^mgWCXJv=@oA z4BeiH`(TrxY=ES$eNy}y{13o6o znXQ8>8;w`S-Rc7FWRPN`;GC&G6=EO;;khXZn#!gtXK-!6r3dh;6LJ3FW7 zYtuQN%5q*Cl!ua@@Fm?O@Fl(QAo{)iE{X?bQ$E;CF{(VNjF3HFh!eG2}J5*h!pwnce6^IJ7`FY0pjWz5^q7nr)n6a*D~0j2s(L z0^^jC+mU@^$Dd-?NCUvWjl0gl%)Qx>%z?bHZ+m5Ebv*3(Bja`opC04rbM!9|PX#bj z@JYncC3+@gmVu(U!*7~Oaj(l%Iv|IC3Rr-1YbzIhl^D*RgbE`Xse${t+>Lc z(}`v9HLcPlhYyY)PDR70JL~O&1#83`6|Ns@Nk|O(yxXv^uk<;$UBbnWfQ#Q7jTmsA zui@Mwk#27GRt~DEMvMBXYf%BYDi0JQSG%TjS@?pitm>^xc3=#ff6R0F2@)PchUir_ z1_(G?!Y^h6RKA*lLe;9eiAmyCR(%qs)n8`vDJDO{iK?Pb255sSS5I+j5cSID^X>DAV-tS?0sIQ&8vebU?}!rA!`W zs4yQ?pV-K$4easo?4d;ksmrrA8+km@ck{5Ypboj43qFk}U&522aM**Z-108gcVpxx z)bJ^}+7S1-IXUbk=gYqGCjL4PXu6f?av_gU7*Is=@=NlS60NLUPmV%I4f;?EaoA3H zP$3P1c*M!bY5Mqt8cT_wk+Xz5OQ9fYlp~SGs(1`fR6^$QCj4MW z1L-Un(&-jD`?leX+2>y$4gINS#PHkv&WDeck3ak&9;w2qoR$}5yapUNNd)wo=VlZC zF^}%(HBZC}>5wQ3q4UkzhIsOdp*r!KhJY@R5{otKr?kk~S)$K=A}*m#xEjNmce}1s zdZiC7NVcZdwSig7Pn7VC)QC!^%Ma5$eEeZF149WsPa)N_xugMhWTkz@7+<^I=7^z` zg|!`~*<)Q8lyHvF>(U2a9!Xcy9?Yqy0gd?F*iRv^ewxWGCh3MFd(CHY?>9K9q@Grx zvv=DxY2@nR#t3;bB0_Dy4;ic-tmHKdHcQAcYTR>L;EgwJ58M1_gwOtrMY#q~9Vz!L zav62f%c5MatDKdT%czQ}h3nN;m&_H{DN1R3=td@~ovSh5IdVqM#88$_79H4BO7)y; zIGL}O>Gm}RyXnb}bMo=XzV^EPM8|pJad*$<3wbL6yFE14z}IG%0=;!gqu z|2CnQ;B<#!>Covg&k&Zk1GRT)_CS|2K^iI0oifl>Mb8GTU=)MQfxQh>Ni4#kOPQO5 z2W=kNAIkv>xw%e3<2e+bd|&-_B(K|L^*8X10daRz`9N z^e0g6)9m08WN-{lGn=;cx&tyqUncqY_0sUYC9>8dZyhfV4=cV^$EW8ngR4{c^l_iA zWWhlt4%C&rai1=oZG{Qz9Oa>8^p~K6pFkx&vx@$u)QXTa5=@jiJ2!uO3Fd!rY_dLa zCbGLZa1t8qbJ+7`F5iWUwVU)fbMIjytnex3IFnttn{u2#hX-F}E5tjJZr4$~w+%jA z^{4O=P$&Fm5^urF2rt;>k7z9%$V>{xIaN}Xq9e+w22y$0D_SinZMAl^C1*5u?ll$LTBM4Wu6 z9yFv|j^jfKxJqXy*$`^l3o0SgQ>4UFrEsBL^~TrKi25yhF5%!FNRRYW&dvv`ZGCJj z*)NPZV+eS%2gw+^M<81j+CurH>e!77M^=M|q5kqBOUVlu13(vdA#D_HUOZ0)Sn`Aq zb|TYMdcLE6i4(N-ME7Z)@)l~^0{|YB5y-|6fI3yj`G7i`8(C+_ECoG@>aPK7)aQ`& z@Pk|k#OxV-wBt}FD2Q$boZwz)U%K3Fe+Ff`us7Mh22g=k$7P7Pon0}mP3f(x&*GS7 zRp|Ntv+2GU&Mp|#l=C!9*bkx&A?Ui4aNK07Dxs+PvLX-1Y~%Y^e`bI>I-=L zTOc3V*=Nq3z5@Z7AcP2J=uY?cHg`u7BHg(Q67ut?eJq{{Lqd3O8-&QI@h^BD$yO2~ z!BMp1C5=WByafg%=r7=enM*9;LvX}|po%AXgk^znDq&fQB3uq)3ml4yGE7Z!9z?fN zlG96Z1bY9U=3v1JiTl&0IXy?uQy0_5V%djz-B&_7Qlb?=L8|Dey0Acwcp;|ne`-W) zP?!@BaUZ+dpBHlbR(;dhTz(++xn;! z6k8&qzkYOv5*y_Kvm2zaAiK)JmIVv}^|~Sxz8|ec15_mGBO;&1^;Qv$WsY$X#yW`N zn>n`xzr=Jkq}qqOpvWYV8-^l>;8>DzK-KU|cm_|b()l$64p}js+KEQLJEja4nTu>^ zw7Wxsbd!d2ENx|EQd*txkeWsc)#ivb>E4k&{6!Qw!1l|?fHLiJ-JMv(kzIwXZ~4@dSo1fZ6WJ z03T~_zl9Cgee&G7XKv51SJ(r>5&P{#Z+i*HzVk7LFXO$ZScBm=^f{U_#ruB-m^u2~ zb7#*8X7aGNJ}I@f*6{9xn%vg~H9w3@s@8)_&!yQ+?bB=>#nnw4HUgLGzT}Xd8y~U* zg2L2BlDV7*g2FYpk9`2B8vPS|i7hO0d0+h_Ue7amj7g$0 z>yK&rb>Rn7rjUqM>q0cAL?pxUQXaY!MBBd&j^8@6sej7;Nvmg*T-phd=elt1!1gBZ z0^fcOHGg;;zKts0--d4q_x2?`?WTlrz`f;srQq#{VW9{IAD(#a{${Ye5)2S|m?7vg zl!c2>5kdA?S_j!H8Z!jX$Chvy2KVvC5L}9ey zbGNq#ZbuW~5E&{GA@qbp+yf5rK;$wIVeL&wAZL8+KsYc`?uu|HDnfYdzv;pZ^2exTSK5aDEb&x2f?VCaAt?h#ei|tM?vGMG!~!k>MQ+(z@Fj1+hJp!2$JQXvn<=7O(b;p1 z=?9grK2Ae+4n4u!bo^plG8!J@^Kgy`>IFmrk|+}ZHL_9@c0R<*Od>}xf&{zL53F$Z z(F2eOM+~bnRTjT70+ZOOqXWrEP!Lf*y3qr!Ng;cPa1lJqrO^j*RdCP?r|nHyXjd57 z5$f+WMuwc8qVfa-gANraO$L>W9|G2idllgz!$tKgI8=tpFf|NlCqes6_cY+r=@l){ zl{OUgb$}qzk4yJ;?YhG)-53?Y;7AAs2f*2ccbQCKf(pjN8X%K}Ebj=& z04}Qc0WZYNGkO^ykv?!%=D`RtGmwrn^pQ7!&%g~xX{Zm*psj&G0i>is3==7{&w?N$ z1UN#oF7`WA#-1F<;UIIQYy~lSFhZ;o9f445YN7&*F^)!LtGOtrb#t=_4dHS{Mum78 zML8%oaSRVm^g!$=r@{Jv&lrpC_g`|C`wb@lipjrb@|#FvC*Pf(Z{-6i7JM?^)4GhY zL$eraDgtfO(&811I;jjkA}{nez(UG%5~C}0=SjCP1QFImiTxQ=l0Mqe()ttZrwEy_ zr;Wk8P5RhvQ8hje8q(}y{Kq^$Gx!7)M`;`p_oWf$C=z%!4v-yWlp!&3QeZghxww+J zlrV!FpN;IR^JqeV&5^{$0J7&>02_^BpKLd;_*J4nm1Oj%*!^J?rJVnc8Nt@i%?M~9 zYhmP^J*NhFFTqW{q_~Mbw zo3-Flls|VtD4l#E>6G5?GMXplP`>gIjWcyq2 zOkCl=K+Mv{X2%}KVWFa<9T6M|a_$>$z5ti99C+@rH;V(ryD?`3j{75!E(G_CfmwU| ze;ZouQ9VY$mP^Td8S|!Byf~Eg$Mf7$7$vsXCkVpCz&IP=>s3KN+~c}aoH6b{BcmgFy41Sc+l}_d@kF2fNX52&k^3y*UYo&wNw!;72^|52t!=C{z$e9g zRvclDQ;u-QEQFYEWP#ypLmo(TTwt9ReI0(1Q4wHQEYAu{OS5CMNq7Flbf$yI3ZD&; zi99foRMs|(X9yF(+I69zyv$hQ6#H0)>=kOhfEYd~w=SGGIaSjY$Y-k2Uei6gSPLM$ z$e9xe1yBRyIG@lJQy0Y$ZJTUEYDxqaBjp(C;9tXGEF4+@8)@P_rmiIHP;Vt3GrET;gZvMrExX*mL7;N3j|TLEw4%2 zB3M#Tgk-U%06vI%GA|4b-mg;uq00j$!R5y4Y8(_YKD&X3)%NAu`gD)9XBcaA7b1Tf zaeraB)grQHiBlh*zAvZ1zf%p|v1t{SdC(J36KR7t^}q-;g9TeU&rN^Z%kj-SzpVK* zt`Ob2nVw6G#82wl(zU<|vaMe45kO0ySnyctpi@mlQg(tRB_qus*!CXWk<;*5?c z+Hb~mWwKQ^!iR|B=qjV{)2JM*ufRHufTx&lAd(D%aYWB*Svl=US1u7xar}~X)XES{ zJp}wlWR1o(nEJUJqen)@>UuNHiUEe&8jaZ=&uc-_;yCpN%`hfC*Z~x6U&V2S0PyWv z0C9BHd8o;G0IJL*OPFjHWaY8uWhclax`J3Opz&jc@##%$NQ0i7I*H>jU7qO*{46Ja zNuy+H^(3KPfdHu>y&00m7tGHV94lY;{Z;eZ444z6&xoVLq7MrT=nyP$j4w~QK5QqI z7)Fbui-|7VZZh;veaSSz$L8X#4Y1&?1yX(*G6moP(U==B)kfPK2SqGH+t1K686snaJu{$m~+ zx#l%n$WYwa**zIC9IR?~1J0|}+y+FLD&1IZ^2F2U>@CM=kJau)qT; z=6(_RjLu8^2k6Ux7p+DE3FT7%1=ny{|9yO^|H|YKnEW>;|DDNKnfxIW@e~ss`8X~o z2Q+7Y7cc%1-xh6ksA;)bE#$M9q8(MVv=XCJv0pX=P2GU8@~b3ZcIRWzVZF(JRJeuv2d5(;{v3-Z+o-s_#(Xsq7$ zp@6N*62J;UM5aeM@?n&<>+F>=Z!dq>%7GgY$2KVXW5jLzgu=3o6meOu zNKm$q+rg)B&rzp52kzyW&0Odr9AgfnM=-Y=`I|WF&+u-ziwF$J=Mm6x4kG)&`fKq? zmE~fv3K$LYc@Dz4m`+RK5ZBf6FlygLhj6JEP^6?7i}G;*$Ym?|t*~%o6r%nZVhj8h zYUBIaJH3y(cVh$-cz0aC`*Hm<5qz75+uOE|xA&m@^XM5M61vNKZ#t;$dDD9SF5cgV z_dk`qzhB-5Jf-)AJHM}C2B~=fK}`P`6J;G&|AzR&Z0G)$$O>=b;2QZhWEuA)@oE-I z%riY)F6y80g?szGfc;4Ga8vy&l;;Vtn}Szb3Cd!&AT=XbwxYQ2<@iW0eF9R=W7w1Qyz=1ao&TEJQCs*Tvsy{0Q4k=)_ z?nZ1d4~04GbCh9V&(t+EOv-Vs_~Hx zYYP%n?XyWFCe~O(C1)HSP=aJz6hDR8`T5!T+1a@rbUw2Ekx^1#VX}wG<4oSor@tZ0j-0M0rmPi?Z{K4O!a@NX$d{iVdq5 zeZ-niOWKz1TQ1l-FX?A!Jf9$p8j>r+@~oRwg2* zdzZk`5%79|BUBFqco8jWBH0HhpG|=BpzeOR?9&f08Z6!6IRrL4iCZ@bAR+w_H$eKw zwztwV`@{qi$QgVBo+=<@ZopjXxf0}2PzP2!p08re&D@+Es8W9uMSChDu=(MH3mWMV zS`5#>EvlGiaB*^X+Z?})w|_bT(LK8JqCQR|DaK*L^ocGL8bpB7&rOWW;By2DJ7+na zVp?ZU{|N{d5kSyV0Q84sB_XLFz$GSj6JIhNs$WC9@$_f98XD9M$uBwFPPF4>aR%_J z70{_IZW!l+v2+2e`X$I7vVb?W78Aru)Qvhus&-kDGNL})EMEmVlS86Yop*oB z@4~uZUIyVR#4Sey%t`$K>>-R=Y@|IiLVyr3kK!Y!35=SE<4+>OCkA~zvjw+=X25A& z)*zG}mik%N%_=lGk%KeDvcHGwHFYZMi87R}YYoPT2Gu}1^&+{D8<&U*AjRCUqfDo< z8gpv*@nJF~1q-;P3QU9?NLQp6hf(hHL>OK%Oh`cv4jUE+fgoKI2r^gf4E6MJhv;j< zn4LjgQ5HX*0GDOq&qi@$XD010@F~|w*KdiO<|TW#bNn?pfLI@A-}x%owV^`@-{Bxy z13nUgO|b+ff^!h%4Ii_8$08u9$(q3@_$Cq$aZfkEg+XI;5zY?|BFkRnG6?O^S)>ER z^BcDMFnwe3tD_k_!GTco1lphw?%f+W9*;$1z4&3tBiAY*$AyGNvgvSnNuc`>?h@D+ z;Q+xqIn@1;4bgOj`86xR;dtrAr@{iYAK?Ic^b;X|QUUov+y+sm?GpaEXG~0vR^` zW^pa%Ii((1phjD)y^iNQkDi7u9=}Satp&8>gCkpm{~dMrA-n3Onr6+J9_cufQ;0Mp zx;6aLx~0AwQ>|WNA~Fn-MgMy0Dc-xtQi{x%DOn@Kb(Pp zpOquc@Ni}zp8`I7qTT9&`^LSVaZ-v9P>OFBGW5()tc?+N9@DCkucOK+hnazOLbC_l zZWNj`nh>sqC@(()289W?1^p8TTpv+UbLkjkptw6l_#Kr-GtgcxCEggC|KPJvRcGG& z)Xe+vV*`~@-BK0jy&13_??q0C-~GV3OkYQgqH3}-(jyg;XpG>to{L%L2uJx93;87h zRp;f$nEW7m<9CO_r`Asy4f;tX;LqCR<4*sZ^yZl{{?nkcU*#5Brc*rJ|R- z#4q7`t$g2qx(71=sCAw);PjmCKIcE@{O7-)|1j9Qw`Sq<@BYO`aN(k5{de9Bf5vcg z3g6_1j%6uJ*^xDGe(iZ%?wxrTzfRK)ERAP(0uy}YEp@Svhz zRj;AuanxxLlKSEUTfMHngdR?)OL%$`?OzG4)h{f$GQQ{38<^pj)eKs_s@}z0LVHgA z3VMB0{Utno4Ksa9eFZc93TFC6Wrz0a>*~~DYsndmq=FWw0q2Z5ixyu}FUsG!2QF&7 zAu}RW;^NCPs`C#@YF1tNpgcdL?5o!F+{dKRxoJBa@2#mI4V!m#u(lRzJgL1Kt6mgd zTVD%5wowa@4m4G`6!fCBnTB`MW|FE4S9{{Mu!{k(DsJ~D zD{(JUe9&Gi0MiLih;O_N{ocEJDOycNv*lfiS#*)u3vu7K4Sz3&HUG6{)8^woZ58t!+CX=`*`=Qmh9@?AMrv1>_w18!2?vZ_b+RePxxZTZ4$y(G- zvr-h_AvW{@H2TQWPvhs&6*Y4sRdMV1a@1RnLVr!it6?kkmZxN4}1bl+Zb*V`{_!M`t8(D?gSAgoA}|~R=CEuNuvd*gAeeGleZcLFL;_G%<5by#k_tY5+}Mp(KXM7?k))=5bm(OGb(hPVE@!3N)OZ8n`UFmu&9X{DvUb)VerZoGIl?%ob{%B7KR{dPBv%}rbR zWRUK1W24kdmyW-YRdl!(1+8$poYmS%yPKpzw-tg5*3%F;RUz0f)YNlX{k?9RcjvW^ zb>;#PD0vER3@%7(IW9WE&5(TgG9D#$Tr8&soR0(NleTW){^R4gkUdtyXf3OCg1gNq z>@KG(21mqw@gaUH_zI4W0%MpxIBwIv=ky)r+;sKxedx`;^F8RGdpRH8bNg=6P~KIm z@2V1HbNQyDXHl*wSL)&EJuh|o?tNQT4q5j~pl+1US>Il~;oK|VtMvJ{a^LQkRq3X8 z(E5^f&+B`A`=+PAZ(Fziq+e0gc~!vui5h$80k(^}m4g=HZ`uy17QM5DqrcNH_e&V* zci8gQcTD|FtQUJxwfnX}m!5uP>q+Sw&<7fC-w&v;nZp$e}d0kW@!@UBfF|e$eG=E zWcwR#qtTcyL4H8I>qC6*V#%_xu-of|8hS(@#KY;TK8YXw3NG_|*8&|ZLrkndj;pM6 zC)O&->S>$?QNG?;EdqNr0W-Xt+3n0@o$Um5Pzb8fLy-GAZF1_ebM{3D`?kZ+G+FP zHP~s-gdYA%tL4yxHZOiFsto;FQB~;Ts=OalW3X*%Y7gvyTIi`dtb)C29Cv%rsxJ5Y z)CBJLDp&6It4Z9A=XX!21Gw7f)uQMB$; z&DMN;(v@&$Js1j5;2jA2PUtTNNxS8@R>Br~2m_7Q5H(2{`t2n)7cd+Ib*WEk=!75? zUwY)CqAqB%;rrKC+KG>Uy(Gjae01ScqUOVa#2SD~GRw;aUiRRUInAZ4o*O@{C{Du6n6Cboi>{tG)TzUR<&#we;zpKkW=->@nmCvL12xdjeY{vTf^d-Wfxz; z;y4OaX*7-cP-|B$P5lUsSb?1vq^Z_l#r;Q)zJwn$?`^}|(`@Edo6R4fQf|&{92gqQ zpaPWt4$Fq3Y_P1sIf>Kjs#4Mxyt>G)! z`~U?Ryp6$6uyobhcu6K9!^RU(EOHgE_;L3HYdj`f-b^Wew-E(Yf<7J2% zFBoo>zio`i{!a|4Zx^2Sdu10~6pgaEs@ z(X z2po<+AQpse(GrkgAFEyqvaD;K4nT?Rd6uTI5AL{=7}>y1=CCTlKSU?3$3btn@m63T zP1j{Lg~7HKb36ON$%i?4`KqyiYFoCgzRovQNFW&~XoEzMIr?^Hhw^fpN)xjGb<|17 z_*SU~_Hyud;FAd#W|DK1?6!A6;zZ{NU682BX+js|S*#(}j6}^6`3-W0YvpWw{w#%r zSuD6VA*3|%N@_j^vF~@lhmgs4V7fQvVB?ak^*g*=<7JeR<;5nR8ygq8bYpxlOc6kj zA17TUj!x6G9UkGYiS!@%5pfq{Utn#gF#k@F2yKBI7olsQpd#qG0SO3)<|aJoXck(e zFlh}P2?cdSm_Vij7(ehXhbRT}=PEyT{@D{UFo?`FjH32(*iEDL-yPt?!?Ha)ijUE% zJFvr*lvN~c_QBC2Ar01d!9Sck*iu-pX7i`)RYb47F*)dS@VZ5S#fRkqz0`3-BiiVq zLMGe#J9z$4PP$bPcQZvC00tgP;z(ppy10!TG6=TtF15!WqH!^rVLf5q?wIyqFor11 zV2miEA7j*nD{PW^j3F4Z+zlfb0xL9|f5aiktnKQkWHs->mZwo=PM^VbcKS&Uo`y-Y znbn~FB=muDz1h6g3!?l@rP+jY4)INoMZbVcR=q49Z4hPNVjM^MT|RVAch~h5)_IS& z&c(|zctc3UtZwq6__BHtf&JfxJV_c1Yj&DJXPY!qf z%Nj0Z5gIP5_K4Y{=h$Jw%Vl1+R!q9)^8ZVGi>?oC>v~|P=)a6wJ9y&%Q4|P4{p+Fb zp4!%3E+=*ff{}g($TgE$0KDzfBF+Arp?1BeUhoIZMP$=jwFQh#qC^{^OI2f?K%t^<5 zvBt||dHxpO{xf_fbW*h^U2r$Jdfe4~b8QwTex(y831WYm9FRHPD05MU3&4n`v4Lsx z7M}_Vyf=&mMA32SVWImjtYGWDb@Qo^6-32SKk#$B!n#y`H@pK2G!&N>5n4FQ zuqP1jgzRb1?#XlXW;Y-oLO$UfH;G@=lgQ-2 z;zKJ2`HMEYz!#Q41PlwBr0dvN;OO&VZB_qT*oklB-RZfj7cp3H(N+uGbFoZFqd?Fg zXcEQo&B1U?l%>m%D>OX9;GruXB%QPzjF~7KXXtF-^PCj9)Na!Dzt}a3y4u zvta}D87xK^Kdk*c{x>oJS*aNs`tS(p_0h8dj#k>-G%^cm);<;_8476lXSRHX9IS6V zM{y9e5JOG|pR(){R2!^49MavFU1~HMMc}ms*LFEnGc*3{jgy1cIRg#&C+9=ZD!Fny z8|9-dh;RS}Ml7~{xLoT=qgb+I+?g4Egk26S+0kh%6xm|Ih$!9<00|xv>?lRT{y7&G zqs!@Zw>iBwG^f)_k@PVBg#}qDbT|kC?tl@nHn8&QV;~sHdVKpWynbN_LV?#@3~cc} z`B@$Yoq$qK9K{HW9c?8cW}vEtbVp9-y9WNdDPO(ys)(r z{|Txlr*N^3!!xj}PT4(V*BlSQ?<%894#VMiQy#}VdI~js%cUxuc7(v?o~>%O{;Pno zF_ngmOSEx<=v!0b7f&7YS-@cO5|&`<+btrb_|V|;@DN{q47j}L&#!d9|j5fnrIl#wdjtbDWE#-dHF1E|f3>rYN*{CdY z#U^b1J+v3E6)r4c4F#qo-s$35@!@I=R^%9N1}lOcF0uM{t_XH^8J=duGx$^V{%H#% z>UL;h^4NVZfzOP%joB|x1ib;Y2~!IOSPC>Z*I`5Dnm%7K(+1U+blj1axgE0uH87*h zo&`2*W4{HFo60T%w}e_fXg``yK?EvNM#8sX4nr+6ptNPam~IREDc5EHpJ=Mkq}u?6D~TI<@RU0tg=qU#kcIwhxPW9Cqu1Z% zyolRENy~nQ}`sq&+;AIN^)t?s?;yvNA?1J4F*Mne*~5( z_MDP-r_DVv2o6{fB1&dj*p^I8Sb8DfK_lgnygES_q%LIIqYuVFBa9~_VuZ&bbD(E9 z!(qE6XA}}GYZY5@0*Epm0AS@Js>olFzbB0FrKW;#I!?I+MYV>JQAhulq@|>Y%a|RNF(QcA3NCwds_y~u<;>vhYaN1B?CL)pk*zOf-Z_BB8?0$ z-}DHpk`0aOVhL6U0`KkC$^eoe3!q0D6-;j$7I$m|{EpVlB>};RRM^@`;kX3x9QjBi zQtFII(?zUQ)E1Eq;HmCyO|cjl>ADR97{-#>O`YLvOwpIgi2;=O%P|dOrl26B3yv-l z!^~b9jZbbHjVw;SNOZ@<(G)T?z3Hz*7)+NO{R@;A%%7>Q<~9Yv!3_tXYHq8DIWKmt`Z{mD)NnENjwx4E=z^35c}H_ADnYWX7diq^__7i68{D39RflhHT{PH1o0a#_wSa zBlj=fXuQ(!Pq%1;4UOnqugrWKqDZxkW*w{^Eodm-e65I?xs7m&sv=IB%*~pj_}UtU zI3MC@{6&3F706)MQ-hu{P}AebG()kMhx9+>#6{TOi6nJ}xd6xt>jHHNQcFv&CMBcthW0MvGUw`XV)JyHjird6eVEphmtm&^KZaR{!^URHrC3b(tv zGnkx`35yuvKk79UW1S%acf;v>7mK+U>P@C=Y)unN84!D+OXPRB zPmFE|7lo4J&bPQRte@+ae2Nt6SeQ89RD!9Rzc3tKjGA+UHgB)x?7izq3=)Xx2%Ly? znl(0SLkO_nX)kkPPRV43-hD5qdVpbHMiipm?4Z7UU0{aZkL_ku={E%!QR@*pp zt@PhT8^Eu^-j_`^WERE&;$F+y9<*$QCMVS}1R0?C(5t4w$BvWV!6miyTVRU1vb%5` z@42bH>VPF&xRgl1Q!c{RC-KaCh!8WMNx96-9GZd%OfQ%xd7To1%m`fnw)JCY6G?+G z7OSgck`DN*BlRkqbX#dm5;lV2>{V5BC}U{r7)Y!$T?@VsA8S~G8}|Z~6~SW^4kb|l z8%Rh9m;fszMT6cL<%=Qho>AW|h5 z*Ey&3Yq7t~nB#ifgLL&_t}%QJ#g7|+0cSD70a<=zHje!>fj&a@!dx!UAb`<2lMx9; z7xChJR*d2zVKm!vlbTKKY=u5YWfqWw@^?-iBII6=Wcb; z+CO^b^3{vqm>!1GSc>E0ivePaGAu-w?~c4SXg{&D)-M692&x^;DRrphvokl|gMdwL zyh%Cx)(uSJ976FozGi6p#^?kFfGC`Pd0>~Ab36n}X1LQNWi(4(&;tLEIG- zCd$8%T#zC8T9J5|^nt}+Yr}YNZ-h$VQ6!9fXpd3$(k-Aafn|X#V5FIknv3}iVKJhf zj-x?nJSYCGuJf9V$PzVM!8aq1MmopM+c4FUkP=|`g9-4UL4Bva&A=TJCa^bY=zvY| zFG1E3MBTzQ*sKdw0`Rgx^WAk{h$?3jzSw>4=sq8QVUZ-*pa-u24`hZF<~t5*K-B~y zV!;5yvds^-nyvY#*@8ztH~xby}=A z{Gqlvg>P~Omm=?hDZQb$T2jb+K&AtXbmTU`JV!b&62g(r>&;g}B=ka845jlb%Kmyb zc_nBe%s$Kgo9pKAOz;O7`|32tY;0$jf41%Pz%}tyXF#N0FU$HWw z-e8g?giRNOu+#ti@45bmGfWiUf&#nXGXXLPI*=nK4bd6BdZ z!I5nGboh*Y4D~CBktCqs#f$&I&S}+R_oa&LjWNxq%r~Qt)@%Z?A~#ENzmxu8TW&=a zi15La+UX+rcdr2R6th0)n}G;wT~R>AA{i3Sl@ZLS5-H~ zz!t-J25WeZvIV?v_!no`5L{FPaj1JnrGg=GIHY3?RLDxIS{~~VhGtx{;a^J&RyIR*u@m{%TKW?n3eD{Mbe#IA&Gm{pAT6iy}{8DR+jt}&Rh z8LuSOn#SzF%r(!k5cCcC&;rEBdV?MA!5c6XyaHv^wWddD@(6MrBdcL_R3CtG;4X~ROm8$xM=*djG4b<3 z$GP&9t$V0U#3-@tJ=k#EX^syE&dxwlnIL6O;*4_Tdp0~`mD`TjLw$22>@9<6qBwvu zE071bD*%18Z^N}SZjFfL42K?a5^Of-klvNbX7q;F050_(KpyBX;<8a2(6o>JX_{O5 zN4!vBXxeIKv+$=ZiM%NzRWC^s{hNFu@=c}H&Va2THqt-AWqxdJ zJ=EoCfAbRWs*laZvsTrQi{?whnrBtu$d*KXIJuFC4e_=Z-h=bEi@-joXLZ zsy*)Le~el@4~WIa*+N*D+4yo4FXGfhtB2!iw?n8ZA9eH}@$yf2`KP>y7C}Gqf#i`` z0%Hni@l6yiCLr6v@j2UCW=ficLw;YyMv$$K8ZWM}B6u z*n_-^BU8nmC#K!t+`$9+qZr3}$>f_U(&~ne_q@T&I6*7j+u!?$9i;I z0%SC(JCrzwW3dRPK%|Z4LXFbf3?$OaFH@9oYLLK17j2XWRLOl1LC@}T!Yt5ZxSVHC z*e4I93;<%g^p8QbhI@tmHgQ`xSX@?|UBmtij#Gk}xu)3f@Y!M;V+fRcZ0iE2NEkKK z7&2LCtsvRmAX(z`he5;U1lS>*pyb)f{3NA0Pl+hszd{?t$WQR6G&gr`7TMe;pC0^q z8c*}&`q^oFcG^Lz>aUoYh$~pec>+jQ5j@$L1f`KapO}-@B_1|NG+8*S;AB1=hIA<9 zrh?~^HX|t(av<4k`Or`_nKg{bi<^qWWk4&Uwt9ll_FntumGjNBZ=XN=&c(S4^ZU&x zFmGUwjG5qELzq>VukrOjXVtTCAV?ir?7aPiN&#tnT5j>k3FgcNOUW5heTvU+@p6+F zF&QJ4m{yZj&&Yp;fb#&~<8ApGI>ycSS%G^>S@mjotA{^W+Vrf str: + return sys.getfilesystemencoding() or sys.getdefaultencoding() + + +def _make_text_stream( + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if encoding is None: + encoding = get_best_encoding(stream) + if errors is None: + errors = "replace" + return _NonClosingTextIOWrapper( + stream, + encoding, + errors, + line_buffering=True, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def is_ascii_encoding(encoding: str) -> bool: + """Checks if a given encoding is ascii.""" + try: + return codecs.lookup(encoding).name == "ascii" + except LookupError: + return False + + +def get_best_encoding(stream: t.IO) -> str: + """Returns the default stream encoding if not found.""" + rv = getattr(stream, "encoding", None) or sys.getdefaultencoding() + if is_ascii_encoding(rv): + return "utf-8" + return rv + + +class _NonClosingTextIOWrapper(io.TextIOWrapper): + def __init__( + self, + stream: t.BinaryIO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, + force_writable: bool = False, + **extra: t.Any, + ) -> None: + self._stream = stream = t.cast( + t.BinaryIO, _FixupStream(stream, force_readable, force_writable) + ) + super().__init__(stream, encoding, errors, **extra) + + def __del__(self) -> None: + try: + self.detach() + except Exception: + pass + + def isatty(self) -> bool: + # https://bitbucket.org/pypy/pypy/issue/1803 + return self._stream.isatty() + + +class _FixupStream: + """The new io interface needs more from streams than streams + traditionally implement. As such, this fix-up code is necessary in + some circumstances. + + The forcing of readable and writable flags are there because some tools + put badly patched objects on sys (one such offender are certain version + of jupyter notebook). + """ + + def __init__( + self, + stream: t.BinaryIO, + force_readable: bool = False, + force_writable: bool = False, + ): + self._stream = stream + self._force_readable = force_readable + self._force_writable = force_writable + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._stream, name) + + def read1(self, size: int) -> bytes: + f = getattr(self._stream, "read1", None) + + if f is not None: + return t.cast(bytes, f(size)) + + return self._stream.read(size) + + def readable(self) -> bool: + if self._force_readable: + return True + x = getattr(self._stream, "readable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.read(0) + except Exception: + return False + return True + + def writable(self) -> bool: + if self._force_writable: + return True + x = getattr(self._stream, "writable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.write("") # type: ignore + except Exception: + try: + self._stream.write(b"") + except Exception: + return False + return True + + def seekable(self) -> bool: + x = getattr(self._stream, "seekable", None) + if x is not None: + return t.cast(bool, x()) + try: + self._stream.seek(self._stream.tell()) + except Exception: + return False + return True + + +def _is_binary_reader(stream: t.IO, default: bool = False) -> bool: + try: + return isinstance(stream.read(0), bytes) + except Exception: + return default + # This happens in some cases where the stream was already + # closed. In this case, we assume the default. + + +def _is_binary_writer(stream: t.IO, default: bool = False) -> bool: + try: + stream.write(b"") + except Exception: + try: + stream.write("") + return False + except Exception: + pass + return default + return True + + +def _find_binary_reader(stream: t.IO) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_reader(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_reader(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _find_binary_writer(stream: t.IO) -> t.Optional[t.BinaryIO]: + # We need to figure out if the given stream is already binary. + # This can happen because the official docs recommend detaching + # the streams to get binary streams. Some code might do this, so + # we need to deal with this case explicitly. + if _is_binary_writer(stream, False): + return t.cast(t.BinaryIO, stream) + + buf = getattr(stream, "buffer", None) + + # Same situation here; this time we assume that the buffer is + # actually binary in case it's closed. + if buf is not None and _is_binary_writer(buf, True): + return t.cast(t.BinaryIO, buf) + + return None + + +def _stream_is_misconfigured(stream: t.TextIO) -> bool: + """A stream is misconfigured if its encoding is ASCII.""" + # If the stream does not have an encoding set, we assume it's set + # to ASCII. This appears to happen in certain unittest + # environments. It's not quite clear what the correct behavior is + # but this at least will force Click to recover somehow. + return is_ascii_encoding(getattr(stream, "encoding", None) or "ascii") + + +def _is_compat_stream_attr(stream: t.TextIO, attr: str, value: t.Optional[str]) -> bool: + """A stream attribute is compatible if it is equal to the + desired value or the desired value is unset and the attribute + has a value. + """ + stream_value = getattr(stream, attr, None) + return stream_value == value or (value is None and stream_value is not None) + + +def _is_compatible_text_stream( + stream: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> bool: + """Check if a stream's encoding and errors attributes are + compatible with the desired values. + """ + return _is_compat_stream_attr( + stream, "encoding", encoding + ) and _is_compat_stream_attr(stream, "errors", errors) + + +def _force_correct_text_stream( + text_stream: t.IO, + encoding: t.Optional[str], + errors: t.Optional[str], + is_binary: t.Callable[[t.IO, bool], bool], + find_binary: t.Callable[[t.IO], t.Optional[t.BinaryIO]], + force_readable: bool = False, + force_writable: bool = False, +) -> t.TextIO: + if is_binary(text_stream, False): + binary_reader = t.cast(t.BinaryIO, text_stream) + else: + text_stream = t.cast(t.TextIO, text_stream) + # If the stream looks compatible, and won't default to a + # misconfigured ascii encoding, return it as-is. + if _is_compatible_text_stream(text_stream, encoding, errors) and not ( + encoding is None and _stream_is_misconfigured(text_stream) + ): + return text_stream + + # Otherwise, get the underlying binary reader. + possible_binary_reader = find_binary(text_stream) + + # If that's not possible, silently use the original reader + # and get mojibake instead of exceptions. + if possible_binary_reader is None: + return text_stream + + binary_reader = possible_binary_reader + + # Default errors to replace instead of strict in order to get + # something that works. + if errors is None: + errors = "replace" + + # Wrap the binary stream in a text stream with the correct + # encoding parameters. + return _make_text_stream( + binary_reader, + encoding, + errors, + force_readable=force_readable, + force_writable=force_writable, + ) + + +def _force_correct_text_reader( + text_reader: t.IO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_readable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_reader, + encoding, + errors, + _is_binary_reader, + _find_binary_reader, + force_readable=force_readable, + ) + + +def _force_correct_text_writer( + text_writer: t.IO, + encoding: t.Optional[str], + errors: t.Optional[str], + force_writable: bool = False, +) -> t.TextIO: + return _force_correct_text_stream( + text_writer, + encoding, + errors, + _is_binary_writer, + _find_binary_writer, + force_writable=force_writable, + ) + + +def get_binary_stdin() -> t.BinaryIO: + reader = _find_binary_reader(sys.stdin) + if reader is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdin.") + return reader + + +def get_binary_stdout() -> t.BinaryIO: + writer = _find_binary_writer(sys.stdout) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stdout.") + return writer + + +def get_binary_stderr() -> t.BinaryIO: + writer = _find_binary_writer(sys.stderr) + if writer is None: + raise RuntimeError("Was not able to determine binary stream for sys.stderr.") + return writer + + +def get_text_stdin( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdin, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_reader(sys.stdin, encoding, errors, force_readable=True) + + +def get_text_stdout( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stdout, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stdout, encoding, errors, force_writable=True) + + +def get_text_stderr( + encoding: t.Optional[str] = None, errors: t.Optional[str] = None +) -> t.TextIO: + rv = _get_windows_console_stream(sys.stderr, encoding, errors) + if rv is not None: + return rv + return _force_correct_text_writer(sys.stderr, encoding, errors, force_writable=True) + + +def _wrap_io_open( + file: t.Union[str, os.PathLike, int], + mode: str, + encoding: t.Optional[str], + errors: t.Optional[str], +) -> t.IO: + """Handles not passing ``encoding`` and ``errors`` in binary mode.""" + if "b" in mode: + return open(file, mode) + + return open(file, mode, encoding=encoding, errors=errors) + + +def open_stream( + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, +) -> t.Tuple[t.IO, bool]: + binary = "b" in mode + + # Standard streams first. These are simple because they don't need + # special handling for the atomic flag. It's entirely ignored. + if filename == "-": + if any(m in mode for m in ["w", "a", "x"]): + if binary: + return get_binary_stdout(), False + return get_text_stdout(encoding=encoding, errors=errors), False + if binary: + return get_binary_stdin(), False + return get_text_stdin(encoding=encoding, errors=errors), False + + # Non-atomic writes directly go out through the regular open functions. + if not atomic: + return _wrap_io_open(filename, mode, encoding, errors), True + + # Some usability stuff for atomic writes + if "a" in mode: + raise ValueError( + "Appending to an existing file is not supported, because that" + " would involve an expensive `copy`-operation to a temporary" + " file. Open the file in normal `w`-mode and copy explicitly" + " if that's what you're after." + ) + if "x" in mode: + raise ValueError("Use the `overwrite`-parameter instead.") + if "w" not in mode: + raise ValueError("Atomic writes only make sense with `w`-mode.") + + # Atomic writes are more complicated. They work by opening a file + # as a proxy in the same folder and then using the fdopen + # functionality to wrap it in a Python file. Then we wrap it in an + # atomic file that moves the file over on close. + import errno + import random + + try: + perm: t.Optional[int] = os.stat(filename).st_mode + except OSError: + perm = None + + flags = os.O_RDWR | os.O_CREAT | os.O_EXCL + + if binary: + flags |= getattr(os, "O_BINARY", 0) + + while True: + tmp_filename = os.path.join( + os.path.dirname(filename), + f".__atomic-write{random.randrange(1 << 32):08x}", + ) + try: + fd = os.open(tmp_filename, flags, 0o666 if perm is None else perm) + break + except OSError as e: + if e.errno == errno.EEXIST or ( + os.name == "nt" + and e.errno == errno.EACCES + and os.path.isdir(e.filename) + and os.access(e.filename, os.W_OK) + ): + continue + raise + + if perm is not None: + os.chmod(tmp_filename, perm) # in case perm includes bits in umask + + f = _wrap_io_open(fd, mode, encoding, errors) + af = _AtomicFile(f, tmp_filename, os.path.realpath(filename)) + return t.cast(t.IO, af), True + + +class _AtomicFile: + def __init__(self, f: t.IO, tmp_filename: str, real_filename: str) -> None: + self._f = f + self._tmp_filename = tmp_filename + self._real_filename = real_filename + self.closed = False + + @property + def name(self) -> str: + return self._real_filename + + def close(self, delete: bool = False) -> None: + if self.closed: + return + self._f.close() + os.replace(self._tmp_filename, self._real_filename) + self.closed = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._f, name) + + def __enter__(self) -> "_AtomicFile": + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self.close(delete=exc_type is not None) + + def __repr__(self) -> str: + return repr(self._f) + + +def strip_ansi(value: str) -> str: + return _ansi_re.sub("", value) + + +def _is_jupyter_kernel_output(stream: t.IO) -> bool: + while isinstance(stream, (_FixupStream, _NonClosingTextIOWrapper)): + stream = stream._stream + + return stream.__class__.__module__.startswith("ipykernel.") + + +def should_strip_ansi( + stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None +) -> bool: + if color is None: + if stream is None: + stream = sys.stdin + return not isatty(stream) and not _is_jupyter_kernel_output(stream) + return not color + + +# On Windows, wrap the output streams with colorama to support ANSI +# color codes. +# NOTE: double check is needed so mypy does not analyze this on Linux +if sys.platform.startswith("win") and WIN: + from ._winconsole import _get_windows_console_stream + + def _get_argv_encoding() -> str: + import locale + + return locale.getpreferredencoding() + + _ansi_stream_wrappers: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def auto_wrap_for_ansi( + stream: t.TextIO, color: t.Optional[bool] = None + ) -> t.TextIO: + """Support ANSI color and style codes on Windows by wrapping a + stream with colorama. + """ + try: + cached = _ansi_stream_wrappers.get(stream) + except Exception: + cached = None + + if cached is not None: + return cached + + import colorama + + strip = should_strip_ansi(stream, color) + ansi_wrapper = colorama.AnsiToWin32(stream, strip=strip) + rv = t.cast(t.TextIO, ansi_wrapper.stream) + _write = rv.write + + def _safe_write(s): + try: + return _write(s) + except BaseException: + ansi_wrapper.reset_all() + raise + + rv.write = _safe_write + + try: + _ansi_stream_wrappers[stream] = rv + except Exception: + pass + + return rv + + +else: + + def _get_argv_encoding() -> str: + return getattr(sys.stdin, "encoding", None) or get_filesystem_encoding() + + def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] + ) -> t.Optional[t.TextIO]: + return None + + +def term_len(x: str) -> int: + return len(strip_ansi(x)) + + +def isatty(stream: t.IO) -> bool: + try: + return stream.isatty() + except Exception: + return False + + +def _make_cached_stream_func( + src_func: t.Callable[[], t.TextIO], wrapper_func: t.Callable[[], t.TextIO] +) -> t.Callable[[], t.TextIO]: + cache: t.MutableMapping[t.TextIO, t.TextIO] = WeakKeyDictionary() + + def func() -> t.TextIO: + stream = src_func() + try: + rv = cache.get(stream) + except Exception: + rv = None + if rv is not None: + return rv + rv = wrapper_func() + try: + cache[stream] = rv + except Exception: + pass + return rv + + return func + + +_default_text_stdin = _make_cached_stream_func(lambda: sys.stdin, get_text_stdin) +_default_text_stdout = _make_cached_stream_func(lambda: sys.stdout, get_text_stdout) +_default_text_stderr = _make_cached_stream_func(lambda: sys.stderr, get_text_stderr) + + +binary_streams: t.Mapping[str, t.Callable[[], t.BinaryIO]] = { + "stdin": get_binary_stdin, + "stdout": get_binary_stdout, + "stderr": get_binary_stderr, +} + +text_streams: t.Mapping[ + str, t.Callable[[t.Optional[str], t.Optional[str]], t.TextIO] +] = { + "stdin": get_text_stdin, + "stdout": get_text_stdout, + "stderr": get_text_stderr, +} diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_termui_impl.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_termui_impl.py new file mode 100644 index 00000000..39c1d08f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_termui_impl.py @@ -0,0 +1,718 @@ +""" +This module contains implementations for the termui module. To keep the +import time of Click down, some infrequently used functionality is +placed in this module and only imported as needed. +""" +import contextlib +import math +import os +import sys +import time +import typing as t +from gettext import gettext as _ + +from ._compat import _default_text_stdout +from ._compat import CYGWIN +from ._compat import get_best_encoding +from ._compat import isatty +from ._compat import open_stream +from ._compat import strip_ansi +from ._compat import term_len +from ._compat import WIN +from .exceptions import ClickException +from .utils import echo + +V = t.TypeVar("V") + +if os.name == "nt": + BEFORE_BAR = "\r" + AFTER_BAR = "\n" +else: + BEFORE_BAR = "\r\033[?25l" + AFTER_BAR = "\033[?25h\n" + + +class ProgressBar(t.Generic[V]): + def __init__( + self, + iterable: t.Optional[t.Iterable[V]], + length: t.Optional[int] = None, + fill_char: str = "#", + empty_char: str = " ", + bar_template: str = "%(bar)s", + info_sep: str = " ", + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + label: t.Optional[str] = None, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, + width: int = 30, + ) -> None: + self.fill_char = fill_char + self.empty_char = empty_char + self.bar_template = bar_template + self.info_sep = info_sep + self.show_eta = show_eta + self.show_percent = show_percent + self.show_pos = show_pos + self.item_show_func = item_show_func + self.label = label or "" + if file is None: + file = _default_text_stdout() + self.file = file + self.color = color + self.update_min_steps = update_min_steps + self._completed_intervals = 0 + self.width = width + self.autowidth = width == 0 + + if length is None: + from operator import length_hint + + length = length_hint(iterable, -1) + + if length == -1: + length = None + if iterable is None: + if length is None: + raise TypeError("iterable or length is required") + iterable = t.cast(t.Iterable[V], range(length)) + self.iter = iter(iterable) + self.length = length + self.pos = 0 + self.avg: t.List[float] = [] + self.start = self.last_eta = time.time() + self.eta_known = False + self.finished = False + self.max_width: t.Optional[int] = None + self.entered = False + self.current_item: t.Optional[V] = None + self.is_hidden = not isatty(self.file) + self._last_line: t.Optional[str] = None + + def __enter__(self) -> "ProgressBar": + self.entered = True + self.render_progress() + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self.render_finish() + + def __iter__(self) -> t.Iterator[V]: + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + self.render_progress() + return self.generator() + + def __next__(self) -> V: + # Iteration is defined in terms of a generator function, + # returned by iter(self); use that to define next(). This works + # because `self.iter` is an iterable consumed by that generator, + # so it is re-entry safe. Calling `next(self.generator())` + # twice works and does "what you want". + return next(iter(self)) + + def render_finish(self) -> None: + if self.is_hidden: + return + self.file.write(AFTER_BAR) + self.file.flush() + + @property + def pct(self) -> float: + if self.finished: + return 1.0 + return min(self.pos / (float(self.length or 1) or 1), 1.0) + + @property + def time_per_iteration(self) -> float: + if not self.avg: + return 0.0 + return sum(self.avg) / float(len(self.avg)) + + @property + def eta(self) -> float: + if self.length is not None and not self.finished: + return self.time_per_iteration * (self.length - self.pos) + return 0.0 + + def format_eta(self) -> str: + if self.eta_known: + t = int(self.eta) + seconds = t % 60 + t //= 60 + minutes = t % 60 + t //= 60 + hours = t % 24 + t //= 24 + if t > 0: + return f"{t}d {hours:02}:{minutes:02}:{seconds:02}" + else: + return f"{hours:02}:{minutes:02}:{seconds:02}" + return "" + + def format_pos(self) -> str: + pos = str(self.pos) + if self.length is not None: + pos += f"/{self.length}" + return pos + + def format_pct(self) -> str: + return f"{int(self.pct * 100): 4}%"[1:] + + def format_bar(self) -> str: + if self.length is not None: + bar_length = int(self.pct * self.width) + bar = self.fill_char * bar_length + bar += self.empty_char * (self.width - bar_length) + elif self.finished: + bar = self.fill_char * self.width + else: + chars = list(self.empty_char * (self.width or 1)) + if self.time_per_iteration != 0: + chars[ + int( + (math.cos(self.pos * self.time_per_iteration) / 2.0 + 0.5) + * self.width + ) + ] = self.fill_char + bar = "".join(chars) + return bar + + def format_progress_line(self) -> str: + show_percent = self.show_percent + + info_bits = [] + if self.length is not None and show_percent is None: + show_percent = not self.show_pos + + if self.show_pos: + info_bits.append(self.format_pos()) + if show_percent: + info_bits.append(self.format_pct()) + if self.show_eta and self.eta_known and not self.finished: + info_bits.append(self.format_eta()) + if self.item_show_func is not None: + item_info = self.item_show_func(self.current_item) + if item_info is not None: + info_bits.append(item_info) + + return ( + self.bar_template + % { + "label": self.label, + "bar": self.format_bar(), + "info": self.info_sep.join(info_bits), + } + ).rstrip() + + def render_progress(self) -> None: + import shutil + + if self.is_hidden: + # Only output the label as it changes if the output is not a + # TTY. Use file=stderr if you expect to be piping stdout. + if self._last_line != self.label: + self._last_line = self.label + echo(self.label, file=self.file, color=self.color) + + return + + buf = [] + # Update width in case the terminal has been resized + if self.autowidth: + old_width = self.width + self.width = 0 + clutter_length = term_len(self.format_progress_line()) + new_width = max(0, shutil.get_terminal_size().columns - clutter_length) + if new_width < old_width: + buf.append(BEFORE_BAR) + buf.append(" " * self.max_width) # type: ignore + self.max_width = new_width + self.width = new_width + + clear_width = self.width + if self.max_width is not None: + clear_width = self.max_width + + buf.append(BEFORE_BAR) + line = self.format_progress_line() + line_len = term_len(line) + if self.max_width is None or self.max_width < line_len: + self.max_width = line_len + + buf.append(line) + buf.append(" " * (clear_width - line_len)) + line = "".join(buf) + # Render the line only if it changed. + + if line != self._last_line: + self._last_line = line + echo(line, file=self.file, color=self.color, nl=False) + self.file.flush() + + def make_step(self, n_steps: int) -> None: + self.pos += n_steps + if self.length is not None and self.pos >= self.length: + self.finished = True + + if (time.time() - self.last_eta) < 1.0: + return + + self.last_eta = time.time() + + # self.avg is a rolling list of length <= 7 of steps where steps are + # defined as time elapsed divided by the total progress through + # self.length. + if self.pos: + step = (time.time() - self.start) / self.pos + else: + step = time.time() - self.start + + self.avg = self.avg[-6:] + [step] + + self.eta_known = self.length is not None + + def update(self, n_steps: int, current_item: t.Optional[V] = None) -> None: + """Update the progress bar by advancing a specified number of + steps, and optionally set the ``current_item`` for this new + position. + + :param n_steps: Number of steps to advance. + :param current_item: Optional item to set as ``current_item`` + for the updated position. + + .. versionchanged:: 8.0 + Added the ``current_item`` optional parameter. + + .. versionchanged:: 8.0 + Only render when the number of steps meets the + ``update_min_steps`` threshold. + """ + if current_item is not None: + self.current_item = current_item + + self._completed_intervals += n_steps + + if self._completed_intervals >= self.update_min_steps: + self.make_step(self._completed_intervals) + self.render_progress() + self._completed_intervals = 0 + + def finish(self) -> None: + self.eta_known = False + self.current_item = None + self.finished = True + + def generator(self) -> t.Iterator[V]: + """Return a generator which yields the items added to the bar + during construction, and updates the progress bar *after* the + yielded block returns. + """ + # WARNING: the iterator interface for `ProgressBar` relies on + # this and only works because this is a simple generator which + # doesn't create or manage additional state. If this function + # changes, the impact should be evaluated both against + # `iter(bar)` and `next(bar)`. `next()` in particular may call + # `self.generator()` repeatedly, and this must remain safe in + # order for that interface to work. + if not self.entered: + raise RuntimeError("You need to use progress bars in a with block.") + + if self.is_hidden: + yield from self.iter + else: + for rv in self.iter: + self.current_item = rv + + # This allows show_item_func to be updated before the + # item is processed. Only trigger at the beginning of + # the update interval. + if self._completed_intervals == 0: + self.render_progress() + + yield rv + self.update(1) + + self.finish() + self.render_progress() + + +def pager(generator: t.Iterable[str], color: t.Optional[bool] = None) -> None: + """Decide what method to use for paging through text.""" + stdout = _default_text_stdout() + if not isatty(sys.stdin) or not isatty(stdout): + return _nullpager(stdout, generator, color) + pager_cmd = (os.environ.get("PAGER", None) or "").strip() + if pager_cmd: + if WIN: + return _tempfilepager(generator, pager_cmd, color) + return _pipepager(generator, pager_cmd, color) + if os.environ.get("TERM") in ("dumb", "emacs"): + return _nullpager(stdout, generator, color) + if WIN or sys.platform.startswith("os2"): + return _tempfilepager(generator, "more <", color) + if hasattr(os, "system") and os.system("(less) 2>/dev/null") == 0: + return _pipepager(generator, "less", color) + + import tempfile + + fd, filename = tempfile.mkstemp() + os.close(fd) + try: + if hasattr(os, "system") and os.system(f'more "{filename}"') == 0: + return _pipepager(generator, "more", color) + return _nullpager(stdout, generator, color) + finally: + os.unlink(filename) + + +def _pipepager(generator: t.Iterable[str], cmd: str, color: t.Optional[bool]) -> None: + """Page through text by feeding it to another program. Invoking a + pager through this might support colors. + """ + import subprocess + + env = dict(os.environ) + + # If we're piping to less we might support colors under the + # condition that + cmd_detail = cmd.rsplit("/", 1)[-1].split() + if color is None and cmd_detail[0] == "less": + less_flags = f"{os.environ.get('LESS', '')}{' '.join(cmd_detail[1:])}" + if not less_flags: + env["LESS"] = "-R" + color = True + elif "r" in less_flags or "R" in less_flags: + color = True + + c = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, env=env) + stdin = t.cast(t.BinaryIO, c.stdin) + encoding = get_best_encoding(stdin) + try: + for text in generator: + if not color: + text = strip_ansi(text) + + stdin.write(text.encode(encoding, "replace")) + except (OSError, KeyboardInterrupt): + pass + else: + stdin.close() + + # Less doesn't respect ^C, but catches it for its own UI purposes (aborting + # search or other commands inside less). + # + # That means when the user hits ^C, the parent process (click) terminates, + # but less is still alive, paging the output and messing up the terminal. + # + # If the user wants to make the pager exit on ^C, they should set + # `LESS='-K'`. It's not our decision to make. + while True: + try: + c.wait() + except KeyboardInterrupt: + pass + else: + break + + +def _tempfilepager( + generator: t.Iterable[str], cmd: str, color: t.Optional[bool] +) -> None: + """Page through text by invoking a program on a temporary file.""" + import tempfile + + fd, filename = tempfile.mkstemp() + # TODO: This never terminates if the passed generator never terminates. + text = "".join(generator) + if not color: + text = strip_ansi(text) + encoding = get_best_encoding(sys.stdout) + with open_stream(filename, "wb")[0] as f: + f.write(text.encode(encoding)) + try: + os.system(f'{cmd} "{filename}"') + finally: + os.close(fd) + os.unlink(filename) + + +def _nullpager( + stream: t.TextIO, generator: t.Iterable[str], color: t.Optional[bool] +) -> None: + """Simply print unformatted text. This is the ultimate fallback.""" + for text in generator: + if not color: + text = strip_ansi(text) + stream.write(text) + + +class Editor: + def __init__( + self, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + ) -> None: + self.editor = editor + self.env = env + self.require_save = require_save + self.extension = extension + + def get_editor(self) -> str: + if self.editor is not None: + return self.editor + for key in "VISUAL", "EDITOR": + rv = os.environ.get(key) + if rv: + return rv + if WIN: + return "notepad" + for editor in "sensible-editor", "vim", "nano": + if os.system(f"which {editor} >/dev/null 2>&1") == 0: + return editor + return "vi" + + def edit_file(self, filename: str) -> None: + import subprocess + + editor = self.get_editor() + environ: t.Optional[t.Dict[str, str]] = None + + if self.env: + environ = os.environ.copy() + environ.update(self.env) + + try: + c = subprocess.Popen(f'{editor} "{filename}"', env=environ, shell=True) + exit_code = c.wait() + if exit_code != 0: + raise ClickException( + _("{editor}: Editing failed").format(editor=editor) + ) + except OSError as e: + raise ClickException( + _("{editor}: Editing failed: {e}").format(editor=editor, e=e) + ) from e + + def edit(self, text: t.Optional[t.AnyStr]) -> t.Optional[t.AnyStr]: + import tempfile + + if not text: + data = b"" + elif isinstance(text, (bytes, bytearray)): + data = text + else: + if text and not text.endswith("\n"): + text += "\n" + + if WIN: + data = text.replace("\n", "\r\n").encode("utf-8-sig") + else: + data = text.encode("utf-8") + + fd, name = tempfile.mkstemp(prefix="editor-", suffix=self.extension) + f: t.BinaryIO + + try: + with os.fdopen(fd, "wb") as f: + f.write(data) + + # If the filesystem resolution is 1 second, like Mac OS + # 10.12 Extended, or 2 seconds, like FAT32, and the editor + # closes very fast, require_save can fail. Set the modified + # time to be 2 seconds in the past to work around this. + os.utime(name, (os.path.getatime(name), os.path.getmtime(name) - 2)) + # Depending on the resolution, the exact value might not be + # recorded, so get the new recorded value. + timestamp = os.path.getmtime(name) + + self.edit_file(name) + + if self.require_save and os.path.getmtime(name) == timestamp: + return None + + with open(name, "rb") as f: + rv = f.read() + + if isinstance(text, (bytes, bytearray)): + return rv + + return rv.decode("utf-8-sig").replace("\r\n", "\n") # type: ignore + finally: + os.unlink(name) + + +def open_url(url: str, wait: bool = False, locate: bool = False) -> int: + import subprocess + + def _unquote_file(url: str) -> str: + from urllib.parse import unquote + + if url.startswith("file://"): + url = unquote(url[7:]) + + return url + + if sys.platform == "darwin": + args = ["open"] + if wait: + args.append("-W") + if locate: + args.append("-R") + args.append(_unquote_file(url)) + null = open("/dev/null", "w") + try: + return subprocess.Popen(args, stderr=null).wait() + finally: + null.close() + elif WIN: + if locate: + url = _unquote_file(url.replace('"', "")) + args = f'explorer /select,"{url}"' + else: + url = url.replace('"', "") + wait_str = "/WAIT" if wait else "" + args = f'start {wait_str} "" "{url}"' + return os.system(args) + elif CYGWIN: + if locate: + url = os.path.dirname(_unquote_file(url).replace('"', "")) + args = f'cygstart "{url}"' + else: + url = url.replace('"', "") + wait_str = "-w" if wait else "" + args = f'cygstart {wait_str} "{url}"' + return os.system(args) + + try: + if locate: + url = os.path.dirname(_unquote_file(url)) or "." + else: + url = _unquote_file(url) + c = subprocess.Popen(["xdg-open", url]) + if wait: + return c.wait() + return 0 + except OSError: + if url.startswith(("http://", "https://")) and not locate and not wait: + import webbrowser + + webbrowser.open(url) + return 0 + return 1 + + +def _translate_ch_to_exc(ch: str) -> t.Optional[BaseException]: + if ch == "\x03": + raise KeyboardInterrupt() + + if ch == "\x04" and not WIN: # Unix-like, Ctrl+D + raise EOFError() + + if ch == "\x1a" and WIN: # Windows, Ctrl+Z + raise EOFError() + + return None + + +if WIN: + import msvcrt + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + yield -1 + + def getchar(echo: bool) -> str: + # The function `getch` will return a bytes object corresponding to + # the pressed character. Since Windows 10 build 1803, it will also + # return \x00 when called a second time after pressing a regular key. + # + # `getwch` does not share this probably-bugged behavior. Moreover, it + # returns a Unicode object by default, which is what we want. + # + # Either of these functions will return \x00 or \xe0 to indicate + # a special key, and you need to call the same function again to get + # the "rest" of the code. The fun part is that \u00e0 is + # "latin small letter a with grave", so if you type that on a French + # keyboard, you _also_ get a \xe0. + # E.g., consider the Up arrow. This returns \xe0 and then \x48. The + # resulting Unicode string reads as "a with grave" + "capital H". + # This is indistinguishable from when the user actually types + # "a with grave" and then "capital H". + # + # When \xe0 is returned, we assume it's part of a special-key sequence + # and call `getwch` again, but that means that when the user types + # the \u00e0 character, `getchar` doesn't return until a second + # character is typed. + # The alternative is returning immediately, but that would mess up + # cross-platform handling of arrow keys and others that start with + # \xe0. Another option is using `getch`, but then we can't reliably + # read non-ASCII characters, because return values of `getch` are + # limited to the current 8-bit codepage. + # + # Anyway, Click doesn't claim to do this Right(tm), and using `getwch` + # is doing the right thing in more situations than with `getch`. + func: t.Callable[[], str] + + if echo: + func = msvcrt.getwche # type: ignore + else: + func = msvcrt.getwch # type: ignore + + rv = func() + + if rv in ("\x00", "\xe0"): + # \x00 and \xe0 are control characters that indicate special key, + # see above. + rv += func() + + _translate_ch_to_exc(rv) + return rv + + +else: + import tty + import termios + + @contextlib.contextmanager + def raw_terminal() -> t.Iterator[int]: + f: t.Optional[t.TextIO] + fd: int + + if not isatty(sys.stdin): + f = open("/dev/tty") + fd = f.fileno() + else: + fd = sys.stdin.fileno() + f = None + + try: + old_settings = termios.tcgetattr(fd) + + try: + tty.setraw(fd) + yield fd + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + sys.stdout.flush() + + if f is not None: + f.close() + except termios.error: + pass + + def getchar(echo: bool) -> str: + with raw_terminal() as fd: + ch = os.read(fd, 32).decode(get_best_encoding(sys.stdin), "replace") + + if echo and isatty(sys.stdout): + sys.stdout.write(ch) + + _translate_ch_to_exc(ch) + return ch diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_textwrap.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_textwrap.py new file mode 100644 index 00000000..b47dcbd4 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_textwrap.py @@ -0,0 +1,49 @@ +import textwrap +import typing as t +from contextlib import contextmanager + + +class TextWrapper(textwrap.TextWrapper): + def _handle_long_word( + self, + reversed_chunks: t.List[str], + cur_line: t.List[str], + cur_len: int, + width: int, + ) -> None: + space_left = max(width - cur_len, 1) + + if self.break_long_words: + last = reversed_chunks[-1] + cut = last[:space_left] + res = last[space_left:] + cur_line.append(cut) + reversed_chunks[-1] = res + elif not cur_line: + cur_line.append(reversed_chunks.pop()) + + @contextmanager + def extra_indent(self, indent: str) -> t.Iterator[None]: + old_initial_indent = self.initial_indent + old_subsequent_indent = self.subsequent_indent + self.initial_indent += indent + self.subsequent_indent += indent + + try: + yield + finally: + self.initial_indent = old_initial_indent + self.subsequent_indent = old_subsequent_indent + + def indent_only(self, text: str) -> str: + rv = [] + + for idx, line in enumerate(text.splitlines()): + indent = self.initial_indent + + if idx > 0: + indent = self.subsequent_indent + + rv.append(f"{indent}{line}") + + return "\n".join(rv) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_unicodefun.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_unicodefun.py new file mode 100644 index 00000000..9cb30c38 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_unicodefun.py @@ -0,0 +1,100 @@ +import codecs +import os +from gettext import gettext as _ + + +def _verify_python_env() -> None: + """Ensures that the environment is good for Unicode.""" + try: + from locale import getpreferredencoding + + fs_enc = codecs.lookup(getpreferredencoding()).name + except Exception: + fs_enc = "ascii" + + if fs_enc != "ascii": + return + + extra = [ + _( + "Click will abort further execution because Python was" + " configured to use ASCII as encoding for the environment." + " Consult https://click.palletsprojects.com/unicode-support/" + " for mitigation steps." + ) + ] + + if os.name == "posix": + import subprocess + + try: + rv = subprocess.Popen( + ["locale", "-a"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + encoding="ascii", + errors="replace", + ).communicate()[0] + except OSError: + rv = "" + + good_locales = set() + has_c_utf8 = False + + for line in rv.splitlines(): + locale = line.strip() + + if locale.lower().endswith((".utf-8", ".utf8")): + good_locales.add(locale) + + if locale.lower() in ("c.utf8", "c.utf-8"): + has_c_utf8 = True + + if not good_locales: + extra.append( + _( + "Additional information: on this system no suitable" + " UTF-8 locales were discovered. This most likely" + " requires resolving by reconfiguring the locale" + " system." + ) + ) + elif has_c_utf8: + extra.append( + _( + "This system supports the C.UTF-8 locale which is" + " recommended. You might be able to resolve your" + " issue by exporting the following environment" + " variables:" + ) + ) + extra.append(" export LC_ALL=C.UTF-8\n export LANG=C.UTF-8") + else: + extra.append( + _( + "This system lists some UTF-8 supporting locales" + " that you can pick from. The following suitable" + " locales were discovered: {locales}" + ).format(locales=", ".join(sorted(good_locales))) + ) + + bad_locale = None + + for env_locale in os.environ.get("LC_ALL"), os.environ.get("LANG"): + if env_locale and env_locale.lower().endswith((".utf-8", ".utf8")): + bad_locale = env_locale + + if env_locale is not None: + break + + if bad_locale is not None: + extra.append( + _( + "Click discovered that you exported a UTF-8 locale" + " but the locale system could not pick up from it" + " because it does not exist. The exported locale is" + " {locale!r} but it is not supported." + ).format(locale=bad_locale) + ) + + raise RuntimeError("\n\n".join(extra)) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_winconsole.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_winconsole.py new file mode 100644 index 00000000..6b20df31 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/_winconsole.py @@ -0,0 +1,279 @@ +# This module is based on the excellent work by Adam BartoÅ¡ who +# provided a lot of what went into the implementation here in +# the discussion to issue1602 in the Python bug tracker. +# +# There are some general differences in regards to how this works +# compared to the original patches as we do not need to patch +# the entire interpreter but just work in our little world of +# echo and prompt. +import io +import sys +import time +import typing as t +from ctypes import byref +from ctypes import c_char +from ctypes import c_char_p +from ctypes import c_int +from ctypes import c_ssize_t +from ctypes import c_ulong +from ctypes import c_void_p +from ctypes import POINTER +from ctypes import py_object +from ctypes import Structure +from ctypes.wintypes import DWORD +from ctypes.wintypes import HANDLE +from ctypes.wintypes import LPCWSTR +from ctypes.wintypes import LPWSTR + +from ._compat import _NonClosingTextIOWrapper + +assert sys.platform == "win32" +import msvcrt # noqa: E402 +from ctypes import windll # noqa: E402 +from ctypes import WINFUNCTYPE # noqa: E402 + +c_ssize_p = POINTER(c_ssize_t) + +kernel32 = windll.kernel32 +GetStdHandle = kernel32.GetStdHandle +ReadConsoleW = kernel32.ReadConsoleW +WriteConsoleW = kernel32.WriteConsoleW +GetConsoleMode = kernel32.GetConsoleMode +GetLastError = kernel32.GetLastError +GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) +CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))( + ("CommandLineToArgvW", windll.shell32) +) +LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32)) + +STDIN_HANDLE = GetStdHandle(-10) +STDOUT_HANDLE = GetStdHandle(-11) +STDERR_HANDLE = GetStdHandle(-12) + +PyBUF_SIMPLE = 0 +PyBUF_WRITABLE = 1 + +ERROR_SUCCESS = 0 +ERROR_NOT_ENOUGH_MEMORY = 8 +ERROR_OPERATION_ABORTED = 995 + +STDIN_FILENO = 0 +STDOUT_FILENO = 1 +STDERR_FILENO = 2 + +EOF = b"\x1a" +MAX_BYTES_WRITTEN = 32767 + +try: + from ctypes import pythonapi +except ImportError: + # On PyPy we cannot get buffers so our ability to operate here is + # severely limited. + get_buffer = None +else: + + class Py_buffer(Structure): + _fields_ = [ + ("buf", c_void_p), + ("obj", py_object), + ("len", c_ssize_t), + ("itemsize", c_ssize_t), + ("readonly", c_int), + ("ndim", c_int), + ("format", c_char_p), + ("shape", c_ssize_p), + ("strides", c_ssize_p), + ("suboffsets", c_ssize_p), + ("internal", c_void_p), + ] + + PyObject_GetBuffer = pythonapi.PyObject_GetBuffer + PyBuffer_Release = pythonapi.PyBuffer_Release + + def get_buffer(obj, writable=False): + buf = Py_buffer() + flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE + PyObject_GetBuffer(py_object(obj), byref(buf), flags) + + try: + buffer_type = c_char * buf.len + return buffer_type.from_address(buf.buf) + finally: + PyBuffer_Release(byref(buf)) + + +class _WindowsConsoleRawIOBase(io.RawIOBase): + def __init__(self, handle): + self.handle = handle + + def isatty(self): + super().isatty() + return True + + +class _WindowsConsoleReader(_WindowsConsoleRawIOBase): + def readable(self): + return True + + def readinto(self, b): + bytes_to_be_read = len(b) + if not bytes_to_be_read: + return 0 + elif bytes_to_be_read % 2: + raise ValueError( + "cannot read odd number of bytes from UTF-16-LE encoded console" + ) + + buffer = get_buffer(b, writable=True) + code_units_to_be_read = bytes_to_be_read // 2 + code_units_read = c_ulong() + + rv = ReadConsoleW( + HANDLE(self.handle), + buffer, + code_units_to_be_read, + byref(code_units_read), + None, + ) + if GetLastError() == ERROR_OPERATION_ABORTED: + # wait for KeyboardInterrupt + time.sleep(0.1) + if not rv: + raise OSError(f"Windows error: {GetLastError()}") + + if buffer[0] == EOF: + return 0 + return 2 * code_units_read.value + + +class _WindowsConsoleWriter(_WindowsConsoleRawIOBase): + def writable(self): + return True + + @staticmethod + def _get_error_message(errno): + if errno == ERROR_SUCCESS: + return "ERROR_SUCCESS" + elif errno == ERROR_NOT_ENOUGH_MEMORY: + return "ERROR_NOT_ENOUGH_MEMORY" + return f"Windows error {errno}" + + def write(self, b): + bytes_to_be_written = len(b) + buf = get_buffer(b) + code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2 + code_units_written = c_ulong() + + WriteConsoleW( + HANDLE(self.handle), + buf, + code_units_to_be_written, + byref(code_units_written), + None, + ) + bytes_written = 2 * code_units_written.value + + if bytes_written == 0 and bytes_to_be_written > 0: + raise OSError(self._get_error_message(GetLastError())) + return bytes_written + + +class ConsoleStream: + def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None: + self._text_stream = text_stream + self.buffer = byte_stream + + @property + def name(self) -> str: + return self.buffer.name + + def write(self, x: t.AnyStr) -> int: + if isinstance(x, str): + return self._text_stream.write(x) + try: + self.flush() + except Exception: + pass + return self.buffer.write(x) + + def writelines(self, lines: t.Iterable[t.AnyStr]) -> None: + for line in lines: + self.write(line) + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._text_stream, name) + + def isatty(self) -> bool: + return self.buffer.isatty() + + def __repr__(self): + return f"" + + +def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO: + text_stream = _NonClosingTextIOWrapper( + io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)), + "utf-16-le", + "strict", + line_buffering=True, + ) + return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream)) + + +_stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = { + 0: _get_text_stdin, + 1: _get_text_stdout, + 2: _get_text_stderr, +} + + +def _is_console(f: t.TextIO) -> bool: + if not hasattr(f, "fileno"): + return False + + try: + fileno = f.fileno() + except (OSError, io.UnsupportedOperation): + return False + + handle = msvcrt.get_osfhandle(fileno) + return bool(GetConsoleMode(handle, byref(DWORD()))) + + +def _get_windows_console_stream( + f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str] +) -> t.Optional[t.TextIO]: + if ( + get_buffer is not None + and encoding in {"utf-16-le", None} + and errors in {"strict", None} + and _is_console(f) + ): + func = _stream_factories.get(f.fileno()) + if func is not None: + b = getattr(f, "buffer", None) + + if b is None: + return None + + return func(b) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/core.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/core.py new file mode 100644 index 00000000..f2263544 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/core.py @@ -0,0 +1,2953 @@ +import enum +import errno +import os +import sys +import typing +import typing as t +from collections import abc +from contextlib import contextmanager +from contextlib import ExitStack +from functools import partial +from functools import update_wrapper +from gettext import gettext as _ +from gettext import ngettext +from itertools import repeat + +from . import types +from ._unicodefun import _verify_python_env +from .exceptions import Abort +from .exceptions import BadParameter +from .exceptions import ClickException +from .exceptions import Exit +from .exceptions import MissingParameter +from .exceptions import UsageError +from .formatting import HelpFormatter +from .formatting import join_options +from .globals import pop_context +from .globals import push_context +from .parser import _flag_needs_value +from .parser import OptionParser +from .parser import split_opt +from .termui import confirm +from .termui import prompt +from .termui import style +from .utils import _detect_program_name +from .utils import _expand_args +from .utils import echo +from .utils import make_default_short_help +from .utils import make_str +from .utils import PacifyFlushWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + from .shell_completion import CompletionItem + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +V = t.TypeVar("V") + + +def _complete_visible_commands( + ctx: "Context", incomplete: str +) -> t.Iterator[t.Tuple[str, "Command"]]: + """List all the subcommands of a group that start with the + incomplete value and aren't hidden. + + :param ctx: Invocation context for the group. + :param incomplete: Value being completed. May be empty. + """ + multi = t.cast(MultiCommand, ctx.command) + + for name in multi.list_commands(ctx): + if name.startswith(incomplete): + command = multi.get_command(ctx, name) + + if command is not None and not command.hidden: + yield name, command + + +def _check_multicommand( + base_command: "MultiCommand", cmd_name: str, cmd: "Command", register: bool = False +) -> None: + if not base_command.chain or not isinstance(cmd, MultiCommand): + return + if register: + hint = ( + "It is not possible to add multi commands as children to" + " another multi command that is in chain mode." + ) + else: + hint = ( + "Found a multi command as subcommand to a multi command" + " that is in chain mode. This is not supported." + ) + raise RuntimeError( + f"{hint}. Command {base_command.name!r} is set to chain and" + f" {cmd_name!r} was added as a subcommand but it in itself is a" + f" multi command. ({cmd_name!r} is a {type(cmd).__name__}" + f" within a chained {type(base_command).__name__} named" + f" {base_command.name!r})." + ) + + +def batch(iterable: t.Iterable[V], batch_size: int) -> t.List[t.Tuple[V, ...]]: + return list(zip(*repeat(iter(iterable), batch_size))) + + +@contextmanager +def augment_usage_errors( + ctx: "Context", param: t.Optional["Parameter"] = None +) -> t.Iterator[None]: + """Context manager that attaches extra information to exceptions.""" + try: + yield + except BadParameter as e: + if e.ctx is None: + e.ctx = ctx + if param is not None and e.param is None: + e.param = param + raise + except UsageError as e: + if e.ctx is None: + e.ctx = ctx + raise + + +def iter_params_for_processing( + invocation_order: t.Sequence["Parameter"], + declaration_order: t.Sequence["Parameter"], +) -> t.List["Parameter"]: + """Given a sequence of parameters in the order as should be considered + for processing and an iterable of parameters that exist, this returns + a list in the correct order as they should be processed. + """ + + def sort_key(item: "Parameter") -> t.Tuple[bool, float]: + try: + idx: float = invocation_order.index(item) + except ValueError: + idx = float("inf") + + return not item.is_eager, idx + + return sorted(declaration_order, key=sort_key) + + +class ParameterSource(enum.Enum): + """This is an :class:`~enum.Enum` that indicates the source of a + parameter's value. + + Use :meth:`click.Context.get_parameter_source` to get the + source for a parameter by name. + + .. versionchanged:: 8.0 + Use :class:`~enum.Enum` and drop the ``validate`` method. + + .. versionchanged:: 8.0 + Added the ``PROMPT`` value. + """ + + COMMANDLINE = enum.auto() + """The value was provided by the command line args.""" + ENVIRONMENT = enum.auto() + """The value was provided with an environment variable.""" + DEFAULT = enum.auto() + """Used the default specified by the parameter.""" + DEFAULT_MAP = enum.auto() + """Used a default provided by :attr:`Context.default_map`.""" + PROMPT = enum.auto() + """Used a prompt to confirm a default or provide a value.""" + + +class Context: + """The context is a special internal object that holds state relevant + for the script execution at every single level. It's normally invisible + to commands unless they opt-in to getting access to it. + + The context is useful as it can pass internal objects around and can + control special execution features such as reading data from + environment variables. + + A context can be used as context manager in which case it will call + :meth:`close` on teardown. + + :param command: the command class for this context. + :param parent: the parent context. + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it is usually + the name of the script, for commands below it it's + the name of the script. + :param obj: an arbitrary object of user data. + :param auto_envvar_prefix: the prefix to use for automatic environment + variables. If this is `None` then reading + from environment variables is disabled. This + does not affect manually set environment + variables which are always read. + :param default_map: a dictionary (like object) with default values + for parameters. + :param terminal_width: the width of the terminal. The default is + inherit from parent context. If no context + defines the terminal width then auto + detection will be applied. + :param max_content_width: the maximum width for content rendered by + Click (this currently only affects help + pages). This defaults to 80 characters if + not overridden. In other words: even if the + terminal is larger than that, Click will not + format things wider than 80 characters by + default. In addition to that, formatters might + add some safety mapping on the right. + :param resilient_parsing: if this flag is enabled then Click will + parse without any interactivity or callback + invocation. Default values will also be + ignored. This is useful for implementing + things such as completion support. + :param allow_extra_args: if this is set to `True` then extra arguments + at the end will not raise an error and will be + kept on the context. The default is to inherit + from the command. + :param allow_interspersed_args: if this is set to `False` then options + and arguments cannot be mixed. The + default is to inherit from the command. + :param ignore_unknown_options: instructs click to ignore options it does + not know and keeps them for later + processing. + :param help_option_names: optionally a list of strings that define how + the default help parameter is named. The + default is ``['--help']``. + :param token_normalize_func: an optional function that is used to + normalize tokens (options, choices, + etc.). This for instance can be used to + implement case insensitive behavior. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are used in texts that Click prints which is by + default not the case. This for instance would affect + help output. + :param show_default: Show defaults for all options. If not set, + defaults to the value from a parent context. Overrides an + option's ``show_default`` argument. + + .. versionchanged:: 8.0 + The ``show_default`` parameter defaults to the value from the + parent context. + + .. versionchanged:: 7.1 + Added the ``show_default`` parameter. + + .. versionchanged:: 4.0 + Added the ``color``, ``ignore_unknown_options``, and + ``max_content_width`` parameters. + + .. versionchanged:: 3.0 + Added the ``allow_extra_args`` and ``allow_interspersed_args`` + parameters. + + .. versionchanged:: 2.0 + Added the ``resilient_parsing``, ``help_option_names``, and + ``token_normalize_func`` parameters. + """ + + #: The formatter class to create with :meth:`make_formatter`. + #: + #: .. versionadded:: 8.0 + formatter_class: t.Type["HelpFormatter"] = HelpFormatter + + def __init__( + self, + command: "Command", + parent: t.Optional["Context"] = None, + info_name: t.Optional[str] = None, + obj: t.Optional[t.Any] = None, + auto_envvar_prefix: t.Optional[str] = None, + default_map: t.Optional[t.Dict[str, t.Any]] = None, + terminal_width: t.Optional[int] = None, + max_content_width: t.Optional[int] = None, + resilient_parsing: bool = False, + allow_extra_args: t.Optional[bool] = None, + allow_interspersed_args: t.Optional[bool] = None, + ignore_unknown_options: t.Optional[bool] = None, + help_option_names: t.Optional[t.List[str]] = None, + token_normalize_func: t.Optional[t.Callable[[str], str]] = None, + color: t.Optional[bool] = None, + show_default: t.Optional[bool] = None, + ) -> None: + #: the parent context or `None` if none exists. + self.parent = parent + #: the :class:`Command` for this context. + self.command = command + #: the descriptive information name + self.info_name = info_name + #: Map of parameter names to their parsed values. Parameters + #: with ``expose_value=False`` are not stored. + self.params: t.Dict[str, t.Any] = {} + #: the leftover arguments. + self.args: t.List[str] = [] + #: protected arguments. These are arguments that are prepended + #: to `args` when certain parsing scenarios are encountered but + #: must be never propagated to another arguments. This is used + #: to implement nested parsing. + self.protected_args: t.List[str] = [] + + if obj is None and parent is not None: + obj = parent.obj + + #: the user object stored. + self.obj: t.Any = obj + self._meta: t.Dict[str, t.Any] = getattr(parent, "meta", {}) + + #: A dictionary (-like object) with defaults for parameters. + if ( + default_map is None + and info_name is not None + and parent is not None + and parent.default_map is not None + ): + default_map = parent.default_map.get(info_name) + + self.default_map: t.Optional[t.Dict[str, t.Any]] = default_map + + #: This flag indicates if a subcommand is going to be executed. A + #: group callback can use this information to figure out if it's + #: being executed directly or because the execution flow passes + #: onwards to a subcommand. By default it's None, but it can be + #: the name of the subcommand to execute. + #: + #: If chaining is enabled this will be set to ``'*'`` in case + #: any commands are executed. It is however not possible to + #: figure out which ones. If you require this knowledge you + #: should use a :func:`result_callback`. + self.invoked_subcommand: t.Optional[str] = None + + if terminal_width is None and parent is not None: + terminal_width = parent.terminal_width + + #: The width of the terminal (None is autodetection). + self.terminal_width: t.Optional[int] = terminal_width + + if max_content_width is None and parent is not None: + max_content_width = parent.max_content_width + + #: The maximum width of formatted content (None implies a sensible + #: default which is 80 for most things). + self.max_content_width: t.Optional[int] = max_content_width + + if allow_extra_args is None: + allow_extra_args = command.allow_extra_args + + #: Indicates if the context allows extra args or if it should + #: fail on parsing. + #: + #: .. versionadded:: 3.0 + self.allow_extra_args = allow_extra_args + + if allow_interspersed_args is None: + allow_interspersed_args = command.allow_interspersed_args + + #: Indicates if the context allows mixing of arguments and + #: options or not. + #: + #: .. versionadded:: 3.0 + self.allow_interspersed_args: bool = allow_interspersed_args + + if ignore_unknown_options is None: + ignore_unknown_options = command.ignore_unknown_options + + #: Instructs click to ignore options that a command does not + #: understand and will store it on the context for later + #: processing. This is primarily useful for situations where you + #: want to call into external programs. Generally this pattern is + #: strongly discouraged because it's not possibly to losslessly + #: forward all arguments. + #: + #: .. versionadded:: 4.0 + self.ignore_unknown_options: bool = ignore_unknown_options + + if help_option_names is None: + if parent is not None: + help_option_names = parent.help_option_names + else: + help_option_names = ["--help"] + + #: The names for the help options. + self.help_option_names: t.List[str] = help_option_names + + if token_normalize_func is None and parent is not None: + token_normalize_func = parent.token_normalize_func + + #: An optional normalization function for tokens. This is + #: options, choices, commands etc. + self.token_normalize_func: t.Optional[ + t.Callable[[str], str] + ] = token_normalize_func + + #: Indicates if resilient parsing is enabled. In that case Click + #: will do its best to not cause any failures and default values + #: will be ignored. Useful for completion. + self.resilient_parsing: bool = resilient_parsing + + # If there is no envvar prefix yet, but the parent has one and + # the command on this level has a name, we can expand the envvar + # prefix automatically. + if auto_envvar_prefix is None: + if ( + parent is not None + and parent.auto_envvar_prefix is not None + and self.info_name is not None + ): + auto_envvar_prefix = ( + f"{parent.auto_envvar_prefix}_{self.info_name.upper()}" + ) + else: + auto_envvar_prefix = auto_envvar_prefix.upper() + + if auto_envvar_prefix is not None: + auto_envvar_prefix = auto_envvar_prefix.replace("-", "_") + + self.auto_envvar_prefix: t.Optional[str] = auto_envvar_prefix + + if color is None and parent is not None: + color = parent.color + + #: Controls if styling output is wanted or not. + self.color: t.Optional[bool] = color + + if show_default is None and parent is not None: + show_default = parent.show_default + + #: Show option default values when formatting help text. + self.show_default: t.Optional[bool] = show_default + + self._close_callbacks: t.List[t.Callable[[], t.Any]] = [] + self._depth = 0 + self._parameter_source: t.Dict[str, ParameterSource] = {} + self._exit_stack = ExitStack() + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire CLI + structure. + + .. code-block:: python + + with Context(cli) as ctx: + info = ctx.to_info_dict() + + .. versionadded:: 8.0 + """ + return { + "command": self.command.to_info_dict(self), + "info_name": self.info_name, + "allow_extra_args": self.allow_extra_args, + "allow_interspersed_args": self.allow_interspersed_args, + "ignore_unknown_options": self.ignore_unknown_options, + "auto_envvar_prefix": self.auto_envvar_prefix, + } + + def __enter__(self) -> "Context": + self._depth += 1 + push_context(self) + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self._depth -= 1 + if self._depth == 0: + self.close() + pop_context() + + @contextmanager + def scope(self, cleanup: bool = True) -> t.Iterator["Context"]: + """This helper method can be used with the context object to promote + it to the current thread local (see :func:`get_current_context`). + The default behavior of this is to invoke the cleanup functions which + can be disabled by setting `cleanup` to `False`. The cleanup + functions are typically used for things such as closing file handles. + + If the cleanup is intended the context object can also be directly + used as a context manager. + + Example usage:: + + with ctx.scope(): + assert get_current_context() is ctx + + This is equivalent:: + + with ctx: + assert get_current_context() is ctx + + .. versionadded:: 5.0 + + :param cleanup: controls if the cleanup functions should be run or + not. The default is to run these functions. In + some situations the context only wants to be + temporarily pushed in which case this can be disabled. + Nested pushes automatically defer the cleanup. + """ + if not cleanup: + self._depth += 1 + try: + with self as rv: + yield rv + finally: + if not cleanup: + self._depth -= 1 + + @property + def meta(self) -> t.Dict[str, t.Any]: + """This is a dictionary which is shared with all the contexts + that are nested. It exists so that click utilities can store some + state here if they need to. It is however the responsibility of + that code to manage this dictionary well. + + The keys are supposed to be unique dotted strings. For instance + module paths are a good choice for it. What is stored in there is + irrelevant for the operation of click. However what is important is + that code that places data here adheres to the general semantics of + the system. + + Example usage:: + + LANG_KEY = f'{__name__}.lang' + + def set_language(value): + ctx = get_current_context() + ctx.meta[LANG_KEY] = value + + def get_language(): + return get_current_context().meta.get(LANG_KEY, 'en_US') + + .. versionadded:: 5.0 + """ + return self._meta + + def make_formatter(self) -> HelpFormatter: + """Creates the :class:`~click.HelpFormatter` for the help and + usage output. + + To quickly customize the formatter class used without overriding + this method, set the :attr:`formatter_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`formatter_class` attribute. + """ + return self.formatter_class( + width=self.terminal_width, max_width=self.max_content_width + ) + + def with_resource(self, context_manager: t.ContextManager[V]) -> V: + """Register a resource as if it were used in a ``with`` + statement. The resource will be cleaned up when the context is + popped. + + Uses :meth:`contextlib.ExitStack.enter_context`. It calls the + resource's ``__enter__()`` method and returns the result. When + the context is popped, it closes the stack, which calls the + resource's ``__exit__()`` method. + + To register a cleanup function for something that isn't a + context manager, use :meth:`call_on_close`. Or use something + from :mod:`contextlib` to turn it into a context manager first. + + .. code-block:: python + + @click.group() + @click.option("--name") + @click.pass_context + def cli(ctx): + ctx.obj = ctx.with_resource(connect_db(name)) + + :param context_manager: The context manager to enter. + :return: Whatever ``context_manager.__enter__()`` returns. + + .. versionadded:: 8.0 + """ + return self._exit_stack.enter_context(context_manager) + + def call_on_close(self, f: t.Callable[..., t.Any]) -> t.Callable[..., t.Any]: + """Register a function to be called when the context tears down. + + This can be used to close resources opened during the script + execution. Resources that support Python's context manager + protocol which would be used in a ``with`` statement should be + registered with :meth:`with_resource` instead. + + :param f: The function to execute on teardown. + """ + return self._exit_stack.callback(f) + + def close(self) -> None: + """Invoke all close callbacks registered with + :meth:`call_on_close`, and exit all context managers entered + with :meth:`with_resource`. + """ + self._exit_stack.close() + # In case the context is reused, create a new exit stack. + self._exit_stack = ExitStack() + + @property + def command_path(self) -> str: + """The computed command path. This is used for the ``usage`` + information on the help page. It's automatically created by + combining the info names of the chain of contexts to the root. + """ + rv = "" + if self.info_name is not None: + rv = self.info_name + if self.parent is not None: + parent_command_path = [self.parent.command_path] + + if isinstance(self.parent.command, Command): + for param in self.parent.command.get_params(self): + parent_command_path.extend(param.get_usage_pieces(self)) + + rv = f"{' '.join(parent_command_path)} {rv}" + return rv.lstrip() + + def find_root(self) -> "Context": + """Finds the outermost context.""" + node = self + while node.parent is not None: + node = node.parent + return node + + def find_object(self, object_type: t.Type[V]) -> t.Optional[V]: + """Finds the closest object of a given type.""" + node: t.Optional["Context"] = self + + while node is not None: + if isinstance(node.obj, object_type): + return node.obj + + node = node.parent + + return None + + def ensure_object(self, object_type: t.Type[V]) -> V: + """Like :meth:`find_object` but sets the innermost object to a + new instance of `object_type` if it does not exist. + """ + rv = self.find_object(object_type) + if rv is None: + self.obj = rv = object_type() + return rv + + @typing.overload + def lookup_default( + self, name: str, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @typing.overload + def lookup_default( + self, name: str, call: "te.Literal[False]" = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def lookup_default(self, name: str, call: bool = True) -> t.Optional[t.Any]: + """Get the default for a parameter from :attr:`default_map`. + + :param name: Name of the parameter. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + if self.default_map is not None: + value = self.default_map.get(name) + + if call and callable(value): + return value() + + return value + + return None + + def fail(self, message: str) -> "te.NoReturn": + """Aborts the execution of the program with a specific error + message. + + :param message: the error message to fail with. + """ + raise UsageError(message, self) + + def abort(self) -> "te.NoReturn": + """Aborts the script.""" + raise Abort() + + def exit(self, code: int = 0) -> "te.NoReturn": + """Exits the application with a given exit code.""" + raise Exit(code) + + def get_usage(self) -> str: + """Helper method to get formatted usage string for the current + context and command. + """ + return self.command.get_usage(self) + + def get_help(self) -> str: + """Helper method to get formatted help page for the current + context and command. + """ + return self.command.get_help(self) + + def _make_sub_context(self, command: "Command") -> "Context": + """Create a new context of the same type as this context, but + for a new command. + + :meta private: + """ + return type(self)(command, info_name=command.name, parent=self) + + def invoke( + __self, # noqa: B902 + __callback: t.Union["Command", t.Callable[..., t.Any]], + *args: t.Any, + **kwargs: t.Any, + ) -> t.Any: + """Invokes a command callback in exactly the way it expects. There + are two ways to invoke this method: + + 1. the first argument can be a callback and all other arguments and + keyword arguments are forwarded directly to the function. + 2. the first argument is a click command object. In that case all + arguments are forwarded as well but proper click parameters + (options and click arguments) must be keyword arguments and Click + will fill in defaults. + + Note that before Click 3.2 keyword arguments were not properly filled + in against the intention of this code and no context was created. For + more information about this change and why it was done in a bugfix + release see :ref:`upgrade-to-3.2`. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if :meth:`forward` is called at multiple levels. + """ + if isinstance(__callback, Command): + other_cmd = __callback + + if other_cmd.callback is None: + raise TypeError( + "The given command does not have a callback that can be invoked." + ) + else: + __callback = other_cmd.callback + + ctx = __self._make_sub_context(other_cmd) + + for param in other_cmd.params: + if param.name not in kwargs and param.expose_value: + kwargs[param.name] = param.type_cast_value( # type: ignore + ctx, param.get_default(ctx) + ) + + # Track all kwargs as params, so that forward() will pass + # them on in subsequent calls. + ctx.params.update(kwargs) + else: + ctx = __self + + with augment_usage_errors(__self): + with ctx: + return __callback(*args, **kwargs) + + def forward( + __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any # noqa: B902 + ) -> t.Any: + """Similar to :meth:`invoke` but fills in default keyword + arguments from the current context if the other command expects + it. This cannot invoke callbacks directly, only other commands. + + .. versionchanged:: 8.0 + All ``kwargs`` are tracked in :attr:`params` so they will be + passed if ``forward`` is called at multiple levels. + """ + # Can only forward to other commands, not direct callbacks. + if not isinstance(__cmd, Command): + raise TypeError("Callback is not a command.") + + for param in __self.params: + if param not in kwargs: + kwargs[param] = __self.params[param] + + return __self.invoke(__cmd, *args, **kwargs) + + def set_parameter_source(self, name: str, source: ParameterSource) -> None: + """Set the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + :param name: The name of the parameter. + :param source: A member of :class:`~click.core.ParameterSource`. + """ + self._parameter_source[name] = source + + def get_parameter_source(self, name: str) -> t.Optional[ParameterSource]: + """Get the source of a parameter. This indicates the location + from which the value of the parameter was obtained. + + This can be useful for determining when a user specified a value + on the command line that is the same as the default value. It + will be :attr:`~click.core.ParameterSource.DEFAULT` only if the + value was actually taken from the default. + + :param name: The name of the parameter. + :rtype: ParameterSource + + .. versionchanged:: 8.0 + Returns ``None`` if the parameter was not provided from any + source. + """ + return self._parameter_source.get(name) + + +class BaseCommand: + """The base command implements the minimal API contract of commands. + Most code will never use this as it does not implement a lot of useful + functionality but it can act as the direct subclass of alternative + parsing methods that do not depend on the Click parser. + + For instance, this can be used to bridge Click and other systems like + argparse or docopt. + + Because base commands do not implement a lot of the API that other + parts of Click take for granted, they are not supported for all + operations. For instance, they cannot be used with the decorators + usually and they have no built-in callback system. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + """ + + #: The context class to create with :meth:`make_context`. + #: + #: .. versionadded:: 8.0 + context_class: t.Type[Context] = Context + #: the default for the :attr:`Context.allow_extra_args` flag. + allow_extra_args = False + #: the default for the :attr:`Context.allow_interspersed_args` flag. + allow_interspersed_args = True + #: the default for the :attr:`Context.ignore_unknown_options` flag. + ignore_unknown_options = False + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.Dict[str, t.Any]] = None, + ) -> None: + #: the name the command thinks it has. Upon registering a command + #: on a :class:`Group` the group will default the command name + #: with this information. You should instead use the + #: :class:`Context`\'s :attr:`~Context.info_name` attribute. + self.name = name + + if context_settings is None: + context_settings = {} + + #: an optional dictionary with defaults passed to the context. + self.context_settings: t.Dict[str, t.Any] = context_settings + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. This traverses the entire structure + below this command. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + :param ctx: A :class:`Context` representing this command. + + .. versionadded:: 8.0 + """ + return {"name": self.name} + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def get_usage(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get usage") + + def get_help(self, ctx: Context) -> str: + raise NotImplementedError("Base commands cannot get help") + + def make_context( + self, + info_name: t.Optional[str], + args: t.List[str], + parent: t.Optional[Context] = None, + **extra: t.Any, + ) -> Context: + """This function when given an info name and arguments will kick + off the parsing and create a new :class:`Context`. It does not + invoke the actual command callback though. + + To quickly customize the context class used without overriding + this method, set the :attr:`context_class` attribute. + + :param info_name: the info name for this invocation. Generally this + is the most descriptive name for the script or + command. For the toplevel script it's usually + the name of the script, for commands below it it's + the name of the command. + :param args: the arguments to parse as list of strings. + :param parent: the parent context if available. + :param extra: extra keyword arguments forwarded to the context + constructor. + + .. versionchanged:: 8.0 + Added the :attr:`context_class` attribute. + """ + for key, value in self.context_settings.items(): + if key not in extra: + extra[key] = value + + ctx = self.context_class( + self, info_name=info_name, parent=parent, **extra # type: ignore + ) + + with ctx.scope(cleanup=False): + self.parse_args(ctx, args) + return ctx + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + """Given a context and a list of arguments this creates the parser + and parses the arguments, then modifies the context as necessary. + This is automatically invoked by :meth:`make_context`. + """ + raise NotImplementedError("Base commands do not know how to parse arguments.") + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the command. The default + implementation is raising a not implemented error. + """ + raise NotImplementedError("Base commands are not invokable by default") + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of chained multi-commands. + + Any command could be part of a chained multi-command, so sibling + commands are valid at any point during command completion. Other + command classes will return more completions. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + while ctx.parent is not None: + ctx = ctx.parent + + if isinstance(ctx.command, MultiCommand) and ctx.command.chain: + results.extend( + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + if name not in ctx.protected_args + ) + + return results + + @typing.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: "te.Literal[True]" = True, + **extra: t.Any, + ) -> "te.NoReturn": + ... + + @typing.overload + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = ..., + **extra: t.Any, + ) -> t.Any: + ... + + def main( + self, + args: t.Optional[t.Sequence[str]] = None, + prog_name: t.Optional[str] = None, + complete_var: t.Optional[str] = None, + standalone_mode: bool = True, + windows_expand_args: bool = True, + **extra: t.Any, + ) -> t.Any: + """This is the way to invoke a script with all the bells and + whistles as a command line application. This will always terminate + the application after a call. If this is not wanted, ``SystemExit`` + needs to be caught. + + This method is also available by directly calling the instance of + a :class:`Command`. + + :param args: the arguments that should be used for parsing. If not + provided, ``sys.argv[1:]`` is used. + :param prog_name: the program name that should be used. By default + the program name is constructed by taking the file + name from ``sys.argv[0]``. + :param complete_var: the environment variable that controls the + bash completion support. The default is + ``"__COMPLETE"`` with prog_name in + uppercase. + :param standalone_mode: the default behavior is to invoke the script + in standalone mode. Click will then + handle exceptions and convert them into + error messages and the function will never + return but shut down the interpreter. If + this is set to `False` they will be + propagated to the caller and the return + value of this function is the return value + of :meth:`invoke`. + :param windows_expand_args: Expand glob patterns, user dir, and + env vars in command line args on Windows. + :param extra: extra keyword arguments are forwarded to the context + constructor. See :class:`Context` for more information. + + .. versionchanged:: 8.0.1 + Added the ``windows_expand_args`` parameter to allow + disabling command line arg expansion on Windows. + + .. versionchanged:: 8.0 + When taking arguments from ``sys.argv`` on Windows, glob + patterns, user dir, and env vars are expanded. + + .. versionchanged:: 3.0 + Added the ``standalone_mode`` parameter. + """ + # Verify that the environment is configured correctly, or reject + # further execution to avoid a broken script. + _verify_python_env() + + if args is None: + args = sys.argv[1:] + + if os.name == "nt" and windows_expand_args: + args = _expand_args(args) + else: + args = list(args) + + if prog_name is None: + prog_name = _detect_program_name() + + # Process shell completion requests and exit early. + self._main_shell_completion(extra, prog_name, complete_var) + + try: + try: + with self.make_context(prog_name, args, **extra) as ctx: + rv = self.invoke(ctx) + if not standalone_mode: + return rv + # it's not safe to `ctx.exit(rv)` here! + # note that `rv` may actually contain data like "1" which + # has obvious effects + # more subtle case: `rv=[None, None]` can come out of + # chained commands which all returned `None` -- so it's not + # even always obvious that `rv` indicates success/failure + # by its truthiness/falsiness + ctx.exit() + except (EOFError, KeyboardInterrupt): + echo(file=sys.stderr) + raise Abort() from None + except ClickException as e: + if not standalone_mode: + raise + e.show() + sys.exit(e.exit_code) + except OSError as e: + if e.errno == errno.EPIPE: + sys.stdout = t.cast(t.TextIO, PacifyFlushWrapper(sys.stdout)) + sys.stderr = t.cast(t.TextIO, PacifyFlushWrapper(sys.stderr)) + sys.exit(1) + else: + raise + except Exit as e: + if standalone_mode: + sys.exit(e.exit_code) + else: + # in non-standalone mode, return the exit code + # note that this is only reached if `self.invoke` above raises + # an Exit explicitly -- thus bypassing the check there which + # would return its result + # the results of non-standalone execution may therefore be + # somewhat ambiguous: if there are codepaths which lead to + # `ctx.exit(1)` and to `return 1`, the caller won't be able to + # tell the difference between the two + return e.exit_code + except Abort: + if not standalone_mode: + raise + echo(_("Aborted!"), file=sys.stderr) + sys.exit(1) + + def _main_shell_completion( + self, + ctx_args: t.Dict[str, t.Any], + prog_name: str, + complete_var: t.Optional[str] = None, + ) -> None: + """Check if the shell is asking for tab completion, process + that, then exit early. Called from :meth:`main` before the + program is invoked. + + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. Defaults to + ``_{PROG_NAME}_COMPLETE``. + """ + if complete_var is None: + complete_var = f"_{prog_name}_COMPLETE".replace("-", "_").upper() + + instruction = os.environ.get(complete_var) + + if not instruction: + return + + from .shell_completion import shell_complete + + rv = shell_complete(self, ctx_args, prog_name, complete_var, instruction) + sys.exit(rv) + + def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any: + """Alias for :meth:`main`.""" + return self.main(*args, **kwargs) + + +class Command(BaseCommand): + """Commands are the basic building block of command line interfaces in + Click. A basic command handles command line parsing and might dispatch + more parsing to commands nested below it. + + .. versionchanged:: 2.0 + Added the `context_settings` parameter. + .. versionchanged:: 8.0 + Added repr showing the command name + .. versionchanged:: 7.1 + Added the `no_args_is_help` parameter. + + :param name: the name of the command to use unless a group overrides it. + :param context_settings: an optional dictionary with defaults that are + passed to the context object. + :param callback: the callback to invoke. This is optional. + :param params: the parameters to register with this command. This can + be either :class:`Option` or :class:`Argument` objects. + :param help: the help string to use for this command. + :param epilog: like the help string but it's printed at the end of the + help page after everything else. + :param short_help: the short help to use for this command. This is + shown on the command listing of the parent command. + :param add_help_option: by default each command registers a ``--help`` + option. This can be disabled by this parameter. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is disabled by default. + If enabled this will add ``--help`` as argument + if no arguments are passed + :param hidden: hide this command from help outputs. + + :param deprecated: issues a message indicating that + the command is deprecated. + """ + + def __init__( + self, + name: t.Optional[str], + context_settings: t.Optional[t.Dict[str, t.Any]] = None, + callback: t.Optional[t.Callable[..., t.Any]] = None, + params: t.Optional[t.List["Parameter"]] = None, + help: t.Optional[str] = None, + epilog: t.Optional[str] = None, + short_help: t.Optional[str] = None, + options_metavar: t.Optional[str] = "[OPTIONS]", + add_help_option: bool = True, + no_args_is_help: bool = False, + hidden: bool = False, + deprecated: bool = False, + ) -> None: + super().__init__(name, context_settings) + #: the callback to execute when the command fires. This might be + #: `None` in which case nothing happens. + self.callback = callback + #: the list of parameters for this command in the order they + #: should show up in the help page and execute. Eager parameters + #: will automatically be handled before non eager ones. + self.params: t.List["Parameter"] = params or [] + + # if a form feed (page break) is found in the help text, truncate help + # text to the content preceding the first form feed + if help and "\f" in help: + help = help.split("\f", 1)[0] + + self.help = help + self.epilog = epilog + self.options_metavar = options_metavar + self.short_help = short_help + self.add_help_option = add_help_option + self.no_args_is_help = no_args_is_help + self.hidden = hidden + self.deprecated = deprecated + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + info_dict.update( + params=[param.to_info_dict() for param in self.get_params(ctx)], + help=self.help, + epilog=self.epilog, + short_help=self.short_help, + hidden=self.hidden, + deprecated=self.deprecated, + ) + return info_dict + + def get_usage(self, ctx: Context) -> str: + """Formats the usage line into a string and returns it. + + Calls :meth:`format_usage` internally. + """ + formatter = ctx.make_formatter() + self.format_usage(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_params(self, ctx: Context) -> t.List["Parameter"]: + rv = self.params + help_option = self.get_help_option(ctx) + + if help_option is not None: + rv = [*rv, help_option] + + return rv + + def format_usage(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the usage line into the formatter. + + This is a low-level method called by :meth:`get_usage`. + """ + pieces = self.collect_usage_pieces(ctx) + formatter.write_usage(ctx.command_path, " ".join(pieces)) + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + """Returns all the pieces that go into the usage line and returns + it as a list of strings. + """ + rv = [self.options_metavar] if self.options_metavar else [] + + for param in self.get_params(ctx): + rv.extend(param.get_usage_pieces(ctx)) + + return rv + + def get_help_option_names(self, ctx: Context) -> t.List[str]: + """Returns the names for the help option.""" + all_names = set(ctx.help_option_names) + for param in self.params: + all_names.difference_update(param.opts) + all_names.difference_update(param.secondary_opts) + return list(all_names) + + def get_help_option(self, ctx: Context) -> t.Optional["Option"]: + """Returns the help option object.""" + help_options = self.get_help_option_names(ctx) + + if not help_options or not self.add_help_option: + return None + + def show_help(ctx: Context, param: "Parameter", value: str) -> None: + if value and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + return Option( + help_options, + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help=_("Show this message and exit."), + ) + + def make_parser(self, ctx: Context) -> OptionParser: + """Creates the underlying option parser for this command.""" + parser = OptionParser(ctx) + for param in self.get_params(ctx): + param.add_to_parser(parser, ctx) + return parser + + def get_help(self, ctx: Context) -> str: + """Formats the help into a string and returns it. + + Calls :meth:`format_help` internally. + """ + formatter = ctx.make_formatter() + self.format_help(ctx, formatter) + return formatter.getvalue().rstrip("\n") + + def get_short_help_str(self, limit: int = 45) -> str: + """Gets short help for the command or makes it by shortening the + long help string. + """ + text = self.short_help or "" + + if not text and self.help: + text = make_default_short_help(self.help, limit) + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + return text.strip() + + def format_help(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help into the formatter if it exists. + + This is a low-level method called by :meth:`get_help`. + + This calls the following methods: + + - :meth:`format_usage` + - :meth:`format_help_text` + - :meth:`format_options` + - :meth:`format_epilog` + """ + self.format_usage(ctx, formatter) + self.format_help_text(ctx, formatter) + self.format_options(ctx, formatter) + self.format_epilog(ctx, formatter) + + def format_help_text(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the help text to the formatter if it exists.""" + text = self.help or "" + + if self.deprecated: + text = _("(Deprecated) {text}").format(text=text) + + if text: + formatter.write_paragraph() + + with formatter.indentation(): + formatter.write_text(text) + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes all the options into the formatter if they exist.""" + opts = [] + for param in self.get_params(ctx): + rv = param.get_help_record(ctx) + if rv is not None: + opts.append(rv) + + if opts: + with formatter.section(_("Options")): + formatter.write_dl(opts) + + def format_epilog(self, ctx: Context, formatter: HelpFormatter) -> None: + """Writes the epilog into the formatter if it exists.""" + if self.epilog: + formatter.write_paragraph() + with formatter.indentation(): + formatter.write_text(self.epilog) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + parser = self.make_parser(ctx) + opts, args, param_order = parser.parse_args(args=args) + + for param in iter_params_for_processing(param_order, self.get_params(ctx)): + value, args = param.handle_parse_result(ctx, opts, args) + + if args and not ctx.allow_extra_args and not ctx.resilient_parsing: + ctx.fail( + ngettext( + "Got unexpected extra argument ({args})", + "Got unexpected extra arguments ({args})", + len(args), + ).format(args=" ".join(map(str, args))) + ) + + ctx.args = args + return args + + def invoke(self, ctx: Context) -> t.Any: + """Given a context, this invokes the attached callback (if it exists) + in the right way. + """ + if self.deprecated: + message = _( + "DeprecationWarning: The command {name!r} is deprecated." + ).format(name=self.name) + echo(style(message, fg="red"), err=True) + + if self.callback is not None: + return ctx.invoke(self.callback, **ctx.params) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options and chained multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results: t.List["CompletionItem"] = [] + + if incomplete and not incomplete[0].isalnum(): + for param in self.get_params(ctx): + if ( + not isinstance(param, Option) + or param.hidden + or ( + not param.multiple + and ctx.get_parameter_source(param.name) # type: ignore + is ParameterSource.COMMANDLINE + ) + ): + continue + + results.extend( + CompletionItem(name, help=param.help) + for name in [*param.opts, *param.secondary_opts] + if name.startswith(incomplete) + ) + + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class MultiCommand(Command): + """A multi command is the basic implementation of a command that + dispatches to subcommands. The most common version is the + :class:`Group`. + + :param invoke_without_command: this controls how the multi command itself + is invoked. By default it's only invoked + if a subcommand is provided. + :param no_args_is_help: this controls what happens if no arguments are + provided. This option is enabled by default if + `invoke_without_command` is disabled or disabled + if it's enabled. If enabled this will add + ``--help`` as argument if no arguments are + passed. + :param subcommand_metavar: the string that is used in the documentation + to indicate the subcommand place. + :param chain: if this is set to `True` chaining of multiple subcommands + is enabled. This restricts the form of commands in that + they cannot have optional arguments but it allows + multiple commands to be chained together. + :param result_callback: The result callback to attach to this multi + command. This can be set or changed later with the + :meth:`result_callback` decorator. + """ + + allow_extra_args = True + allow_interspersed_args = False + + def __init__( + self, + name: t.Optional[str] = None, + invoke_without_command: bool = False, + no_args_is_help: t.Optional[bool] = None, + subcommand_metavar: t.Optional[str] = None, + chain: bool = False, + result_callback: t.Optional[t.Callable[..., t.Any]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if no_args_is_help is None: + no_args_is_help = not invoke_without_command + + self.no_args_is_help = no_args_is_help + self.invoke_without_command = invoke_without_command + + if subcommand_metavar is None: + if chain: + subcommand_metavar = "COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]..." + else: + subcommand_metavar = "COMMAND [ARGS]..." + + self.subcommand_metavar = subcommand_metavar + self.chain = chain + # The result callback that is stored. This can be set or + # overridden with the :func:`result_callback` decorator. + self._result_callback = result_callback + + if self.chain: + for param in self.params: + if isinstance(param, Argument) and not param.required: + raise RuntimeError( + "Multi commands in chain mode cannot have" + " optional arguments." + ) + + def to_info_dict(self, ctx: Context) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict(ctx) + commands = {} + + for name in self.list_commands(ctx): + command = self.get_command(ctx, name) + + if command is None: + continue + + sub_ctx = ctx._make_sub_context(command) + + with sub_ctx.scope(cleanup=False): + commands[name] = command.to_info_dict(sub_ctx) + + info_dict.update(commands=commands, chain=self.chain) + return info_dict + + def collect_usage_pieces(self, ctx: Context) -> t.List[str]: + rv = super().collect_usage_pieces(ctx) + rv.append(self.subcommand_metavar) + return rv + + def format_options(self, ctx: Context, formatter: HelpFormatter) -> None: + super().format_options(ctx, formatter) + self.format_commands(ctx, formatter) + + def result_callback(self, replace: bool = False) -> t.Callable[[F], F]: + """Adds a result callback to the command. By default if a + result callback is already registered this will chain them but + this can be disabled with the `replace` parameter. The result + callback is invoked with the return value of the subcommand + (or the list of return values from all subcommands if chaining + is enabled) as well as the parameters as they would be passed + to the main callback. + + Example:: + + @click.group() + @click.option('-i', '--input', default=23) + def cli(input): + return 42 + + @cli.result_callback() + def process_result(result, input): + return result + input + + :param replace: if set to `True` an already existing result + callback will be removed. + + .. versionchanged:: 8.0 + Renamed from ``resultcallback``. + + .. versionadded:: 3.0 + """ + + def decorator(f: F) -> F: + old_callback = self._result_callback + + if old_callback is None or replace: + self._result_callback = f + return f + + def function(__value, *args, **kwargs): # type: ignore + inner = old_callback(__value, *args, **kwargs) # type: ignore + return f(inner, *args, **kwargs) + + self._result_callback = rv = update_wrapper(t.cast(F, function), f) + return rv + + return decorator + + def resultcallback(self, replace: bool = False) -> t.Callable[[F], F]: + import warnings + + warnings.warn( + "'resultcallback' has been renamed to 'result_callback'." + " The old name will be removed in Click 8.1.", + DeprecationWarning, + stacklevel=2, + ) + return self.result_callback(replace=replace) + + def format_commands(self, ctx: Context, formatter: HelpFormatter) -> None: + """Extra format methods for multi methods that adds all the commands + after the options. + """ + commands = [] + for subcommand in self.list_commands(ctx): + cmd = self.get_command(ctx, subcommand) + # What is this, the tool lied about a command. Ignore it + if cmd is None: + continue + if cmd.hidden: + continue + + commands.append((subcommand, cmd)) + + # allow for 3 times the default spacing + if len(commands): + limit = formatter.width - 6 - max(len(cmd[0]) for cmd in commands) + + rows = [] + for subcommand, cmd in commands: + help = cmd.get_short_help_str(limit) + rows.append((subcommand, help)) + + if rows: + with formatter.section(_("Commands")): + formatter.write_dl(rows) + + def parse_args(self, ctx: Context, args: t.List[str]) -> t.List[str]: + if not args and self.no_args_is_help and not ctx.resilient_parsing: + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + rest = super().parse_args(ctx, args) + + if self.chain: + ctx.protected_args = rest + ctx.args = [] + elif rest: + ctx.protected_args, ctx.args = rest[:1], rest[1:] + + return ctx.args + + def invoke(self, ctx: Context) -> t.Any: + def _process_result(value: t.Any) -> t.Any: + if self._result_callback is not None: + value = ctx.invoke(self._result_callback, value, **ctx.params) + return value + + if not ctx.protected_args: + if self.invoke_without_command: + # No subcommand was invoked, so the result callback is + # invoked with None for regular groups, or an empty list + # for chained groups. + with ctx: + super().invoke(ctx) + return _process_result([] if self.chain else None) + ctx.fail(_("Missing command.")) + + # Fetch args back out + args = [*ctx.protected_args, *ctx.args] + ctx.args = [] + ctx.protected_args = [] + + # If we're not in chain mode, we only allow the invocation of a + # single command but we also inform the current context about the + # name of the command to invoke. + if not self.chain: + # Make sure the context is entered so we do not clean up + # resources until the result processor has worked. + with ctx: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + ctx.invoked_subcommand = cmd_name + super().invoke(ctx) + sub_ctx = cmd.make_context(cmd_name, args, parent=ctx) + with sub_ctx: + return _process_result(sub_ctx.command.invoke(sub_ctx)) + + # In chain mode we create the contexts step by step, but after the + # base command has been invoked. Because at that point we do not + # know the subcommands yet, the invoked subcommand attribute is + # set to ``*`` to inform the command that subcommands are executed + # but nothing else. + with ctx: + ctx.invoked_subcommand = "*" if args else None + super().invoke(ctx) + + # Otherwise we make every single context and invoke them in a + # chain. In that case the return value to the result processor + # is the list of all invoked subcommand's results. + contexts = [] + while args: + cmd_name, cmd, args = self.resolve_command(ctx, args) + assert cmd is not None + sub_ctx = cmd.make_context( + cmd_name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + ) + contexts.append(sub_ctx) + args, sub_ctx.args = sub_ctx.args, [] + + rv = [] + for sub_ctx in contexts: + with sub_ctx: + rv.append(sub_ctx.command.invoke(sub_ctx)) + return _process_result(rv) + + def resolve_command( + self, ctx: Context, args: t.List[str] + ) -> t.Tuple[t.Optional[str], t.Optional[Command], t.List[str]]: + cmd_name = make_str(args[0]) + original_cmd_name = cmd_name + + # Get the command + cmd = self.get_command(ctx, cmd_name) + + # If we can't find the command but there is a normalization + # function available, we try with that one. + if cmd is None and ctx.token_normalize_func is not None: + cmd_name = ctx.token_normalize_func(cmd_name) + cmd = self.get_command(ctx, cmd_name) + + # If we don't find the command we want to show an error message + # to the user that it was not provided. However, there is + # something else we should do: if the first argument looks like + # an option we want to kick off parsing again for arguments to + # resolve things like --help which now should go to the main + # place. + if cmd is None and not ctx.resilient_parsing: + if split_opt(cmd_name)[0]: + self.parse_args(ctx, ctx.args) + ctx.fail(_("No such command {name!r}.").format(name=original_cmd_name)) + return cmd_name if cmd else None, cmd, args[1:] + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + """Given a context and a command name, this returns a + :class:`Command` object if it exists or returns `None`. + """ + raise NotImplementedError + + def list_commands(self, ctx: Context) -> t.List[str]: + """Returns a list of subcommand names in the order they should + appear. + """ + return [] + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. Looks + at the names of options, subcommands, and chained + multi-commands. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + results = [ + CompletionItem(name, help=command.get_short_help_str()) + for name, command in _complete_visible_commands(ctx, incomplete) + ] + results.extend(super().shell_complete(ctx, incomplete)) + return results + + +class Group(MultiCommand): + """A group allows a command to have subcommands attached. This is + the most common way to implement nesting in Click. + + :param name: The name of the group command. + :param commands: A dict mapping names to :class:`Command` objects. + Can also be a list of :class:`Command`, which will use + :attr:`Command.name` to create the dict. + :param attrs: Other command arguments described in + :class:`MultiCommand`, :class:`Command`, and + :class:`BaseCommand`. + + .. versionchanged:: 8.0 + The ``commmands`` argument can be a list of command objects. + """ + + #: If set, this is used by the group's :meth:`command` decorator + #: as the default :class:`Command` class. This is useful to make all + #: subcommands use a custom command class. + #: + #: .. versionadded:: 8.0 + command_class: t.Optional[t.Type[Command]] = None + + #: If set, this is used by the group's :meth:`group` decorator + #: as the default :class:`Group` class. This is useful to make all + #: subgroups use a custom group class. + #: + #: If set to the special value :class:`type` (literally + #: ``group_class = type``), this group's class will be used as the + #: default class. This makes a custom group class continue to make + #: custom groups. + #: + #: .. versionadded:: 8.0 + group_class: t.Optional[t.Union[t.Type["Group"], t.Type[type]]] = None + # Literal[type] isn't valid, so use Type[type] + + def __init__( + self, + name: t.Optional[str] = None, + commands: t.Optional[t.Union[t.Dict[str, Command], t.Sequence[Command]]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + + if commands is None: + commands = {} + elif isinstance(commands, abc.Sequence): + commands = {c.name: c for c in commands if c.name is not None} + + #: The registered subcommands by their exported names. + self.commands: t.Dict[str, Command] = commands + + def add_command(self, cmd: Command, name: t.Optional[str] = None) -> None: + """Registers another :class:`Command` with this group. If the name + is not provided, the name of the command is used. + """ + name = name or cmd.name + if name is None: + raise TypeError("Command has no name.") + _check_multicommand(self, name, cmd, register=True) + self.commands[name] = cmd + + def command( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], Command]: + """A shortcut decorator for declaring and attaching a command to + the group. This takes the same arguments as :func:`command` and + immediately registers the created command with this group by + calling :meth:`add_command`. + + To customize the command class used, set the + :attr:`command_class` attribute. + + .. versionchanged:: 8.0 + Added the :attr:`command_class` attribute. + """ + from .decorators import command + + if self.command_class is not None and "cls" not in kwargs: + kwargs["cls"] = self.command_class + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd = command(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def group( + self, *args: t.Any, **kwargs: t.Any + ) -> t.Callable[[t.Callable[..., t.Any]], "Group"]: + """A shortcut decorator for declaring and attaching a group to + the group. This takes the same arguments as :func:`group` and + immediately registers the created group with this group by + calling :meth:`add_command`. + + To customize the group class used, set the :attr:`group_class` + attribute. + + .. versionchanged:: 8.0 + Added the :attr:`group_class` attribute. + """ + from .decorators import group + + if self.group_class is not None and "cls" not in kwargs: + if self.group_class is type: + kwargs["cls"] = type(self) + else: + kwargs["cls"] = self.group_class + + def decorator(f: t.Callable[..., t.Any]) -> "Group": + cmd = group(*args, **kwargs)(f) + self.add_command(cmd) + return cmd + + return decorator + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + return self.commands.get(cmd_name) + + def list_commands(self, ctx: Context) -> t.List[str]: + return sorted(self.commands) + + +class CommandCollection(MultiCommand): + """A command collection is a multi command that merges multiple multi + commands together into one. This is a straightforward implementation + that accepts a list of different multi commands as sources and + provides all the commands for each of them. + """ + + def __init__( + self, + name: t.Optional[str] = None, + sources: t.Optional[t.List[MultiCommand]] = None, + **attrs: t.Any, + ) -> None: + super().__init__(name, **attrs) + #: The list of registered multi commands. + self.sources: t.List[MultiCommand] = sources or [] + + def add_source(self, multi_cmd: MultiCommand) -> None: + """Adds a new multi command to the chain dispatcher.""" + self.sources.append(multi_cmd) + + def get_command(self, ctx: Context, cmd_name: str) -> t.Optional[Command]: + for source in self.sources: + rv = source.get_command(ctx, cmd_name) + + if rv is not None: + if self.chain: + _check_multicommand(self, cmd_name, rv) + + return rv + + return None + + def list_commands(self, ctx: Context) -> t.List[str]: + rv: t.Set[str] = set() + + for source in self.sources: + rv.update(source.list_commands(ctx)) + + return sorted(rv) + + +def _check_iter(value: t.Any) -> t.Iterator[t.Any]: + """Check if the value is iterable but not a string. Raises a type + error, or return an iterator over the value. + """ + if isinstance(value, str): + raise TypeError + + return iter(value) + + +class Parameter: + r"""A parameter to a command comes in two versions: they are either + :class:`Option`\s or :class:`Argument`\s. Other subclasses are currently + not supported by design as some of the internals for parsing are + intentionally not finalized. + + Some settings are supported by both options and arguments. + + :param param_decls: the parameter declarations for this option or + argument. This is a list of flags or argument + names. + :param type: the type that should be used. Either a :class:`ParamType` + or a Python type. The later is converted into the former + automatically if supported. + :param required: controls if this is optional or not. + :param default: the default value if omitted. This can also be a callable, + in which case it's invoked when the default is needed + without any arguments. + :param callback: A function to further process or validate the value + after type conversion. It is called as ``f(ctx, param, value)`` + and must return the value. It is called for all sources, + including prompts. + :param nargs: the number of arguments to match. If not ``1`` the return + value is a tuple instead of single value. The default for + nargs is ``1`` (except if the type is a tuple, then it's + the arity of the tuple). If ``nargs=-1``, all remaining + parameters are collected. + :param metavar: how the value is represented in the help page. + :param expose_value: if this is `True` then the value is passed onwards + to the command callback and stored on the context, + otherwise it's skipped. + :param is_eager: eager values are processed before non eager ones. This + should not be set for arguments or it will inverse the + order of processing. + :param envvar: a string or list of strings that are environment variables + that should be checked. + :param shell_complete: A function that returns custom shell + completions. Used instead of the param's type completion if + given. Takes ``ctx, param, incomplete`` and must return a list + of :class:`~click.shell_completion.CompletionItem` or a list of + strings. + + .. versionchanged:: 8.0 + ``process_value`` validates required parameters and bounded + ``nargs``, and invokes the parameter callback before returning + the value. This allows the callback to validate prompts. + ``full_process_value`` is removed. + + .. versionchanged:: 8.0 + ``autocompletion`` is renamed to ``shell_complete`` and has new + semantics described above. The old name is deprecated and will + be removed in 8.1, until then it will be wrapped to match the + new requirements. + + .. versionchanged:: 8.0 + For ``multiple=True, nargs>1``, the default must be a list of + tuples. + + .. versionchanged:: 8.0 + Setting a default is no longer required for ``nargs>1``, it will + default to ``None``. ``multiple=True`` or ``nargs=-1`` will + default to ``()``. + + .. versionchanged:: 7.1 + Empty environment variables are ignored rather than taking the + empty string value. This makes it possible for scripts to clear + variables if they can't unset them. + + .. versionchanged:: 2.0 + Changed signature for parameter callback to also be passed the + parameter. The old callback format will still work, but it will + raise a warning to give you a chance to migrate the code easier. + """ + + param_type_name = "parameter" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + required: bool = False, + default: t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]] = None, + callback: t.Optional[t.Callable[[Context, "Parameter", t.Any], t.Any]] = None, + nargs: t.Optional[int] = None, + multiple: bool = False, + metavar: t.Optional[str] = None, + expose_value: bool = True, + is_eager: bool = False, + envvar: t.Optional[t.Union[str, t.Sequence[str]]] = None, + shell_complete: t.Optional[ + t.Callable[ + [Context, "Parameter", str], + t.Union[t.List["CompletionItem"], t.List[str]], + ] + ] = None, + autocompletion: t.Optional[ + t.Callable[ + [Context, t.List[str], str], t.List[t.Union[t.Tuple[str, str], str]] + ] + ] = None, + ) -> None: + self.name, self.opts, self.secondary_opts = self._parse_decls( + param_decls or (), expose_value + ) + self.type = types.convert_type(type, default) + + # Default nargs to what the type tells us if we have that + # information available. + if nargs is None: + if self.type.is_composite: + nargs = self.type.arity + else: + nargs = 1 + + self.required = required + self.callback = callback + self.nargs = nargs + self.multiple = multiple + self.expose_value = expose_value + self.default = default + self.is_eager = is_eager + self.metavar = metavar + self.envvar = envvar + + if autocompletion is not None: + import warnings + + warnings.warn( + "'autocompletion' is renamed to 'shell_complete'. The old name is" + " deprecated and will be removed in Click 8.1. See the docs about" + " 'Parameter' for information about new behavior.", + DeprecationWarning, + stacklevel=2, + ) + + def shell_complete( + ctx: Context, param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + from click.shell_completion import CompletionItem + + out = [] + + for c in autocompletion(ctx, [], incomplete): # type: ignore + if isinstance(c, tuple): + c = CompletionItem(c[0], help=c[1]) + elif isinstance(c, str): + c = CompletionItem(c) + + if c.value.startswith(incomplete): + out.append(c) + + return out + + self._custom_shell_complete = shell_complete + + if __debug__: + if self.type.is_composite and nargs != self.type.arity: + raise ValueError( + f"'nargs' must be {self.type.arity} (or None) for" + f" type {self.type!r}, but it was {nargs}." + ) + + # Skip no default or callable default. + check_default = default if not callable(default) else None + + if check_default is not None: + if multiple: + try: + # Only check the first value against nargs. + check_default = next(_check_iter(check_default), None) + except TypeError: + raise ValueError( + "'default' must be a list when 'multiple' is true." + ) from None + + # Can be None for multiple with empty default. + if nargs != 1 and check_default is not None: + try: + _check_iter(check_default) + except TypeError: + if multiple: + message = ( + "'default' must be a list of lists when 'multiple' is" + " true and 'nargs' != 1." + ) + else: + message = "'default' must be a list when 'nargs' != 1." + + raise ValueError(message) from None + + if nargs > 1 and len(check_default) != nargs: + subject = "item length" if multiple else "length" + raise ValueError( + f"'default' {subject} must match nargs={nargs}." + ) + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + return { + "name": self.name, + "param_type_name": self.param_type_name, + "opts": self.opts, + "secondary_opts": self.secondary_opts, + "type": self.type.to_info_dict(), + "required": self.required, + "nargs": self.nargs, + "multiple": self.multiple, + "default": self.default, + "envvar": self.envvar, + } + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.name}>" + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + raise NotImplementedError() + + @property + def human_readable_name(self) -> str: + """Returns the human readable name of this parameter. This is the + same as the name for options, but the metavar for arguments. + """ + return self.name # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + + metavar = self.type.get_metavar(self) + + if metavar is None: + metavar = self.type.name.upper() + + if self.nargs != 1: + metavar += "..." + + return metavar + + @typing.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @typing.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + """Get the default for the parameter. Tries + :meth:`Context.lookup_default` first, then the local default. + + :param ctx: Current context. + :param call: If the default is a callable, call it. Disable to + return the callable instead. + + .. versionchanged:: 8.0.2 + Type casting is no longer performed when getting a default. + + .. versionchanged:: 8.0.1 + Type casting can fail in resilient parsing mode. Invalid + defaults will not prevent showing help text. + + .. versionchanged:: 8.0 + Looks at ``ctx.default_map`` first. + + .. versionchanged:: 8.0 + Added the ``call`` parameter. + """ + value = ctx.lookup_default(self.name, call=False) # type: ignore + + if value is None: + value = self.default + + if call and callable(value): + value = value() + + return value + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + raise NotImplementedError() + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, t.Any] + ) -> t.Tuple[t.Any, ParameterSource]: + value = opts.get(self.name) # type: ignore + source = ParameterSource.COMMANDLINE + + if value is None: + value = self.value_from_envvar(ctx) + source = ParameterSource.ENVIRONMENT + + if value is None: + value = ctx.lookup_default(self.name) # type: ignore + source = ParameterSource.DEFAULT_MAP + + if value is None: + value = self.get_default(ctx) + source = ParameterSource.DEFAULT + + return value, source + + def type_cast_value(self, ctx: Context, value: t.Any) -> t.Any: + """Convert and validate a value against the option's + :attr:`type`, :attr:`multiple`, and :attr:`nargs`. + """ + if value is None: + return () if self.multiple or self.nargs == -1 else None + + def check_iter(value: t.Any) -> t.Iterator: + try: + return _check_iter(value) + except TypeError: + # This should only happen when passing in args manually, + # the parser should construct an iterable when parsing + # the command line. + raise BadParameter( + _("Value must be an iterable."), ctx=ctx, param=self + ) from None + + if self.nargs == 1 or self.type.is_composite: + convert: t.Callable[[t.Any], t.Any] = partial( + self.type, param=self, ctx=ctx + ) + elif self.nargs == -1: + + def convert(value: t.Any) -> t.Tuple: + return tuple(self.type(x, self, ctx) for x in check_iter(value)) + + else: # nargs > 1 + + def convert(value: t.Any) -> t.Tuple: + value = tuple(check_iter(value)) + + if len(value) != self.nargs: + raise BadParameter( + ngettext( + "Takes {nargs} values but 1 was given.", + "Takes {nargs} values but {len} were given.", + len(value), + ).format(nargs=self.nargs, len=len(value)), + ctx=ctx, + param=self, + ) + + return tuple(self.type(x, self, ctx) for x in value) + + if self.multiple: + return tuple(convert(x) for x in check_iter(value)) + + return convert(value) + + def value_is_missing(self, value: t.Any) -> bool: + if value is None: + return True + + if (self.nargs != 1 or self.multiple) and value == (): + return True + + return False + + def process_value(self, ctx: Context, value: t.Any) -> t.Any: + value = self.type_cast_value(ctx, value) + + if self.required and self.value_is_missing(value): + raise MissingParameter(ctx=ctx, param=self) + + if self.callback is not None: + value = self.callback(ctx, self, value) + + return value + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + if self.envvar is None: + return None + + if isinstance(self.envvar, str): + rv = os.environ.get(self.envvar) + + if rv: + return rv + else: + for envvar in self.envvar: + rv = os.environ.get(envvar) + + if rv: + return rv + + return None + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is not None and self.nargs != 1: + rv = self.type.split_envvar_value(rv) + + return rv + + def handle_parse_result( + self, ctx: Context, opts: t.Mapping[str, t.Any], args: t.List[str] + ) -> t.Tuple[t.Any, t.List[str]]: + with augment_usage_errors(ctx, param=self): + value, source = self.consume_value(ctx, opts) + ctx.set_parameter_source(self.name, source) # type: ignore + + try: + value = self.process_value(ctx, value) + except Exception: + if not ctx.resilient_parsing: + raise + + value = None + + if self.expose_value: + ctx.params[self.name] = value # type: ignore + + return value, args + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + pass + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [] + + def get_error_hint(self, ctx: Context) -> str: + """Get a stringified version of the param for use in error messages to + indicate which param caused the error. + """ + hint_list = self.opts or [self.human_readable_name] + return " / ".join(f"'{x}'" for x in hint_list) + + def shell_complete(self, ctx: Context, incomplete: str) -> t.List["CompletionItem"]: + """Return a list of completions for the incomplete value. If a + ``shell_complete`` function was given during init, it is used. + Otherwise, the :attr:`type` + :meth:`~click.types.ParamType.shell_complete` function is used. + + :param ctx: Invocation context for this command. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + if self._custom_shell_complete is not None: + results = self._custom_shell_complete(ctx, self, incomplete) + + if results and isinstance(results[0], str): + from click.shell_completion import CompletionItem + + results = [CompletionItem(c) for c in results] + + return t.cast(t.List["CompletionItem"], results) + + return self.type.shell_complete(ctx, self, incomplete) + + +class Option(Parameter): + """Options are usually optional values on the command line and + have some extra features that arguments don't have. + + All other parameters are passed onwards to the parameter constructor. + + :param show_default: controls if the default value should be shown on the + help page. Normally, defaults are not shown. If this + value is a string, it shows the string instead of the + value. This is particularly useful for dynamic options. + :param show_envvar: controls if an environment variable should be shown on + the help page. Normally, environment variables + are not shown. + :param prompt: if set to `True` or a non empty string then the user will be + prompted for input. If set to `True` the prompt will be the + option name capitalized. + :param confirmation_prompt: Prompt a second time to confirm the + value if it was prompted for. Can be set to a string instead of + ``True`` to customize the message. + :param prompt_required: If set to ``False``, the user will be + prompted for input only when the option was specified as a flag + without a value. + :param hide_input: if this is `True` then the input on the prompt will be + hidden from the user. This is useful for password + input. + :param is_flag: forces this option to act as a flag. The default is + auto detection. + :param flag_value: which value should be used for this flag if it's + enabled. This is set to a boolean automatically if + the option string contains a slash to mark two options. + :param multiple: if this is set to `True` then the argument is accepted + multiple times and recorded. This is similar to ``nargs`` + in how it works but supports arbitrary number of + arguments. + :param count: this flag makes an option increment an integer. + :param allow_from_autoenv: if this is enabled then the value of this + parameter will be pulled from an environment + variable in case a prefix is defined on the + context. + :param help: the help string. + :param hidden: hide this option from help outputs. + + .. versionchanged:: 8.0.1 + ``type`` is detected from ``flag_value`` if given. + """ + + param_type_name = "option" + + def __init__( + self, + param_decls: t.Optional[t.Sequence[str]] = None, + show_default: t.Union[bool, str] = False, + prompt: t.Union[bool, str] = False, + confirmation_prompt: t.Union[bool, str] = False, + prompt_required: bool = True, + hide_input: bool = False, + is_flag: t.Optional[bool] = None, + flag_value: t.Optional[t.Any] = None, + multiple: bool = False, + count: bool = False, + allow_from_autoenv: bool = True, + type: t.Optional[t.Union[types.ParamType, t.Any]] = None, + help: t.Optional[str] = None, + hidden: bool = False, + show_choices: bool = True, + show_envvar: bool = False, + **attrs: t.Any, + ) -> None: + default_is_missing = "default" not in attrs + super().__init__(param_decls, type=type, multiple=multiple, **attrs) + + if prompt is True: + if self.name is None: + raise TypeError("'name' is required with 'prompt=True'.") + + prompt_text: t.Optional[str] = self.name.replace("_", " ").capitalize() + elif prompt is False: + prompt_text = None + else: + prompt_text = t.cast(str, prompt) + + self.prompt = prompt_text + self.confirmation_prompt = confirmation_prompt + self.prompt_required = prompt_required + self.hide_input = hide_input + self.hidden = hidden + + # If prompt is enabled but not required, then the option can be + # used as a flag to indicate using prompt or flag_value. + self._flag_needs_value = self.prompt is not None and not self.prompt_required + + if is_flag is None: + if flag_value is not None: + # Implicitly a flag because flag_value was set. + is_flag = True + elif self._flag_needs_value: + # Not a flag, but when used as a flag it shows a prompt. + is_flag = False + else: + # Implicitly a flag because flag options were given. + is_flag = bool(self.secondary_opts) + elif is_flag is False and not self._flag_needs_value: + # Not a flag, and prompt is not enabled, can be used as a + # flag if flag_value is set. + self._flag_needs_value = flag_value is not None + + if is_flag and default_is_missing: + self.default: t.Union[t.Any, t.Callable[[], t.Any]] = False + + if flag_value is None: + flag_value = not self.default + + if is_flag and type is None: + # Re-guess the type from the flag value instead of the + # default. + self.type = types.convert_type(None, flag_value) + + self.is_flag: bool = is_flag + self.is_bool_flag = is_flag and isinstance(self.type, types.BoolParamType) + self.flag_value: t.Any = flag_value + + # Counting + self.count = count + if count: + if type is None: + self.type = types.IntRange(min=0) + if default_is_missing: + self.default = 0 + + self.allow_from_autoenv = allow_from_autoenv + self.help = help + self.show_default = show_default + self.show_choices = show_choices + self.show_envvar = show_envvar + + if __debug__: + if self.nargs == -1: + raise TypeError("nargs=-1 is not supported for options.") + + if self.prompt and self.is_flag and not self.is_bool_flag: + raise TypeError("'prompt' is not valid for non-boolean flag.") + + if not self.is_bool_flag and self.secondary_opts: + raise TypeError("Secondary flag is not valid for non-boolean flag.") + + if self.is_bool_flag and self.hide_input and self.prompt is not None: + raise TypeError( + "'prompt' with 'hide_input' is not valid for boolean flag." + ) + + if self.count: + if self.multiple: + raise TypeError("'count' is not valid with 'multiple'.") + + if self.is_flag: + raise TypeError("'count' is not valid with 'is_flag'.") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + help=self.help, + prompt=self.prompt, + is_flag=self.is_flag, + flag_value=self.flag_value, + count=self.count, + hidden=self.hidden, + ) + return info_dict + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + opts = [] + secondary_opts = [] + name = None + possible_names = [] + + for decl in decls: + if decl.isidentifier(): + if name is not None: + raise TypeError(f"Name '{name}' defined twice") + name = decl + else: + split_char = ";" if decl[:1] == "/" else "/" + if split_char in decl: + first, second = decl.split(split_char, 1) + first = first.rstrip() + if first: + possible_names.append(split_opt(first)) + opts.append(first) + second = second.lstrip() + if second: + secondary_opts.append(second.lstrip()) + if first == second: + raise ValueError( + f"Boolean option {decl!r} cannot use the" + " same flag for true/false." + ) + else: + possible_names.append(split_opt(decl)) + opts.append(decl) + + if name is None and possible_names: + possible_names.sort(key=lambda x: -len(x[0])) # group long options first + name = possible_names[0][1].replace("-", "_").lower() + if not name.isidentifier(): + name = None + + if name is None: + if not expose_value: + return None, opts, secondary_opts + raise TypeError("Could not determine name for option") + + if not opts and not secondary_opts: + raise TypeError( + f"No options defined but a name was passed ({name})." + " Did you mean to declare an argument instead? Did" + f" you mean to pass '--{name}'?" + ) + + return name, opts, secondary_opts + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + if self.multiple: + action = "append" + elif self.count: + action = "count" + else: + action = "store" + + if self.is_flag: + action = f"{action}_const" + + if self.is_bool_flag and self.secondary_opts: + parser.add_option( + obj=self, opts=self.opts, dest=self.name, action=action, const=True + ) + parser.add_option( + obj=self, + opts=self.secondary_opts, + dest=self.name, + action=action, + const=False, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + const=self.flag_value, + ) + else: + parser.add_option( + obj=self, + opts=self.opts, + dest=self.name, + action=action, + nargs=self.nargs, + ) + + def get_help_record(self, ctx: Context) -> t.Optional[t.Tuple[str, str]]: + if self.hidden: + return None + + any_prefix_is_slash = False + + def _write_opts(opts: t.Sequence[str]) -> str: + nonlocal any_prefix_is_slash + + rv, any_slashes = join_options(opts) + + if any_slashes: + any_prefix_is_slash = True + + if not self.is_flag and not self.count: + rv += f" {self.make_metavar()}" + + return rv + + rv = [_write_opts(self.opts)] + + if self.secondary_opts: + rv.append(_write_opts(self.secondary_opts)) + + help = self.help or "" + extra = [] + + if self.show_envvar: + envvar = self.envvar + + if envvar is None: + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + + if envvar is not None: + var_str = ( + envvar + if isinstance(envvar, str) + else ", ".join(str(d) for d in envvar) + ) + extra.append(_("env var: {var}").format(var=var_str)) + + # Temporarily enable resilient parsing to avoid type casting + # failing for the default. Might be possible to extend this to + # help formatting in general. + resilient = ctx.resilient_parsing + ctx.resilient_parsing = True + + try: + default_value = self.get_default(ctx, call=False) + finally: + ctx.resilient_parsing = resilient + + show_default_is_str = isinstance(self.show_default, str) + + if show_default_is_str or ( + default_value is not None and (self.show_default or ctx.show_default) + ): + if show_default_is_str: + default_string = f"({self.show_default})" + elif isinstance(default_value, (list, tuple)): + default_string = ", ".join(str(d) for d in default_value) + elif callable(default_value): + default_string = _("(dynamic)") + elif self.is_bool_flag and self.secondary_opts: + # For boolean flags that have distinct True/False opts, + # use the opt without prefix instead of the value. + default_string = split_opt( + (self.opts if self.default else self.secondary_opts)[0] + )[1] + else: + default_string = str(default_value) + + if default_string: + extra.append(_("default: {default}").format(default=default_string)) + + if ( + isinstance(self.type, types._NumberRangeBase) + # skip count with default range type + and not (self.count and self.type.min == 0 and self.type.max is None) + ): + range_str = self.type._describe_range() + + if range_str: + extra.append(range_str) + + if self.required: + extra.append(_("required")) + + if extra: + extra_str = "; ".join(extra) + help = f"{help} [{extra_str}]" if help else f"[{extra_str}]" + + return ("; " if any_prefix_is_slash else " / ").join(rv), help + + @typing.overload + def get_default( + self, ctx: Context, call: "te.Literal[True]" = True + ) -> t.Optional[t.Any]: + ... + + @typing.overload + def get_default( + self, ctx: Context, call: bool = ... + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + ... + + def get_default( + self, ctx: Context, call: bool = True + ) -> t.Optional[t.Union[t.Any, t.Callable[[], t.Any]]]: + # If we're a non boolean flag our default is more complex because + # we need to look at all flags in the same group to figure out + # if we're the the default one in which case we return the flag + # value as default. + if self.is_flag and not self.is_bool_flag: + for param in ctx.command.params: + if param.name == self.name and param.default: + return param.flag_value # type: ignore + + return None + + return super().get_default(ctx, call=call) + + def prompt_for_value(self, ctx: Context) -> t.Any: + """This is an alternative flow that can be activated in the full + value processing if a value does not exist. It will prompt the + user until a valid value exists and then returns the processed + value as result. + """ + assert self.prompt is not None + + # Calculate the default before prompting anything to be stable. + default = self.get_default(ctx) + + # If this is a prompt for a flag we need to handle this + # differently. + if self.is_bool_flag: + return confirm(self.prompt, default) + + return prompt( + self.prompt, + default=default, + type=self.type, + hide_input=self.hide_input, + show_choices=self.show_choices, + confirmation_prompt=self.confirmation_prompt, + value_proc=lambda x: self.process_value(ctx, x), + ) + + def resolve_envvar_value(self, ctx: Context) -> t.Optional[str]: + rv = super().resolve_envvar_value(ctx) + + if rv is not None: + return rv + + if ( + self.allow_from_autoenv + and ctx.auto_envvar_prefix is not None + and self.name is not None + ): + envvar = f"{ctx.auto_envvar_prefix}_{self.name.upper()}" + rv = os.environ.get(envvar) + + return rv + + def value_from_envvar(self, ctx: Context) -> t.Optional[t.Any]: + rv: t.Optional[t.Any] = self.resolve_envvar_value(ctx) + + if rv is None: + return None + + value_depth = (self.nargs != 1) + bool(self.multiple) + + if value_depth > 0: + rv = self.type.split_envvar_value(rv) + + if self.multiple and self.nargs != 1: + rv = batch(rv, self.nargs) + + return rv + + def consume_value( + self, ctx: Context, opts: t.Mapping[str, "Parameter"] + ) -> t.Tuple[t.Any, ParameterSource]: + value, source = super().consume_value(ctx, opts) + + # The parser will emit a sentinel value if the option can be + # given as a flag without a value. This is different from None + # to distinguish from the flag not being given at all. + if value is _flag_needs_value: + if self.prompt is not None and not ctx.resilient_parsing: + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + else: + value = self.flag_value + source = ParameterSource.COMMANDLINE + + elif ( + self.multiple + and value is not None + and any(v is _flag_needs_value for v in value) + ): + value = [self.flag_value if v is _flag_needs_value else v for v in value] + source = ParameterSource.COMMANDLINE + + # The value wasn't set, or used the param's default, prompt if + # prompting is enabled. + elif ( + source in {None, ParameterSource.DEFAULT} + and self.prompt is not None + and (self.required or self.prompt_required) + and not ctx.resilient_parsing + ): + value = self.prompt_for_value(ctx) + source = ParameterSource.PROMPT + + return value, source + + +class Argument(Parameter): + """Arguments are positional parameters to a command. They generally + provide fewer features than options but can have infinite ``nargs`` + and are required by default. + + All parameters are passed onwards to the parameter constructor. + """ + + param_type_name = "argument" + + def __init__( + self, + param_decls: t.Sequence[str], + required: t.Optional[bool] = None, + **attrs: t.Any, + ) -> None: + if required is None: + if attrs.get("default") is not None: + required = False + else: + required = attrs.get("nargs", 1) > 0 + + if "multiple" in attrs: + raise TypeError("__init__() got an unexpected keyword argument 'multiple'.") + + super().__init__(param_decls, required=required, **attrs) + + if __debug__: + if self.default is not None and self.nargs == -1: + raise TypeError("'default' is not supported for nargs=-1.") + + @property + def human_readable_name(self) -> str: + if self.metavar is not None: + return self.metavar + return self.name.upper() # type: ignore + + def make_metavar(self) -> str: + if self.metavar is not None: + return self.metavar + var = self.type.get_metavar(self) + if not var: + var = self.name.upper() # type: ignore + if not self.required: + var = f"[{var}]" + if self.nargs != 1: + var += "..." + return var + + def _parse_decls( + self, decls: t.Sequence[str], expose_value: bool + ) -> t.Tuple[t.Optional[str], t.List[str], t.List[str]]: + if not decls: + if not expose_value: + return None, [], [] + raise TypeError("Could not determine name for argument") + if len(decls) == 1: + name = arg = decls[0] + name = name.replace("-", "_").lower() + else: + raise TypeError( + "Arguments take exactly one parameter declaration, got" + f" {len(decls)}." + ) + return name, [arg], [] + + def get_usage_pieces(self, ctx: Context) -> t.List[str]: + return [self.make_metavar()] + + def get_error_hint(self, ctx: Context) -> str: + return f"'{self.make_metavar()}'" + + def add_to_parser(self, parser: OptionParser, ctx: Context) -> None: + parser.add_argument(dest=self.name, nargs=self.nargs, obj=self) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/decorators.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/decorators.py new file mode 100644 index 00000000..f1cc005a --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/decorators.py @@ -0,0 +1,436 @@ +import inspect +import types +import typing as t +from functools import update_wrapper +from gettext import gettext as _ + +from .core import Argument +from .core import Command +from .core import Context +from .core import Group +from .core import Option +from .core import Parameter +from .globals import get_current_context +from .utils import echo + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) +FC = t.TypeVar("FC", t.Callable[..., t.Any], Command) + + +def pass_context(f: F) -> F: + """Marks a callback as wanting to receive the current context + object as first argument. + """ + + def new_func(*args, **kwargs): # type: ignore + return f(get_current_context(), *args, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + +def pass_obj(f: F) -> F: + """Similar to :func:`pass_context`, but only pass the object on the + context onwards (:attr:`Context.obj`). This is useful if that object + represents the state of a nested system. + """ + + def new_func(*args, **kwargs): # type: ignore + return f(get_current_context().obj, *args, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + +def make_pass_decorator( + object_type: t.Type, ensure: bool = False +) -> "t.Callable[[F], F]": + """Given an object type this creates a decorator that will work + similar to :func:`pass_obj` but instead of passing the object of the + current context, it will find the innermost context of type + :func:`object_type`. + + This generates a decorator that works roughly like this:: + + from functools import update_wrapper + + def decorator(f): + @pass_context + def new_func(ctx, *args, **kwargs): + obj = ctx.find_object(object_type) + return ctx.invoke(f, obj, *args, **kwargs) + return update_wrapper(new_func, f) + return decorator + + :param object_type: the type of the object to pass. + :param ensure: if set to `True`, a new object will be created and + remembered on the context if it's not there yet. + """ + + def decorator(f: F) -> F: + def new_func(*args, **kwargs): # type: ignore + ctx = get_current_context() + + if ensure: + obj = ctx.ensure_object(object_type) + else: + obj = ctx.find_object(object_type) + + if obj is None: + raise RuntimeError( + "Managed to invoke callback without a context" + f" object of type {object_type.__name__!r}" + " existing." + ) + + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + return decorator + + +def pass_meta_key( + key: str, *, doc_description: t.Optional[str] = None +) -> "t.Callable[[F], F]": + """Create a decorator that passes a key from + :attr:`click.Context.meta` as the first argument to the decorated + function. + + :param key: Key in ``Context.meta`` to pass. + :param doc_description: Description of the object being passed, + inserted into the decorator's docstring. Defaults to "the 'key' + key from Context.meta". + + .. versionadded:: 8.0 + """ + + def decorator(f: F) -> F: + def new_func(*args, **kwargs): # type: ignore + ctx = get_current_context() + obj = ctx.meta[key] + return ctx.invoke(f, obj, *args, **kwargs) + + return update_wrapper(t.cast(F, new_func), f) + + if doc_description is None: + doc_description = f"the {key!r} key from :attr:`click.Context.meta`" + + decorator.__doc__ = ( + f"Decorator that passes {doc_description} as the first argument" + " to the decorated function." + ) + return decorator + + +def _make_command( + f: F, + name: t.Optional[str], + attrs: t.MutableMapping[str, t.Any], + cls: t.Type[Command], +) -> Command: + if isinstance(f, Command): + raise TypeError("Attempted to convert a callback into a command twice.") + + try: + params = f.__click_params__ # type: ignore + params.reverse() + del f.__click_params__ # type: ignore + except AttributeError: + params = [] + + help = attrs.get("help") + + if help is None: + help = inspect.getdoc(f) + else: + help = inspect.cleandoc(help) + + attrs["help"] = help + return cls( + name=name or f.__name__.lower().replace("_", "-"), + callback=f, + params=params, + **attrs, + ) + + +def command( + name: t.Optional[str] = None, + cls: t.Optional[t.Type[Command]] = None, + **attrs: t.Any, +) -> t.Callable[[F], Command]: + r"""Creates a new :class:`Command` and uses the decorated function as + callback. This will also automatically attach all decorated + :func:`option`\s and :func:`argument`\s as parameters to the command. + + The name of the command defaults to the name of the function with + underscores replaced by dashes. If you want to change that, you can + pass the intended name as the first argument. + + All keyword arguments are forwarded to the underlying command class. + + Once decorated the function turns into a :class:`Command` instance + that can be invoked as a command line utility or be attached to a + command :class:`Group`. + + :param name: the name of the command. This defaults to the function + name with underscores replaced by dashes. + :param cls: the command class to instantiate. This defaults to + :class:`Command`. + """ + if cls is None: + cls = Command + + def decorator(f: t.Callable[..., t.Any]) -> Command: + cmd = _make_command(f, name, attrs, cls) # type: ignore + cmd.__doc__ = f.__doc__ + return cmd + + return decorator + + +def group(name: t.Optional[str] = None, **attrs: t.Any) -> t.Callable[[F], Group]: + """Creates a new :class:`Group` with a function as callback. This + works otherwise the same as :func:`command` just that the `cls` + parameter is set to :class:`Group`. + """ + attrs.setdefault("cls", Group) + return t.cast(Group, command(name, **attrs)) + + +def _param_memo(f: FC, param: Parameter) -> None: + if isinstance(f, Command): + f.params.append(param) + else: + if not hasattr(f, "__click_params__"): + f.__click_params__ = [] # type: ignore + + f.__click_params__.append(param) # type: ignore + + +def argument(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: + """Attaches an argument to the command. All positional arguments are + passed as parameter declarations to :class:`Argument`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Argument` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the argument class to instantiate. This defaults to + :class:`Argument`. + """ + + def decorator(f: FC) -> FC: + ArgumentClass = attrs.pop("cls", Argument) + _param_memo(f, ArgumentClass(param_decls, **attrs)) + return f + + return decorator + + +def option(*param_decls: str, **attrs: t.Any) -> t.Callable[[FC], FC]: + """Attaches an option to the command. All positional arguments are + passed as parameter declarations to :class:`Option`; all keyword + arguments are forwarded unchanged (except ``cls``). + This is equivalent to creating an :class:`Option` instance manually + and attaching it to the :attr:`Command.params` list. + + :param cls: the option class to instantiate. This defaults to + :class:`Option`. + """ + + def decorator(f: FC) -> FC: + # Issue 926, copy attrs, so pre-defined options can re-use the same cls= + option_attrs = attrs.copy() + + if "help" in option_attrs: + option_attrs["help"] = inspect.cleandoc(option_attrs["help"]) + OptionClass = option_attrs.pop("cls", Option) + _param_memo(f, OptionClass(param_decls, **option_attrs)) + return f + + return decorator + + +def confirmation_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--yes`` option which shows a prompt before continuing if + not passed. If the prompt is declined, the program will exit. + + :param param_decls: One or more option names. Defaults to the single + value ``"--yes"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value: + ctx.abort() + + if not param_decls: + param_decls = ("--yes",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("callback", callback) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("prompt", "Do you want to continue?") + kwargs.setdefault("help", "Confirm the action without prompting.") + return option(*param_decls, **kwargs) + + +def password_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--password`` option which prompts for a password, hiding + input and asking to enter the value again for confirmation. + + :param param_decls: One or more option names. Defaults to the single + value ``"--password"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + if not param_decls: + param_decls = ("--password",) + + kwargs.setdefault("prompt", True) + kwargs.setdefault("confirmation_prompt", True) + kwargs.setdefault("hide_input", True) + return option(*param_decls, **kwargs) + + +def version_option( + version: t.Optional[str] = None, + *param_decls: str, + package_name: t.Optional[str] = None, + prog_name: t.Optional[str] = None, + message: t.Optional[str] = None, + **kwargs: t.Any, +) -> t.Callable[[FC], FC]: + """Add a ``--version`` option which immediately prints the version + number and exits the program. + + If ``version`` is not provided, Click will try to detect it using + :func:`importlib.metadata.version` to get the version for the + ``package_name``. On Python < 3.8, the ``importlib_metadata`` + backport must be installed. + + If ``package_name`` is not provided, Click will try to detect it by + inspecting the stack frames. This will be used to detect the + version, so it must match the name of the installed package. + + :param version: The version number to show. If not provided, Click + will try to detect it. + :param param_decls: One or more option names. Defaults to the single + value ``"--version"``. + :param package_name: The package name to detect the version from. If + not provided, Click will try to detect it. + :param prog_name: The name of the CLI to show in the message. If not + provided, it will be detected from the command. + :param message: The message to show. The values ``%(prog)s``, + ``%(package)s``, and ``%(version)s`` are available. Defaults to + ``"%(prog)s, version %(version)s"``. + :param kwargs: Extra arguments are passed to :func:`option`. + :raise RuntimeError: ``version`` could not be detected. + + .. versionchanged:: 8.0 + Add the ``package_name`` parameter, and the ``%(package)s`` + value for messages. + + .. versionchanged:: 8.0 + Use :mod:`importlib.metadata` instead of ``pkg_resources``. The + version is detected based on the package name, not the entry + point name. The Python package name must match the installed + package name, or be passed with ``package_name=``. + """ + if message is None: + message = _("%(prog)s, version %(version)s") + + if version is None and package_name is None: + frame = inspect.currentframe() + f_back = frame.f_back if frame is not None else None + f_globals = f_back.f_globals if f_back is not None else None + # break reference cycle + # https://docs.python.org/3/library/inspect.html#the-interpreter-stack + del frame + + if f_globals is not None: + package_name = f_globals.get("__name__") + + if package_name == "__main__": + package_name = f_globals.get("__package__") + + if package_name: + package_name = package_name.partition(".")[0] + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + nonlocal prog_name + nonlocal version + + if prog_name is None: + prog_name = ctx.find_root().info_name + + if version is None and package_name is not None: + metadata: t.Optional[types.ModuleType] + + try: + from importlib import metadata # type: ignore + except ImportError: + # Python < 3.8 + import importlib_metadata as metadata # type: ignore + + try: + version = metadata.version(package_name) # type: ignore + except metadata.PackageNotFoundError: # type: ignore + raise RuntimeError( + f"{package_name!r} is not installed. Try passing" + " 'package_name' instead." + ) from None + + if version is None: + raise RuntimeError( + f"Could not determine the version for {package_name!r} automatically." + ) + + echo( + t.cast(str, message) + % {"prog": prog_name, "package": package_name, "version": version}, + color=ctx.color, + ) + ctx.exit() + + if not param_decls: + param_decls = ("--version",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show the version and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) + + +def help_option(*param_decls: str, **kwargs: t.Any) -> t.Callable[[FC], FC]: + """Add a ``--help`` option which immediately prints the help page + and exits the program. + + This is usually unnecessary, as the ``--help`` option is added to + each command automatically unless ``add_help_option=False`` is + passed. + + :param param_decls: One or more option names. Defaults to the single + value ``"--help"``. + :param kwargs: Extra arguments are passed to :func:`option`. + """ + + def callback(ctx: Context, param: Parameter, value: bool) -> None: + if not value or ctx.resilient_parsing: + return + + echo(ctx.get_help(), color=ctx.color) + ctx.exit() + + if not param_decls: + param_decls = ("--help",) + + kwargs.setdefault("is_flag", True) + kwargs.setdefault("expose_value", False) + kwargs.setdefault("is_eager", True) + kwargs.setdefault("help", _("Show this message and exit.")) + kwargs["callback"] = callback + return option(*param_decls, **kwargs) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/exceptions.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/exceptions.py new file mode 100644 index 00000000..9e20b3eb --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/exceptions.py @@ -0,0 +1,287 @@ +import os +import typing as t +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import get_text_stderr +from .utils import echo + +if t.TYPE_CHECKING: + from .core import Context + from .core import Parameter + + +def _join_param_hints( + param_hint: t.Optional[t.Union[t.Sequence[str], str]] +) -> t.Optional[str]: + if param_hint is not None and not isinstance(param_hint, str): + return " / ".join(repr(x) for x in param_hint) + + return param_hint + + +class ClickException(Exception): + """An exception that Click can handle and show to the user.""" + + #: The exit code for this exception. + exit_code = 1 + + def __init__(self, message: str) -> None: + super().__init__(message) + self.message = message + + def format_message(self) -> str: + return self.message + + def __str__(self) -> str: + return self.message + + def show(self, file: t.Optional[t.IO] = None) -> None: + if file is None: + file = get_text_stderr() + + echo(_("Error: {message}").format(message=self.format_message()), file=file) + + +class UsageError(ClickException): + """An internal exception that signals a usage error. This typically + aborts any further handling. + + :param message: the error message to display. + :param ctx: optionally the context that caused this error. Click will + fill in the context automatically in some situations. + """ + + exit_code = 2 + + def __init__(self, message: str, ctx: t.Optional["Context"] = None) -> None: + super().__init__(message) + self.ctx = ctx + self.cmd = self.ctx.command if self.ctx else None + + def show(self, file: t.Optional[t.IO] = None) -> None: + if file is None: + file = get_text_stderr() + color = None + hint = "" + if ( + self.ctx is not None + and self.ctx.command.get_help_option(self.ctx) is not None + ): + hint = _("Try '{command} {option}' for help.").format( + command=self.ctx.command_path, option=self.ctx.help_option_names[0] + ) + hint = f"{hint}\n" + if self.ctx is not None: + color = self.ctx.color + echo(f"{self.ctx.get_usage()}\n{hint}", file=file, color=color) + echo( + _("Error: {message}").format(message=self.format_message()), + file=file, + color=color, + ) + + +class BadParameter(UsageError): + """An exception that formats out a standardized error message for a + bad parameter. This is useful when thrown from a callback or type as + Click will attach contextual information to it (for instance, which + parameter it is). + + .. versionadded:: 2.0 + + :param param: the parameter object that caused this error. This can + be left out, and Click will attach this info itself + if possible. + :param param_hint: a string that shows up as parameter name. This + can be used as alternative to `param` in cases + where custom validation should happen. If it is + a string it's used as such, if it's a list then + each item is quoted and separated. + """ + + def __init__( + self, + message: str, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + ) -> None: + super().__init__(message, ctx) + self.param = param + self.param_hint = param_hint + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + return _("Invalid value: {message}").format(message=self.message) + + return _("Invalid value for {param_hint}: {message}").format( + param_hint=_join_param_hints(param_hint), message=self.message + ) + + +class MissingParameter(BadParameter): + """Raised if click required an option or argument but it was not + provided when invoking the script. + + .. versionadded:: 4.0 + + :param param_type: a string that indicates the type of the parameter. + The default is to inherit the parameter type from + the given `param`. Valid values are ``'parameter'``, + ``'option'`` or ``'argument'``. + """ + + def __init__( + self, + message: t.Optional[str] = None, + ctx: t.Optional["Context"] = None, + param: t.Optional["Parameter"] = None, + param_hint: t.Optional[str] = None, + param_type: t.Optional[str] = None, + ) -> None: + super().__init__(message or "", ctx, param, param_hint) + self.param_type = param_type + + def format_message(self) -> str: + if self.param_hint is not None: + param_hint: t.Optional[str] = self.param_hint + elif self.param is not None: + param_hint = self.param.get_error_hint(self.ctx) # type: ignore + else: + param_hint = None + + param_hint = _join_param_hints(param_hint) + param_hint = f" {param_hint}" if param_hint else "" + + param_type = self.param_type + if param_type is None and self.param is not None: + param_type = self.param.param_type_name + + msg = self.message + if self.param is not None: + msg_extra = self.param.type.get_missing_message(self.param) + if msg_extra: + if msg: + msg += f". {msg_extra}" + else: + msg = msg_extra + + msg = f" {msg}" if msg else "" + + # Translate param_type for known types. + if param_type == "argument": + missing = _("Missing argument") + elif param_type == "option": + missing = _("Missing option") + elif param_type == "parameter": + missing = _("Missing parameter") + else: + missing = _("Missing {param_type}").format(param_type=param_type) + + return f"{missing}{param_hint}.{msg}" + + def __str__(self) -> str: + if not self.message: + param_name = self.param.name if self.param else None + return _("Missing parameter: {param_name}").format(param_name=param_name) + else: + return self.message + + +class NoSuchOption(UsageError): + """Raised if click attempted to handle an option that does not + exist. + + .. versionadded:: 4.0 + """ + + def __init__( + self, + option_name: str, + message: t.Optional[str] = None, + possibilities: t.Optional[t.Sequence[str]] = None, + ctx: t.Optional["Context"] = None, + ) -> None: + if message is None: + message = _("No such option: {name}").format(name=option_name) + + super().__init__(message, ctx) + self.option_name = option_name + self.possibilities = possibilities + + def format_message(self) -> str: + if not self.possibilities: + return self.message + + possibility_str = ", ".join(sorted(self.possibilities)) + suggest = ngettext( + "Did you mean {possibility}?", + "(Possible options: {possibilities})", + len(self.possibilities), + ).format(possibility=possibility_str, possibilities=possibility_str) + return f"{self.message} {suggest}" + + +class BadOptionUsage(UsageError): + """Raised if an option is generally supplied but the use of the option + was incorrect. This is for instance raised if the number of arguments + for an option is not correct. + + .. versionadded:: 4.0 + + :param option_name: the name of the option being used incorrectly. + """ + + def __init__( + self, option_name: str, message: str, ctx: t.Optional["Context"] = None + ) -> None: + super().__init__(message, ctx) + self.option_name = option_name + + +class BadArgumentUsage(UsageError): + """Raised if an argument is generally supplied but the use of the argument + was incorrect. This is for instance raised if the number of values + for an argument is not correct. + + .. versionadded:: 6.0 + """ + + +class FileError(ClickException): + """Raised if a file cannot be opened.""" + + def __init__(self, filename: str, hint: t.Optional[str] = None) -> None: + if hint is None: + hint = _("unknown error") + + super().__init__(hint) + self.ui_filename = os.fsdecode(filename) + self.filename = filename + + def format_message(self) -> str: + return _("Could not open file {filename!r}: {message}").format( + filename=self.ui_filename, message=self.message + ) + + +class Abort(RuntimeError): + """An internal signalling exception that signals Click to abort.""" + + +class Exit(RuntimeError): + """An exception that indicates that the application should exit with some + status code. + + :param code: the status code to exit with. + """ + + __slots__ = ("exit_code",) + + def __init__(self, code: int = 0) -> None: + self.exit_code = code diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/formatting.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/formatting.py new file mode 100644 index 00000000..ddd2a2f8 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/formatting.py @@ -0,0 +1,301 @@ +import typing as t +from contextlib import contextmanager +from gettext import gettext as _ + +from ._compat import term_len +from .parser import split_opt + +# Can force a width. This is used by the test system +FORCED_WIDTH: t.Optional[int] = None + + +def measure_table(rows: t.Iterable[t.Tuple[str, str]]) -> t.Tuple[int, ...]: + widths: t.Dict[int, int] = {} + + for row in rows: + for idx, col in enumerate(row): + widths[idx] = max(widths.get(idx, 0), term_len(col)) + + return tuple(y for x, y in sorted(widths.items())) + + +def iter_rows( + rows: t.Iterable[t.Tuple[str, str]], col_count: int +) -> t.Iterator[t.Tuple[str, ...]]: + for row in rows: + yield row + ("",) * (col_count - len(row)) + + +def wrap_text( + text: str, + width: int = 78, + initial_indent: str = "", + subsequent_indent: str = "", + preserve_paragraphs: bool = False, +) -> str: + """A helper function that intelligently wraps text. By default, it + assumes that it operates on a single paragraph of text but if the + `preserve_paragraphs` parameter is provided it will intelligently + handle paragraphs (defined by two empty lines). + + If paragraphs are handled, a paragraph can be prefixed with an empty + line containing the ``\\b`` character (``\\x08``) to indicate that + no rewrapping should happen in that block. + + :param text: the text that should be rewrapped. + :param width: the maximum width for the text. + :param initial_indent: the initial indent that should be placed on the + first line as a string. + :param subsequent_indent: the indent string that should be placed on + each consecutive line. + :param preserve_paragraphs: if this flag is set then the wrapping will + intelligently handle paragraphs. + """ + from ._textwrap import TextWrapper + + text = text.expandtabs() + wrapper = TextWrapper( + width, + initial_indent=initial_indent, + subsequent_indent=subsequent_indent, + replace_whitespace=False, + ) + if not preserve_paragraphs: + return wrapper.fill(text) + + p: t.List[t.Tuple[int, bool, str]] = [] + buf: t.List[str] = [] + indent = None + + def _flush_par() -> None: + if not buf: + return + if buf[0].strip() == "\b": + p.append((indent or 0, True, "\n".join(buf[1:]))) + else: + p.append((indent or 0, False, " ".join(buf))) + del buf[:] + + for line in text.splitlines(): + if not line: + _flush_par() + indent = None + else: + if indent is None: + orig_len = term_len(line) + line = line.lstrip() + indent = orig_len - term_len(line) + buf.append(line) + _flush_par() + + rv = [] + for indent, raw, text in p: + with wrapper.extra_indent(" " * indent): + if raw: + rv.append(wrapper.indent_only(text)) + else: + rv.append(wrapper.fill(text)) + + return "\n\n".join(rv) + + +class HelpFormatter: + """This class helps with formatting text-based help pages. It's + usually just needed for very special internal cases, but it's also + exposed so that developers can write their own fancy outputs. + + At present, it always writes into memory. + + :param indent_increment: the additional increment for each level. + :param width: the width for the text. This defaults to the terminal + width clamped to a maximum of 78. + """ + + def __init__( + self, + indent_increment: int = 2, + width: t.Optional[int] = None, + max_width: t.Optional[int] = None, + ) -> None: + import shutil + + self.indent_increment = indent_increment + if max_width is None: + max_width = 80 + if width is None: + width = FORCED_WIDTH + if width is None: + width = max(min(shutil.get_terminal_size().columns, max_width) - 2, 50) + self.width = width + self.current_indent = 0 + self.buffer: t.List[str] = [] + + def write(self, string: str) -> None: + """Writes a unicode string into the internal buffer.""" + self.buffer.append(string) + + def indent(self) -> None: + """Increases the indentation.""" + self.current_indent += self.indent_increment + + def dedent(self) -> None: + """Decreases the indentation.""" + self.current_indent -= self.indent_increment + + def write_usage( + self, prog: str, args: str = "", prefix: t.Optional[str] = None + ) -> None: + """Writes a usage line into the buffer. + + :param prog: the program name. + :param args: whitespace separated list of arguments. + :param prefix: The prefix for the first line. Defaults to + ``"Usage: "``. + """ + if prefix is None: + prefix = f"{_('Usage:')} " + + usage_prefix = f"{prefix:>{self.current_indent}}{prog} " + text_width = self.width - self.current_indent + + if text_width >= (term_len(usage_prefix) + 20): + # The arguments will fit to the right of the prefix. + indent = " " * term_len(usage_prefix) + self.write( + wrap_text( + args, + text_width, + initial_indent=usage_prefix, + subsequent_indent=indent, + ) + ) + else: + # The prefix is too long, put the arguments on the next line. + self.write(usage_prefix) + self.write("\n") + indent = " " * (max(self.current_indent, term_len(prefix)) + 4) + self.write( + wrap_text( + args, text_width, initial_indent=indent, subsequent_indent=indent + ) + ) + + self.write("\n") + + def write_heading(self, heading: str) -> None: + """Writes a heading into the buffer.""" + self.write(f"{'':>{self.current_indent}}{heading}:\n") + + def write_paragraph(self) -> None: + """Writes a paragraph into the buffer.""" + if self.buffer: + self.write("\n") + + def write_text(self, text: str) -> None: + """Writes re-indented text into the buffer. This rewraps and + preserves paragraphs. + """ + indent = " " * self.current_indent + self.write( + wrap_text( + text, + self.width, + initial_indent=indent, + subsequent_indent=indent, + preserve_paragraphs=True, + ) + ) + self.write("\n") + + def write_dl( + self, + rows: t.Sequence[t.Tuple[str, str]], + col_max: int = 30, + col_spacing: int = 2, + ) -> None: + """Writes a definition list into the buffer. This is how options + and commands are usually formatted. + + :param rows: a list of two item tuples for the terms and values. + :param col_max: the maximum width of the first column. + :param col_spacing: the number of spaces between the first and + second column. + """ + rows = list(rows) + widths = measure_table(rows) + if len(widths) != 2: + raise TypeError("Expected two columns for definition list") + + first_col = min(widths[0], col_max) + col_spacing + + for first, second in iter_rows(rows, len(widths)): + self.write(f"{'':>{self.current_indent}}{first}") + if not second: + self.write("\n") + continue + if term_len(first) <= first_col - col_spacing: + self.write(" " * (first_col - term_len(first))) + else: + self.write("\n") + self.write(" " * (first_col + self.current_indent)) + + text_width = max(self.width - first_col - 2, 10) + wrapped_text = wrap_text(second, text_width, preserve_paragraphs=True) + lines = wrapped_text.splitlines() + + if lines: + self.write(f"{lines[0]}\n") + + for line in lines[1:]: + self.write(f"{'':>{first_col + self.current_indent}}{line}\n") + else: + self.write("\n") + + @contextmanager + def section(self, name: str) -> t.Iterator[None]: + """Helpful context manager that writes a paragraph, a heading, + and the indents. + + :param name: the section name that is written as heading. + """ + self.write_paragraph() + self.write_heading(name) + self.indent() + try: + yield + finally: + self.dedent() + + @contextmanager + def indentation(self) -> t.Iterator[None]: + """A context manager that increases the indentation.""" + self.indent() + try: + yield + finally: + self.dedent() + + def getvalue(self) -> str: + """Returns the buffer contents.""" + return "".join(self.buffer) + + +def join_options(options: t.Sequence[str]) -> t.Tuple[str, bool]: + """Given a list of option strings this joins them in the most appropriate + way and returns them in the form ``(formatted_string, + any_prefix_is_slash)`` where the second item in the tuple is a flag that + indicates if any of the option prefixes was a slash. + """ + rv = [] + any_prefix_is_slash = False + + for opt in options: + prefix = split_opt(opt)[0] + + if prefix == "/": + any_prefix_is_slash = True + + rv.append((len(prefix), opt)) + + rv.sort(key=lambda x: x[0]) + return ", ".join(x[1] for x in rv), any_prefix_is_slash diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/globals.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/globals.py new file mode 100644 index 00000000..a7b0c931 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/globals.py @@ -0,0 +1,69 @@ +import typing +import typing as t +from threading import local + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + +_local = local() + + +@typing.overload +def get_current_context(silent: "te.Literal[False]" = False) -> "Context": + ... + + +@typing.overload +def get_current_context(silent: bool = ...) -> t.Optional["Context"]: + ... + + +def get_current_context(silent: bool = False) -> t.Optional["Context"]: + """Returns the current click context. This can be used as a way to + access the current context object from anywhere. This is a more implicit + alternative to the :func:`pass_context` decorator. This function is + primarily useful for helpers such as :func:`echo` which might be + interested in changing its behavior based on the current context. + + To push the current context, :meth:`Context.scope` can be used. + + .. versionadded:: 5.0 + + :param silent: if set to `True` the return value is `None` if no context + is available. The default behavior is to raise a + :exc:`RuntimeError`. + """ + try: + return t.cast("Context", _local.stack[-1]) + except (AttributeError, IndexError) as e: + if not silent: + raise RuntimeError("There is no active click context.") from e + + return None + + +def push_context(ctx: "Context") -> None: + """Pushes a new context to the current stack.""" + _local.__dict__.setdefault("stack", []).append(ctx) + + +def pop_context() -> None: + """Removes the top level from the stack.""" + _local.stack.pop() + + +def resolve_color_default(color: t.Optional[bool] = None) -> t.Optional[bool]: + """Internal helper to get the default value of the color flag. If a + value is passed it's returned unchanged, otherwise it's looked up from + the current context. + """ + if color is not None: + return color + + ctx = get_current_context(silent=True) + + if ctx is not None: + return ctx.color + + return None diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/parser.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/parser.py new file mode 100644 index 00000000..2d5a2ed7 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/parser.py @@ -0,0 +1,529 @@ +""" +This module started out as largely a copy paste from the stdlib's +optparse module with the features removed that we do not need from +optparse because we implement them in Click on a higher level (for +instance type handling, help formatting and a lot more). + +The plan is to remove more and more from here over time. + +The reason this is a different module and not optparse from the stdlib +is that there are differences in 2.x and 3.x about the error messages +generated and optparse in the stdlib uses gettext for no good reason +and might cause us issues. + +Click uses parts of optparse written by Gregory P. Ward and maintained +by the Python Software Foundation. This is limited to code in parser.py. + +Copyright 2001-2006 Gregory P. Ward. All rights reserved. +Copyright 2002-2006 Python Software Foundation. All rights reserved. +""" +# This code uses parts of optparse written by Gregory P. Ward and +# maintained by the Python Software Foundation. +# Copyright 2001-2006 Gregory P. Ward +# Copyright 2002-2006 Python Software Foundation +import typing as t +from collections import deque +from gettext import gettext as _ +from gettext import ngettext + +from .exceptions import BadArgumentUsage +from .exceptions import BadOptionUsage +from .exceptions import NoSuchOption +from .exceptions import UsageError + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Argument as CoreArgument + from .core import Context + from .core import Option as CoreOption + from .core import Parameter as CoreParameter + +V = t.TypeVar("V") + +# Sentinel value that indicates an option was passed as a flag without a +# value but is not a flag option. Option.consume_value uses this to +# prompt or use the flag_value. +_flag_needs_value = object() + + +def _unpack_args( + args: t.Sequence[str], nargs_spec: t.Sequence[int] +) -> t.Tuple[t.Sequence[t.Union[str, t.Sequence[t.Optional[str]], None]], t.List[str]]: + """Given an iterable of arguments and an iterable of nargs specifications, + it returns a tuple with all the unpacked arguments at the first index + and all remaining arguments as the second. + + The nargs specification is the number of arguments that should be consumed + or `-1` to indicate that this position should eat up all the remainders. + + Missing items are filled with `None`. + """ + args = deque(args) + nargs_spec = deque(nargs_spec) + rv: t.List[t.Union[str, t.Tuple[t.Optional[str], ...], None]] = [] + spos: t.Optional[int] = None + + def _fetch(c: "te.Deque[V]") -> t.Optional[V]: + try: + if spos is None: + return c.popleft() + else: + return c.pop() + except IndexError: + return None + + while nargs_spec: + nargs = _fetch(nargs_spec) + + if nargs is None: + continue + + if nargs == 1: + rv.append(_fetch(args)) + elif nargs > 1: + x = [_fetch(args) for _ in range(nargs)] + + # If we're reversed, we're pulling in the arguments in reverse, + # so we need to turn them around. + if spos is not None: + x.reverse() + + rv.append(tuple(x)) + elif nargs < 0: + if spos is not None: + raise TypeError("Cannot have two nargs < 0") + + spos = len(rv) + rv.append(None) + + # spos is the position of the wildcard (star). If it's not `None`, + # we fill it with the remainder. + if spos is not None: + rv[spos] = tuple(args) + args = [] + rv[spos + 1 :] = reversed(rv[spos + 1 :]) + + return tuple(rv), list(args) + + +def split_opt(opt: str) -> t.Tuple[str, str]: + first = opt[:1] + if first.isalnum(): + return "", opt + if opt[1:2] == first: + return opt[:2], opt[2:] + return first, opt[1:] + + +def normalize_opt(opt: str, ctx: t.Optional["Context"]) -> str: + if ctx is None or ctx.token_normalize_func is None: + return opt + prefix, opt = split_opt(opt) + return f"{prefix}{ctx.token_normalize_func(opt)}" + + +def split_arg_string(string: str) -> t.List[str]: + """Split an argument string as with :func:`shlex.split`, but don't + fail if the string is incomplete. Ignores a missing closing quote or + incomplete escape sequence and uses the partial token as-is. + + .. code-block:: python + + split_arg_string("example 'my file") + ["example", "my file"] + + split_arg_string("example my\\") + ["example", "my"] + + :param string: String to split. + """ + import shlex + + lex = shlex.shlex(string, posix=True) + lex.whitespace_split = True + lex.commenters = "" + out = [] + + try: + for token in lex: + out.append(token) + except ValueError: + # Raised when end-of-string is reached in an invalid state. Use + # the partial token as-is. The quote or escape character is in + # lex.state, not lex.token. + out.append(lex.token) + + return out + + +class Option: + def __init__( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ): + self._short_opts = [] + self._long_opts = [] + self.prefixes = set() + + for opt in opts: + prefix, value = split_opt(opt) + if not prefix: + raise ValueError(f"Invalid start character for option ({opt})") + self.prefixes.add(prefix[0]) + if len(prefix) == 1 and len(value) == 1: + self._short_opts.append(opt) + else: + self._long_opts.append(opt) + self.prefixes.add(prefix) + + if action is None: + action = "store" + + self.dest = dest + self.action = action + self.nargs = nargs + self.const = const + self.obj = obj + + @property + def takes_value(self) -> bool: + return self.action in ("store", "append") + + def process(self, value: str, state: "ParsingState") -> None: + if self.action == "store": + state.opts[self.dest] = value # type: ignore + elif self.action == "store_const": + state.opts[self.dest] = self.const # type: ignore + elif self.action == "append": + state.opts.setdefault(self.dest, []).append(value) # type: ignore + elif self.action == "append_const": + state.opts.setdefault(self.dest, []).append(self.const) # type: ignore + elif self.action == "count": + state.opts[self.dest] = state.opts.get(self.dest, 0) + 1 # type: ignore + else: + raise ValueError(f"unknown action '{self.action}'") + state.order.append(self.obj) + + +class Argument: + def __init__(self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1): + self.dest = dest + self.nargs = nargs + self.obj = obj + + def process( + self, + value: t.Union[t.Optional[str], t.Sequence[t.Optional[str]]], + state: "ParsingState", + ) -> None: + if self.nargs > 1: + assert value is not None + holes = sum(1 for x in value if x is None) + if holes == len(value): + value = None + elif holes != 0: + raise BadArgumentUsage( + _("Argument {name!r} takes {nargs} values.").format( + name=self.dest, nargs=self.nargs + ) + ) + + if self.nargs == -1 and self.obj.envvar is not None and value == (): + # Replace empty tuple with None so that a value from the + # environment may be tried. + value = None + + state.opts[self.dest] = value # type: ignore + state.order.append(self.obj) + + +class ParsingState: + def __init__(self, rargs: t.List[str]) -> None: + self.opts: t.Dict[str, t.Any] = {} + self.largs: t.List[str] = [] + self.rargs = rargs + self.order: t.List["CoreParameter"] = [] + + +class OptionParser: + """The option parser is an internal class that is ultimately used to + parse options and arguments. It's modelled after optparse and brings + a similar but vastly simplified API. It should generally not be used + directly as the high level Click classes wrap it for you. + + It's not nearly as extensible as optparse or argparse as it does not + implement features that are implemented on a higher level (such as + types or defaults). + + :param ctx: optionally the :class:`~click.Context` where this parser + should go with. + """ + + def __init__(self, ctx: t.Optional["Context"] = None) -> None: + #: The :class:`~click.Context` for this parser. This might be + #: `None` for some advanced use cases. + self.ctx = ctx + #: This controls how the parser deals with interspersed arguments. + #: If this is set to `False`, the parser will stop on the first + #: non-option. Click uses this to implement nested subcommands + #: safely. + self.allow_interspersed_args = True + #: This tells the parser how to deal with unknown options. By + #: default it will error out (which is sensible), but there is a + #: second mode where it will ignore it and continue processing + #: after shifting all the unknown options into the resulting args. + self.ignore_unknown_options = False + + if ctx is not None: + self.allow_interspersed_args = ctx.allow_interspersed_args + self.ignore_unknown_options = ctx.ignore_unknown_options + + self._short_opt: t.Dict[str, Option] = {} + self._long_opt: t.Dict[str, Option] = {} + self._opt_prefixes = {"-", "--"} + self._args: t.List[Argument] = [] + + def add_option( + self, + obj: "CoreOption", + opts: t.Sequence[str], + dest: t.Optional[str], + action: t.Optional[str] = None, + nargs: int = 1, + const: t.Optional[t.Any] = None, + ) -> None: + """Adds a new option named `dest` to the parser. The destination + is not inferred (unlike with optparse) and needs to be explicitly + provided. Action can be any of ``store``, ``store_const``, + ``append``, ``append_const`` or ``count``. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + opts = [normalize_opt(opt, self.ctx) for opt in opts] + option = Option(obj, opts, dest, action=action, nargs=nargs, const=const) + self._opt_prefixes.update(option.prefixes) + for opt in option._short_opts: + self._short_opt[opt] = option + for opt in option._long_opts: + self._long_opt[opt] = option + + def add_argument( + self, obj: "CoreArgument", dest: t.Optional[str], nargs: int = 1 + ) -> None: + """Adds a positional argument named `dest` to the parser. + + The `obj` can be used to identify the option in the order list + that is returned from the parser. + """ + self._args.append(Argument(obj, dest=dest, nargs=nargs)) + + def parse_args( + self, args: t.List[str] + ) -> t.Tuple[t.Dict[str, t.Any], t.List[str], t.List["CoreParameter"]]: + """Parses positional arguments and returns ``(values, args, order)`` + for the parsed options and arguments as well as the leftover + arguments if there are any. The order is a list of objects as they + appear on the command line. If arguments appear multiple times they + will be memorized multiple times as well. + """ + state = ParsingState(args) + try: + self._process_args_for_options(state) + self._process_args_for_args(state) + except UsageError: + if self.ctx is None or not self.ctx.resilient_parsing: + raise + return state.opts, state.largs, state.order + + def _process_args_for_args(self, state: ParsingState) -> None: + pargs, args = _unpack_args( + state.largs + state.rargs, [x.nargs for x in self._args] + ) + + for idx, arg in enumerate(self._args): + arg.process(pargs[idx], state) + + state.largs = args + state.rargs = [] + + def _process_args_for_options(self, state: ParsingState) -> None: + while state.rargs: + arg = state.rargs.pop(0) + arglen = len(arg) + # Double dashes always handled explicitly regardless of what + # prefixes are valid. + if arg == "--": + return + elif arg[:1] in self._opt_prefixes and arglen > 1: + self._process_opts(arg, state) + elif self.allow_interspersed_args: + state.largs.append(arg) + else: + state.rargs.insert(0, arg) + return + + # Say this is the original argument list: + # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)] + # ^ + # (we are about to process arg(i)). + # + # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of + # [arg0, ..., arg(i-1)] (any options and their arguments will have + # been removed from largs). + # + # The while loop will usually consume 1 or more arguments per pass. + # If it consumes 1 (eg. arg is an option that takes no arguments), + # then after _process_arg() is done the situation is: + # + # largs = subset of [arg0, ..., arg(i)] + # rargs = [arg(i+1), ..., arg(N-1)] + # + # If allow_interspersed_args is false, largs will always be + # *empty* -- still a subset of [arg0, ..., arg(i-1)], but + # not a very interesting subset! + + def _match_long_opt( + self, opt: str, explicit_value: t.Optional[str], state: ParsingState + ) -> None: + if opt not in self._long_opt: + from difflib import get_close_matches + + possibilities = get_close_matches(opt, self._long_opt) + raise NoSuchOption(opt, possibilities=possibilities, ctx=self.ctx) + + option = self._long_opt[opt] + if option.takes_value: + # At this point it's safe to modify rargs by injecting the + # explicit value, because no exception is raised in this + # branch. This means that the inserted value will be fully + # consumed. + if explicit_value is not None: + state.rargs.insert(0, explicit_value) + + value = self._get_value_from_state(opt, option, state) + + elif explicit_value is not None: + raise BadOptionUsage( + opt, _("Option {name!r} does not take a value.").format(name=opt) + ) + + else: + value = None + + option.process(value, state) + + def _match_short_opt(self, arg: str, state: ParsingState) -> None: + stop = False + i = 1 + prefix = arg[0] + unknown_options = [] + + for ch in arg[1:]: + opt = normalize_opt(f"{prefix}{ch}", self.ctx) + option = self._short_opt.get(opt) + i += 1 + + if not option: + if self.ignore_unknown_options: + unknown_options.append(ch) + continue + raise NoSuchOption(opt, ctx=self.ctx) + if option.takes_value: + # Any characters left in arg? Pretend they're the + # next arg, and stop consuming characters of arg. + if i < len(arg): + state.rargs.insert(0, arg[i:]) + stop = True + + value = self._get_value_from_state(opt, option, state) + + else: + value = None + + option.process(value, state) + + if stop: + break + + # If we got any unknown options we re-combinate the string of the + # remaining options and re-attach the prefix, then report that + # to the state as new larg. This way there is basic combinatorics + # that can be achieved while still ignoring unknown arguments. + if self.ignore_unknown_options and unknown_options: + state.largs.append(f"{prefix}{''.join(unknown_options)}") + + def _get_value_from_state( + self, option_name: str, option: Option, state: ParsingState + ) -> t.Any: + nargs = option.nargs + + if len(state.rargs) < nargs: + if option.obj._flag_needs_value: + # Option allows omitting the value. + value = _flag_needs_value + else: + raise BadOptionUsage( + option_name, + ngettext( + "Option {name!r} requires an argument.", + "Option {name!r} requires {nargs} arguments.", + nargs, + ).format(name=option_name, nargs=nargs), + ) + elif nargs == 1: + next_rarg = state.rargs[0] + + if ( + option.obj._flag_needs_value + and isinstance(next_rarg, str) + and next_rarg[:1] in self._opt_prefixes + and len(next_rarg) > 1 + ): + # The next arg looks like the start of an option, don't + # use it as the value if omitting the value is allowed. + value = _flag_needs_value + else: + value = state.rargs.pop(0) + else: + value = tuple(state.rargs[:nargs]) + del state.rargs[:nargs] + + return value + + def _process_opts(self, arg: str, state: ParsingState) -> None: + explicit_value = None + # Long option handling happens in two parts. The first part is + # supporting explicitly attached values. In any case, we will try + # to long match the option first. + if "=" in arg: + long_opt, explicit_value = arg.split("=", 1) + else: + long_opt = arg + norm_long_opt = normalize_opt(long_opt, self.ctx) + + # At this point we will match the (assumed) long option through + # the long option matching code. Note that this allows options + # like "-foo" to be matched as long options. + try: + self._match_long_opt(norm_long_opt, explicit_value, state) + except NoSuchOption: + # At this point the long option matching failed, and we need + # to try with short options. However there is a special rule + # which says, that if we have a two character options prefix + # (applies to "--foo" for instance), we do not dispatch to the + # short option code and will instead raise the no option + # error. + if arg[:2] not in self._opt_prefixes: + self._match_short_opt(arg, state) + return + + if not self.ignore_unknown_options: + raise + + state.largs.append(arg) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/py.typed b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/shell_completion.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/shell_completion.py new file mode 100644 index 00000000..cad080da --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/shell_completion.py @@ -0,0 +1,581 @@ +import os +import re +import typing as t +from gettext import gettext as _ + +from .core import Argument +from .core import BaseCommand +from .core import Context +from .core import MultiCommand +from .core import Option +from .core import Parameter +from .core import ParameterSource +from .parser import split_arg_string +from .utils import echo + + +def shell_complete( + cli: BaseCommand, + ctx_args: t.Dict[str, t.Any], + prog_name: str, + complete_var: str, + instruction: str, +) -> int: + """Perform shell completion for the given CLI program. + + :param cli: Command being called. + :param ctx_args: Extra arguments to pass to + ``cli.make_context``. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + :param instruction: Value of ``complete_var`` with the completion + instruction and shell, in the form ``instruction_shell``. + :return: Status code to exit with. + """ + shell, _, instruction = instruction.partition("_") + comp_cls = get_completion_class(shell) + + if comp_cls is None: + return 1 + + comp = comp_cls(cli, ctx_args, prog_name, complete_var) + + if instruction == "source": + echo(comp.source()) + return 0 + + if instruction == "complete": + echo(comp.complete()) + return 0 + + return 1 + + +class CompletionItem: + """Represents a completion value and metadata about the value. The + default metadata is ``type`` to indicate special shell handling, + and ``help`` if a shell supports showing a help string next to the + value. + + Arbitrary parameters can be passed when creating the object, and + accessed using ``item.attr``. If an attribute wasn't passed, + accessing it returns ``None``. + + :param value: The completion suggestion. + :param type: Tells the shell script to provide special completion + support for the type. Click uses ``"dir"`` and ``"file"``. + :param help: String shown next to the value if supported. + :param kwargs: Arbitrary metadata. The built-in implementations + don't use this, but custom type completions paired with custom + shell support could use it. + """ + + __slots__ = ("value", "type", "help", "_info") + + def __init__( + self, + value: t.Any, + type: str = "plain", + help: t.Optional[str] = None, + **kwargs: t.Any, + ) -> None: + self.value = value + self.type = type + self.help = help + self._info = kwargs + + def __getattr__(self, name: str) -> t.Any: + return self._info.get(name) + + +# Only Bash >= 4.4 has the nosort option. +_SOURCE_BASH = """\ +%(complete_func)s() { + local IFS=$'\\n' + local response + + response=$(env COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ +%(complete_var)s=bash_complete $1) + + for completion in $response; do + IFS=',' read type value <<< "$completion" + + if [[ $type == 'dir' ]]; then + COMREPLY=() + compopt -o dirnames + elif [[ $type == 'file' ]]; then + COMREPLY=() + compopt -o default + elif [[ $type == 'plain' ]]; then + COMPREPLY+=($value) + fi + done + + return 0 +} + +%(complete_func)s_setup() { + complete -o nosort -F %(complete_func)s %(prog_name)s +} + +%(complete_func)s_setup; +""" + +_SOURCE_ZSH = """\ +#compdef %(prog_name)s + +%(complete_func)s() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[%(prog_name)s] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) \ +%(complete_var)s=zsh_complete %(prog_name)s)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +compdef %(complete_func)s %(prog_name)s; +""" + +_SOURCE_FISH = """\ +function %(complete_func)s; + set -l response; + + for value in (env %(complete_var)s=fish_complete COMP_WORDS=(commandline -cp) \ +COMP_CWORD=(commandline -t) %(prog_name)s); + set response $response $value; + end; + + for completion in $response; + set -l metadata (string split "," $completion); + + if test $metadata[1] = "dir"; + __fish_complete_directories $metadata[2]; + else if test $metadata[1] = "file"; + __fish_complete_path $metadata[2]; + else if test $metadata[1] = "plain"; + echo $metadata[2]; + end; + end; +end; + +complete --no-files --command %(prog_name)s --arguments \ +"(%(complete_func)s)"; +""" + + +class ShellComplete: + """Base class for providing shell completion support. A subclass for + a given shell will override attributes and methods to implement the + completion instructions (``source`` and ``complete``). + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param complete_var: Name of the environment variable that holds + the completion instruction. + + .. versionadded:: 8.0 + """ + + name: t.ClassVar[str] + """Name to register the shell as with :func:`add_completion_class`. + This is used in completion instructions (``{name}_source`` and + ``{name}_complete``). + """ + + source_template: t.ClassVar[str] + """Completion script template formatted by :meth:`source`. This must + be provided by subclasses. + """ + + def __init__( + self, + cli: BaseCommand, + ctx_args: t.Dict[str, t.Any], + prog_name: str, + complete_var: str, + ) -> None: + self.cli = cli + self.ctx_args = ctx_args + self.prog_name = prog_name + self.complete_var = complete_var + + @property + def func_name(self) -> str: + """The name of the shell function defined by the completion + script. + """ + safe_name = re.sub(r"\W*", "", self.prog_name.replace("-", "_"), re.ASCII) + return f"_{safe_name}_completion" + + def source_vars(self) -> t.Dict[str, t.Any]: + """Vars for formatting :attr:`source_template`. + + By default this provides ``complete_func``, ``complete_var``, + and ``prog_name``. + """ + return { + "complete_func": self.func_name, + "complete_var": self.complete_var, + "prog_name": self.prog_name, + } + + def source(self) -> str: + """Produce the shell script that defines the completion + function. By default this ``%``-style formats + :attr:`source_template` with the dict returned by + :meth:`source_vars`. + """ + return self.source_template % self.source_vars() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + """Use the env vars defined by the shell script to return a + tuple of ``args, incomplete``. This must be implemented by + subclasses. + """ + raise NotImplementedError + + def get_completions( + self, args: t.List[str], incomplete: str + ) -> t.List[CompletionItem]: + """Determine the context and last complete command or parameter + from the complete args. Call that object's ``shell_complete`` + method to get the completions for the incomplete value. + + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + ctx = _resolve_context(self.cli, self.ctx_args, self.prog_name, args) + obj, incomplete = _resolve_incomplete(ctx, args, incomplete) + return obj.shell_complete(ctx, incomplete) + + def format_completion(self, item: CompletionItem) -> str: + """Format a completion item into the form recognized by the + shell script. This must be implemented by subclasses. + + :param item: Completion item to format. + """ + raise NotImplementedError + + def complete(self) -> str: + """Produce the completion data to send back to the shell. + + By default this calls :meth:`get_completion_args`, gets the + completions, then calls :meth:`format_completion` for each + completion. + """ + args, incomplete = self.get_completion_args() + completions = self.get_completions(args, incomplete) + out = [self.format_completion(item) for item in completions] + return "\n".join(out) + + +class BashComplete(ShellComplete): + """Shell completion for Bash.""" + + name = "bash" + source_template = _SOURCE_BASH + + def _check_version(self) -> None: + import subprocess + + output = subprocess.run( + ["bash", "-c", "echo ${BASH_VERSION}"], stdout=subprocess.PIPE + ) + match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode()) + + if match is not None: + major, minor = match.groups() + + if major < "4" or major == "4" and minor < "4": + raise RuntimeError( + _( + "Shell completion is not supported for Bash" + " versions older than 4.4." + ) + ) + else: + raise RuntimeError( + _("Couldn't detect Bash version, shell completion is not supported.") + ) + + def source(self) -> str: + self._check_version() + return super().source() + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type},{item.value}" + + +class ZshComplete(ShellComplete): + """Shell completion for Zsh.""" + + name = "zsh" + source_template = _SOURCE_ZSH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + + try: + incomplete = cwords[cword] + except IndexError: + incomplete = "" + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + return f"{item.type}\n{item.value}\n{item.help if item.help else '_'}" + + +class FishComplete(ShellComplete): + """Shell completion for Fish.""" + + name = "fish" + source_template = _SOURCE_FISH + + def get_completion_args(self) -> t.Tuple[t.List[str], str]: + cwords = split_arg_string(os.environ["COMP_WORDS"]) + incomplete = os.environ["COMP_CWORD"] + args = cwords[1:] + + # Fish stores the partial word in both COMP_WORDS and + # COMP_CWORD, remove it from complete args. + if incomplete and args and args[-1] == incomplete: + args.pop() + + return args, incomplete + + def format_completion(self, item: CompletionItem) -> str: + if item.help: + return f"{item.type},{item.value}\t{item.help}" + + return f"{item.type},{item.value}" + + +_available_shells: t.Dict[str, t.Type[ShellComplete]] = { + "bash": BashComplete, + "fish": FishComplete, + "zsh": ZshComplete, +} + + +def add_completion_class( + cls: t.Type[ShellComplete], name: t.Optional[str] = None +) -> None: + """Register a :class:`ShellComplete` subclass under the given name. + The name will be provided by the completion instruction environment + variable during completion. + + :param cls: The completion class that will handle completion for the + shell. + :param name: Name to register the class under. Defaults to the + class's ``name`` attribute. + """ + if name is None: + name = cls.name + + _available_shells[name] = cls + + +def get_completion_class(shell: str) -> t.Optional[t.Type[ShellComplete]]: + """Look up a registered :class:`ShellComplete` subclass by the name + provided by the completion instruction environment variable. If the + name isn't registered, returns ``None``. + + :param shell: Name the class is registered under. + """ + return _available_shells.get(shell) + + +def _is_incomplete_argument(ctx: Context, param: Parameter) -> bool: + """Determine if the given parameter is an argument that can still + accept values. + + :param ctx: Invocation context for the command represented by the + parsed complete args. + :param param: Argument object being checked. + """ + if not isinstance(param, Argument): + return False + + assert param.name is not None + value = ctx.params[param.name] + return ( + param.nargs == -1 + or ctx.get_parameter_source(param.name) is not ParameterSource.COMMANDLINE + or ( + param.nargs > 1 + and isinstance(value, (tuple, list)) + and len(value) < param.nargs + ) + ) + + +def _start_of_option(value: str) -> bool: + """Check if the value looks like the start of an option.""" + if not value: + return False + + c = value[0] + # Allow "/" since that starts a path. + return not c.isalnum() and c != "/" + + +def _is_incomplete_option(args: t.List[str], param: Parameter) -> bool: + """Determine if the given parameter is an option that needs a value. + + :param args: List of complete args before the incomplete value. + :param param: Option object being checked. + """ + if not isinstance(param, Option): + return False + + if param.is_flag: + return False + + last_option = None + + for index, arg in enumerate(reversed(args)): + if index + 1 > param.nargs: + break + + if _start_of_option(arg): + last_option = arg + + return last_option is not None and last_option in param.opts + + +def _resolve_context( + cli: BaseCommand, ctx_args: t.Dict[str, t.Any], prog_name: str, args: t.List[str] +) -> Context: + """Produce the context hierarchy starting with the command and + traversing the complete arguments. This only follows the commands, + it doesn't trigger input prompts or callbacks. + + :param cli: Command being called. + :param prog_name: Name of the executable in the shell. + :param args: List of complete args before the incomplete value. + """ + ctx_args["resilient_parsing"] = True + ctx = cli.make_context(prog_name, args.copy(), **ctx_args) + args = ctx.protected_args + ctx.args + + while args: + command = ctx.command + + if isinstance(command, MultiCommand): + if not command.chain: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + ctx = cmd.make_context(name, args, parent=ctx, resilient_parsing=True) + args = ctx.protected_args + ctx.args + else: + while args: + name, cmd, args = command.resolve_command(ctx, args) + + if cmd is None: + return ctx + + sub_ctx = cmd.make_context( + name, + args, + parent=ctx, + allow_extra_args=True, + allow_interspersed_args=False, + resilient_parsing=True, + ) + args = sub_ctx.args + + ctx = sub_ctx + args = [*sub_ctx.protected_args, *sub_ctx.args] + else: + break + + return ctx + + +def _resolve_incomplete( + ctx: Context, args: t.List[str], incomplete: str +) -> t.Tuple[t.Union[BaseCommand, Parameter], str]: + """Find the Click object that will handle the completion of the + incomplete value. Return the object and the incomplete value. + + :param ctx: Invocation context for the command represented by + the parsed complete args. + :param args: List of complete args before the incomplete value. + :param incomplete: Value being completed. May be empty. + """ + # Different shells treat an "=" between a long option name and + # value differently. Might keep the value joined, return the "=" + # as a separate item, or return the split name and value. Always + # split and discard the "=" to make completion easier. + if incomplete == "=": + incomplete = "" + elif "=" in incomplete and _start_of_option(incomplete): + name, _, incomplete = incomplete.partition("=") + args.append(name) + + # The "--" marker tells Click to stop treating values as options + # even if they start with the option character. If it hasn't been + # given and the incomplete arg looks like an option, the current + # command will provide option name completions. + if "--" not in args and _start_of_option(incomplete): + return ctx.command, incomplete + + params = ctx.command.get_params(ctx) + + # If the last complete arg is an option name with an incomplete + # value, the option will provide value completions. + for param in params: + if _is_incomplete_option(args, param): + return param, incomplete + + # It's not an option name or value. The first argument without a + # parsed value will provide value completions. + for param in params: + if _is_incomplete_argument(ctx, param): + return param, incomplete + + # There were no unparsed arguments, the command may be a group that + # will provide command name completions. + return ctx.command, incomplete diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/termui.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/termui.py new file mode 100644 index 00000000..cf8d5f13 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/termui.py @@ -0,0 +1,809 @@ +import inspect +import io +import itertools +import os +import sys +import typing +import typing as t +from gettext import gettext as _ + +from ._compat import isatty +from ._compat import strip_ansi +from ._compat import WIN +from .exceptions import Abort +from .exceptions import UsageError +from .globals import resolve_color_default +from .types import Choice +from .types import convert_type +from .types import ParamType +from .utils import echo +from .utils import LazyFile + +if t.TYPE_CHECKING: + from ._termui_impl import ProgressBar + +V = t.TypeVar("V") + +# The prompt functions to use. The doc tools currently override these +# functions to customize how they work. +visible_prompt_func: t.Callable[[str], str] = input + +_ansi_colors = { + "black": 30, + "red": 31, + "green": 32, + "yellow": 33, + "blue": 34, + "magenta": 35, + "cyan": 36, + "white": 37, + "reset": 39, + "bright_black": 90, + "bright_red": 91, + "bright_green": 92, + "bright_yellow": 93, + "bright_blue": 94, + "bright_magenta": 95, + "bright_cyan": 96, + "bright_white": 97, +} +_ansi_reset_all = "\033[0m" + + +def hidden_prompt_func(prompt: str) -> str: + import getpass + + return getpass.getpass(prompt) + + +def _build_prompt( + text: str, + suffix: str, + show_default: bool = False, + default: t.Optional[t.Any] = None, + show_choices: bool = True, + type: t.Optional[ParamType] = None, +) -> str: + prompt = text + if type is not None and show_choices and isinstance(type, Choice): + prompt += f" ({', '.join(map(str, type.choices))})" + if default is not None and show_default: + prompt = f"{prompt} [{_format_default(default)}]" + return f"{prompt}{suffix}" + + +def _format_default(default: t.Any) -> t.Any: + if isinstance(default, (io.IOBase, LazyFile)) and hasattr(default, "name"): + return default.name # type: ignore + + return default + + +def prompt( + text: str, + default: t.Optional[t.Any] = None, + hide_input: bool = False, + confirmation_prompt: t.Union[bool, str] = False, + type: t.Optional[t.Union[ParamType, t.Any]] = None, + value_proc: t.Optional[t.Callable[[str], t.Any]] = None, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, + show_choices: bool = True, +) -> t.Any: + """Prompts a user for input. This is a convenience function that can + be used to prompt a user for input later. + + If the user aborts the input by sending a interrupt signal, this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the text to show for the prompt. + :param default: the default value to use if no input happens. If this + is not given it will prompt until it's aborted. + :param hide_input: if this is set to true then the input value will + be hidden. + :param confirmation_prompt: Prompt a second time to confirm the + value. Can be set to a string instead of ``True`` to customize + the message. + :param type: the type to use to check the value against. + :param value_proc: if this parameter is provided it's a function that + is invoked instead of the type conversion to + convert a value. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + :param show_choices: Show or hide choices if the passed type is a Choice. + For example if type is a Choice of either day or week, + show_choices is true and text is "Group by" then the + prompt will be "Group by (day, week): ". + + .. versionadded:: 8.0 + ``confirmation_prompt`` can be a custom string. + + .. versionadded:: 7.0 + Added the ``show_choices`` parameter. + + .. versionadded:: 6.0 + Added unicode support for cmd.exe on Windows. + + .. versionadded:: 4.0 + Added the `err` parameter. + + """ + + def prompt_func(text: str) -> str: + f = hidden_prompt_func if hide_input else visible_prompt_func + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(text.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + return f(" ") + except (KeyboardInterrupt, EOFError): + # getpass doesn't print a newline if the user aborts input with ^C. + # Allegedly this behavior is inherited from getpass(3). + # A doc bug has been filed at https://bugs.python.org/issue24711 + if hide_input: + echo(None, err=err) + raise Abort() from None + + if value_proc is None: + value_proc = convert_type(type, default) + + prompt = _build_prompt( + text, prompt_suffix, show_default, default, show_choices, type + ) + + if confirmation_prompt: + if confirmation_prompt is True: + confirmation_prompt = _("Repeat for confirmation") + + confirmation_prompt = t.cast(str, confirmation_prompt) + confirmation_prompt = _build_prompt(confirmation_prompt, prompt_suffix) + + while True: + while True: + value = prompt_func(prompt) + if value: + break + elif default is not None: + value = default + break + try: + result = value_proc(value) + except UsageError as e: + if hide_input: + echo(_("Error: The value you entered was invalid."), err=err) + else: + echo(_("Error: {e.message}").format(e=e), err=err) # noqa: B306 + continue + if not confirmation_prompt: + return result + while True: + confirmation_prompt = t.cast(str, confirmation_prompt) + value2 = prompt_func(confirmation_prompt) + if value2: + break + if value == value2: + return result + echo(_("Error: The two entered values do not match."), err=err) + + +def confirm( + text: str, + default: t.Optional[bool] = False, + abort: bool = False, + prompt_suffix: str = ": ", + show_default: bool = True, + err: bool = False, +) -> bool: + """Prompts for confirmation (yes/no question). + + If the user aborts the input by sending a interrupt signal this + function will catch it and raise a :exc:`Abort` exception. + + :param text: the question to ask. + :param default: The default value to use when no input is given. If + ``None``, repeat until input is given. + :param abort: if this is set to `True` a negative answer aborts the + exception by raising :exc:`Abort`. + :param prompt_suffix: a suffix that should be added to the prompt. + :param show_default: shows or hides the default value in the prompt. + :param err: if set to true the file defaults to ``stderr`` instead of + ``stdout``, the same as with echo. + + .. versionchanged:: 8.0 + Repeat until input is given if ``default`` is ``None``. + + .. versionadded:: 4.0 + Added the ``err`` parameter. + """ + prompt = _build_prompt( + text, + prompt_suffix, + show_default, + "y/n" if default is None else ("Y/n" if default else "y/N"), + ) + + while True: + try: + # Write the prompt separately so that we get nice + # coloring through colorama on Windows + echo(prompt.rstrip(" "), nl=False, err=err) + # Echo a space to stdout to work around an issue where + # readline causes backspace to clear the whole line. + value = visible_prompt_func(" ").lower().strip() + except (KeyboardInterrupt, EOFError): + raise Abort() from None + if value in ("y", "yes"): + rv = True + elif value in ("n", "no"): + rv = False + elif default is not None and value == "": + rv = default + else: + echo(_("Error: invalid input"), err=err) + continue + break + if abort and not rv: + raise Abort() + return rv + + +def get_terminal_size() -> os.terminal_size: + """Returns the current size of the terminal as tuple in the form + ``(width, height)`` in columns and rows. + + .. deprecated:: 8.0 + Will be removed in Click 8.1. Use + :func:`shutil.get_terminal_size` instead. + """ + import shutil + import warnings + + warnings.warn( + "'click.get_terminal_size()' is deprecated and will be removed" + " in Click 8.1. Use 'shutil.get_terminal_size()' instead.", + DeprecationWarning, + stacklevel=2, + ) + return shutil.get_terminal_size() + + +def echo_via_pager( + text_or_generator: t.Union[t.Iterable[str], t.Callable[[], t.Iterable[str]], str], + color: t.Optional[bool] = None, +) -> None: + """This function takes a text and shows it via an environment specific + pager on stdout. + + .. versionchanged:: 3.0 + Added the `color` flag. + + :param text_or_generator: the text to page, or alternatively, a + generator emitting the text to page. + :param color: controls if the pager supports ANSI colors or not. The + default is autodetection. + """ + color = resolve_color_default(color) + + if inspect.isgeneratorfunction(text_or_generator): + i = t.cast(t.Callable[[], t.Iterable[str]], text_or_generator)() + elif isinstance(text_or_generator, str): + i = [text_or_generator] + else: + i = iter(t.cast(t.Iterable[str], text_or_generator)) + + # convert every element of i to a text type if necessary + text_generator = (el if isinstance(el, str) else str(el) for el in i) + + from ._termui_impl import pager + + return pager(itertools.chain(text_generator, "\n"), color) + + +def progressbar( + iterable: t.Optional[t.Iterable[V]] = None, + length: t.Optional[int] = None, + label: t.Optional[str] = None, + show_eta: bool = True, + show_percent: t.Optional[bool] = None, + show_pos: bool = False, + item_show_func: t.Optional[t.Callable[[t.Optional[V]], t.Optional[str]]] = None, + fill_char: str = "#", + empty_char: str = "-", + bar_template: str = "%(label)s [%(bar)s] %(info)s", + info_sep: str = " ", + width: int = 36, + file: t.Optional[t.TextIO] = None, + color: t.Optional[bool] = None, + update_min_steps: int = 1, +) -> "ProgressBar[V]": + """This function creates an iterable context manager that can be used + to iterate over something while showing a progress bar. It will + either iterate over the `iterable` or `length` items (that are counted + up). While iteration happens, this function will print a rendered + progress bar to the given `file` (defaults to stdout) and will attempt + to calculate remaining time and more. By default, this progress bar + will not be rendered if the file is not a terminal. + + The context manager creates the progress bar. When the context + manager is entered the progress bar is already created. With every + iteration over the progress bar, the iterable passed to the bar is + advanced and the bar is updated. When the context manager exits, + a newline is printed and the progress bar is finalized on screen. + + Note: The progress bar is currently designed for use cases where the + total progress can be expected to take at least several seconds. + Because of this, the ProgressBar class object won't display + progress that is considered too fast, and progress where the time + between steps is less than a second. + + No printing must happen or the progress bar will be unintentionally + destroyed. + + Example usage:: + + with progressbar(items) as bar: + for item in bar: + do_something_with(item) + + Alternatively, if no iterable is specified, one can manually update the + progress bar through the `update()` method instead of directly + iterating over the progress bar. The update method accepts the number + of steps to increment the bar with:: + + with progressbar(length=chunks.total_bytes) as bar: + for chunk in chunks: + process_chunk(chunk) + bar.update(chunks.bytes) + + The ``update()`` method also takes an optional value specifying the + ``current_item`` at the new position. This is useful when used + together with ``item_show_func`` to customize the output for each + manual step:: + + with click.progressbar( + length=total_size, + label='Unzipping archive', + item_show_func=lambda a: a.filename + ) as bar: + for archive in zip_file: + archive.extract() + bar.update(archive.size, archive) + + :param iterable: an iterable to iterate over. If not provided the length + is required. + :param length: the number of items to iterate over. By default the + progressbar will attempt to ask the iterator about its + length, which might or might not work. If an iterable is + also provided this parameter can be used to override the + length. If an iterable is not provided the progress bar + will iterate over a range of that length. + :param label: the label to show next to the progress bar. + :param show_eta: enables or disables the estimated time display. This is + automatically disabled if the length cannot be + determined. + :param show_percent: enables or disables the percentage display. The + default is `True` if the iterable has a length or + `False` if not. + :param show_pos: enables or disables the absolute position display. The + default is `False`. + :param item_show_func: A function called with the current item which + can return a string to show next to the progress bar. If the + function returns ``None`` nothing is shown. The current item can + be ``None``, such as when entering and exiting the bar. + :param fill_char: the character to use to show the filled part of the + progress bar. + :param empty_char: the character to use to show the non-filled part of + the progress bar. + :param bar_template: the format string to use as template for the bar. + The parameters in it are ``label`` for the label, + ``bar`` for the progress bar and ``info`` for the + info section. + :param info_sep: the separator between multiple info items (eta etc.) + :param width: the width of the progress bar in characters, 0 means full + terminal width + :param file: The file to write to. If this is not a terminal then + only the label is printed. + :param color: controls if the terminal supports ANSI colors or not. The + default is autodetection. This is only needed if ANSI + codes are included anywhere in the progress bar output + which is not the case by default. + :param update_min_steps: Render only when this many updates have + completed. This allows tuning for very fast iterators. + + .. versionchanged:: 8.0 + Output is shown even if execution time is less than 0.5 seconds. + + .. versionchanged:: 8.0 + ``item_show_func`` shows the current item, not the previous one. + + .. versionchanged:: 8.0 + Labels are echoed if the output is not a TTY. Reverts a change + in 7.0 that removed all output. + + .. versionadded:: 8.0 + Added the ``update_min_steps`` parameter. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. Added the ``update`` method to + the object. + + .. versionadded:: 2.0 + """ + from ._termui_impl import ProgressBar + + color = resolve_color_default(color) + return ProgressBar( + iterable=iterable, + length=length, + show_eta=show_eta, + show_percent=show_percent, + show_pos=show_pos, + item_show_func=item_show_func, + fill_char=fill_char, + empty_char=empty_char, + bar_template=bar_template, + info_sep=info_sep, + file=file, + label=label, + width=width, + color=color, + update_min_steps=update_min_steps, + ) + + +def clear() -> None: + """Clears the terminal screen. This will have the effect of clearing + the whole visible space of the terminal and moving the cursor to the + top left. This does not do anything if not connected to a terminal. + + .. versionadded:: 2.0 + """ + if not isatty(sys.stdout): + return + if WIN: + os.system("cls") + else: + sys.stdout.write("\033[2J\033[1;1H") + + +def _interpret_color( + color: t.Union[int, t.Tuple[int, int, int], str], offset: int = 0 +) -> str: + if isinstance(color, int): + return f"{38 + offset};5;{color:d}" + + if isinstance(color, (tuple, list)): + r, g, b = color + return f"{38 + offset};2;{r:d};{g:d};{b:d}" + + return str(_ansi_colors[color] + offset) + + +def style( + text: t.Any, + fg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bg: t.Optional[t.Union[int, t.Tuple[int, int, int], str]] = None, + bold: t.Optional[bool] = None, + dim: t.Optional[bool] = None, + underline: t.Optional[bool] = None, + overline: t.Optional[bool] = None, + italic: t.Optional[bool] = None, + blink: t.Optional[bool] = None, + reverse: t.Optional[bool] = None, + strikethrough: t.Optional[bool] = None, + reset: bool = True, +) -> str: + """Styles a text with ANSI styles and returns the new string. By + default the styling is self contained which means that at the end + of the string a reset code is issued. This can be prevented by + passing ``reset=False``. + + Examples:: + + click.echo(click.style('Hello World!', fg='green')) + click.echo(click.style('ATTENTION!', blink=True)) + click.echo(click.style('Some things', reverse=True, fg='cyan')) + click.echo(click.style('More colors', fg=(255, 12, 128), bg=117)) + + Supported color names: + + * ``black`` (might be a gray) + * ``red`` + * ``green`` + * ``yellow`` (might be an orange) + * ``blue`` + * ``magenta`` + * ``cyan`` + * ``white`` (might be light gray) + * ``bright_black`` + * ``bright_red`` + * ``bright_green`` + * ``bright_yellow`` + * ``bright_blue`` + * ``bright_magenta`` + * ``bright_cyan`` + * ``bright_white`` + * ``reset`` (reset the color code only) + + If the terminal supports it, color may also be specified as: + + - An integer in the interval [0, 255]. The terminal must support + 8-bit/256-color mode. + - An RGB tuple of three integers in [0, 255]. The terminal must + support 24-bit/true-color mode. + + See https://en.wikipedia.org/wiki/ANSI_color and + https://gist.github.com/XVilka/8346728 for more information. + + :param text: the string to style with ansi codes. + :param fg: if provided this will become the foreground color. + :param bg: if provided this will become the background color. + :param bold: if provided this will enable or disable bold mode. + :param dim: if provided this will enable or disable dim mode. This is + badly supported. + :param underline: if provided this will enable or disable underline. + :param overline: if provided this will enable or disable overline. + :param italic: if provided this will enable or disable italic. + :param blink: if provided this will enable or disable blinking. + :param reverse: if provided this will enable or disable inverse + rendering (foreground becomes background and the + other way round). + :param strikethrough: if provided this will enable or disable + striking through text. + :param reset: by default a reset-all code is added at the end of the + string which means that styles do not carry over. This + can be disabled to compose styles. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. + + .. versionchanged:: 8.0 + Added support for 256 and RGB color codes. + + .. versionchanged:: 8.0 + Added the ``strikethrough``, ``italic``, and ``overline`` + parameters. + + .. versionchanged:: 7.0 + Added support for bright colors. + + .. versionadded:: 2.0 + """ + if not isinstance(text, str): + text = str(text) + + bits = [] + + if fg: + try: + bits.append(f"\033[{_interpret_color(fg)}m") + except KeyError: + raise TypeError(f"Unknown color {fg!r}") from None + + if bg: + try: + bits.append(f"\033[{_interpret_color(bg, 10)}m") + except KeyError: + raise TypeError(f"Unknown color {bg!r}") from None + + if bold is not None: + bits.append(f"\033[{1 if bold else 22}m") + if dim is not None: + bits.append(f"\033[{2 if dim else 22}m") + if underline is not None: + bits.append(f"\033[{4 if underline else 24}m") + if overline is not None: + bits.append(f"\033[{53 if overline else 55}m") + if italic is not None: + bits.append(f"\033[{3 if italic else 23}m") + if blink is not None: + bits.append(f"\033[{5 if blink else 25}m") + if reverse is not None: + bits.append(f"\033[{7 if reverse else 27}m") + if strikethrough is not None: + bits.append(f"\033[{9 if strikethrough else 29}m") + bits.append(text) + if reset: + bits.append(_ansi_reset_all) + return "".join(bits) + + +def unstyle(text: str) -> str: + """Removes ANSI styling information from a string. Usually it's not + necessary to use this function as Click's echo function will + automatically remove styling if necessary. + + .. versionadded:: 2.0 + + :param text: the text to remove style information from. + """ + return strip_ansi(text) + + +def secho( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, + **styles: t.Any, +) -> None: + """This function combines :func:`echo` and :func:`style` into one + call. As such the following two calls are the same:: + + click.secho('Hello World!', fg='green') + click.echo(click.style('Hello World!', fg='green')) + + All keyword arguments are forwarded to the underlying functions + depending on which one they go with. + + Non-string types will be converted to :class:`str`. However, + :class:`bytes` are passed directly to :meth:`echo` without applying + style. If you want to style bytes that represent text, call + :meth:`bytes.decode` first. + + .. versionchanged:: 8.0 + A non-string ``message`` is converted to a string. Bytes are + passed through without style applied. + + .. versionadded:: 2.0 + """ + if message is not None and not isinstance(message, (bytes, bytearray)): + message = style(message, **styles) + + return echo(message, file=file, nl=nl, err=err, color=color) + + +def edit( + text: t.Optional[t.AnyStr] = None, + editor: t.Optional[str] = None, + env: t.Optional[t.Mapping[str, str]] = None, + require_save: bool = True, + extension: str = ".txt", + filename: t.Optional[str] = None, +) -> t.Optional[t.AnyStr]: + r"""Edits the given text in the defined editor. If an editor is given + (should be the full path to the executable but the regular operating + system search path is used for finding the executable) it overrides + the detected editor. Optionally, some environment variables can be + used. If the editor is closed without changes, `None` is returned. In + case a file is edited directly the return value is always `None` and + `require_save` and `extension` are ignored. + + If the editor cannot be opened a :exc:`UsageError` is raised. + + Note for Windows: to simplify cross-platform usage, the newlines are + automatically converted from POSIX to Windows and vice versa. As such, + the message here will have ``\n`` as newline markers. + + :param text: the text to edit. + :param editor: optionally the editor to use. Defaults to automatic + detection. + :param env: environment variables to forward to the editor. + :param require_save: if this is true, then not saving in the editor + will make the return value become `None`. + :param extension: the extension to tell the editor about. This defaults + to `.txt` but changing this might change syntax + highlighting. + :param filename: if provided it will edit this file instead of the + provided text contents. It will not use a temporary + file as an indirection in that case. + """ + from ._termui_impl import Editor + + ed = Editor(editor=editor, env=env, require_save=require_save, extension=extension) + + if filename is None: + return ed.edit(text) + + ed.edit_file(filename) + return None + + +def launch(url: str, wait: bool = False, locate: bool = False) -> int: + """This function launches the given URL (or filename) in the default + viewer application for this file type. If this is an executable, it + might launch the executable in a new session. The return value is + the exit code of the launched application. Usually, ``0`` indicates + success. + + Examples:: + + click.launch('https://click.palletsprojects.com/') + click.launch('/my/downloaded/file', locate=True) + + .. versionadded:: 2.0 + + :param url: URL or filename of the thing to launch. + :param wait: Wait for the program to exit before returning. This + only works if the launched program blocks. In particular, + ``xdg-open`` on Linux does not block. + :param locate: if this is set to `True` then instead of launching the + application associated with the URL it will attempt to + launch a file manager with the file located. This + might have weird effects if the URL does not point to + the filesystem. + """ + from ._termui_impl import open_url + + return open_url(url, wait=wait, locate=locate) + + +# If this is provided, getchar() calls into this instead. This is used +# for unittesting purposes. +_getchar: t.Optional[t.Callable[[bool], str]] = None + + +def getchar(echo: bool = False) -> str: + """Fetches a single character from the terminal and returns it. This + will always return a unicode character and under certain rare + circumstances this might return more than one character. The + situations which more than one character is returned is when for + whatever reason multiple characters end up in the terminal buffer or + standard input was not actually a terminal. + + Note that this will always read from the terminal, even if something + is piped into the standard input. + + Note for Windows: in rare cases when typing non-ASCII characters, this + function might wait for a second character and then return both at once. + This is because certain Unicode characters look like special-key markers. + + .. versionadded:: 2.0 + + :param echo: if set to `True`, the character read will also show up on + the terminal. The default is to not show it. + """ + global _getchar + + if _getchar is None: + from ._termui_impl import getchar as f + + _getchar = f + + return _getchar(echo) + + +def raw_terminal() -> t.ContextManager[int]: + from ._termui_impl import raw_terminal as f + + return f() + + +def pause(info: t.Optional[str] = None, err: bool = False) -> None: + """This command stops execution and waits for the user to press any + key to continue. This is similar to the Windows batch "pause" + command. If the program is not run through a terminal, this command + will instead do nothing. + + .. versionadded:: 2.0 + + .. versionadded:: 4.0 + Added the `err` parameter. + + :param info: The message to print before pausing. Defaults to + ``"Press any key to continue..."``. + :param err: if set to message goes to ``stderr`` instead of + ``stdout``, the same as with echo. + """ + if not isatty(sys.stdin) or not isatty(sys.stdout): + return + + if info is None: + info = _("Press any key to continue...") + + try: + if info: + echo(info, nl=False, err=err) + try: + getchar() + except (KeyboardInterrupt, EOFError): + pass + finally: + if info: + echo(err=err) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/testing.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/testing.py new file mode 100644 index 00000000..d19b850f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/testing.py @@ -0,0 +1,479 @@ +import contextlib +import io +import os +import shlex +import shutil +import sys +import tempfile +import typing as t +from types import TracebackType + +from . import formatting +from . import termui +from . import utils +from ._compat import _find_binary_reader + +if t.TYPE_CHECKING: + from .core import BaseCommand + + +class EchoingStdin: + def __init__(self, input: t.BinaryIO, output: t.BinaryIO) -> None: + self._input = input + self._output = output + self._paused = False + + def __getattr__(self, x: str) -> t.Any: + return getattr(self._input, x) + + def _echo(self, rv: bytes) -> bytes: + if not self._paused: + self._output.write(rv) + + return rv + + def read(self, n: int = -1) -> bytes: + return self._echo(self._input.read(n)) + + def read1(self, n: int = -1) -> bytes: + return self._echo(self._input.read1(n)) # type: ignore + + def readline(self, n: int = -1) -> bytes: + return self._echo(self._input.readline(n)) + + def readlines(self) -> t.List[bytes]: + return [self._echo(x) for x in self._input.readlines()] + + def __iter__(self) -> t.Iterator[bytes]: + return iter(self._echo(x) for x in self._input) + + def __repr__(self) -> str: + return repr(self._input) + + +@contextlib.contextmanager +def _pause_echo(stream: t.Optional[EchoingStdin]) -> t.Iterator[None]: + if stream is None: + yield + else: + stream._paused = True + yield + stream._paused = False + + +class _NamedTextIOWrapper(io.TextIOWrapper): + def __init__( + self, buffer: t.BinaryIO, name: str, mode: str, **kwargs: t.Any + ) -> None: + super().__init__(buffer, **kwargs) + self._name = name + self._mode = mode + + @property + def name(self) -> str: + return self._name + + @property + def mode(self) -> str: + return self._mode + + +def make_input_stream( + input: t.Optional[t.Union[str, bytes, t.IO]], charset: str +) -> t.BinaryIO: + # Is already an input stream. + if hasattr(input, "read"): + rv = _find_binary_reader(t.cast(t.IO, input)) + + if rv is not None: + return rv + + raise TypeError("Could not find binary reader for input stream.") + + if input is None: + input = b"" + elif isinstance(input, str): + input = input.encode(charset) + + return io.BytesIO(t.cast(bytes, input)) + + +class Result: + """Holds the captured result of an invoked CLI script.""" + + def __init__( + self, + runner: "CliRunner", + stdout_bytes: bytes, + stderr_bytes: t.Optional[bytes], + return_value: t.Any, + exit_code: int, + exception: t.Optional[BaseException], + exc_info: t.Optional[ + t.Tuple[t.Type[BaseException], BaseException, TracebackType] + ] = None, + ): + #: The runner that created the result + self.runner = runner + #: The standard output as bytes. + self.stdout_bytes = stdout_bytes + #: The standard error as bytes, or None if not available + self.stderr_bytes = stderr_bytes + #: The value returned from the invoked command. + #: + #: .. versionadded:: 8.0 + self.return_value = return_value + #: The exit code as integer. + self.exit_code = exit_code + #: The exception that happened if one did. + self.exception = exception + #: The traceback + self.exc_info = exc_info + + @property + def output(self) -> str: + """The (standard) output as unicode string.""" + return self.stdout + + @property + def stdout(self) -> str: + """The standard output as unicode string.""" + return self.stdout_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + @property + def stderr(self) -> str: + """The standard error as unicode string.""" + if self.stderr_bytes is None: + raise ValueError("stderr not separately captured") + return self.stderr_bytes.decode(self.runner.charset, "replace").replace( + "\r\n", "\n" + ) + + def __repr__(self) -> str: + exc_str = repr(self.exception) if self.exception else "okay" + return f"<{type(self).__name__} {exc_str}>" + + +class CliRunner: + """The CLI runner provides functionality to invoke a Click command line + script for unittesting purposes in a isolated environment. This only + works in single-threaded systems without any concurrency as it changes the + global interpreter state. + + :param charset: the character set for the input and output data. + :param env: a dictionary with environment variables for overriding. + :param echo_stdin: if this is set to `True`, then reading from stdin writes + to stdout. This is useful for showing examples in + some circumstances. Note that regular prompts + will automatically echo the input. + :param mix_stderr: if this is set to `False`, then stdout and stderr are + preserved as independent streams. This is useful for + Unix-philosophy apps that have predictable stdout and + noisy stderr, such that each may be measured + independently + """ + + def __init__( + self, + charset: str = "utf-8", + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + echo_stdin: bool = False, + mix_stderr: bool = True, + ) -> None: + self.charset = charset + self.env = env or {} + self.echo_stdin = echo_stdin + self.mix_stderr = mix_stderr + + def get_default_prog_name(self, cli: "BaseCommand") -> str: + """Given a command object it will return the default program name + for it. The default is the `name` attribute or ``"root"`` if not + set. + """ + return cli.name or "root" + + def make_env( + self, overrides: t.Optional[t.Mapping[str, t.Optional[str]]] = None + ) -> t.Mapping[str, t.Optional[str]]: + """Returns the environment overrides for invoking a script.""" + rv = dict(self.env) + if overrides: + rv.update(overrides) + return rv + + @contextlib.contextmanager + def isolation( + self, + input: t.Optional[t.Union[str, bytes, t.IO]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + color: bool = False, + ) -> t.Iterator[t.Tuple[io.BytesIO, t.Optional[io.BytesIO]]]: + """A context manager that sets up the isolation for invoking of a + command line tool. This sets up stdin with the given input data + and `os.environ` with the overrides from the given dictionary. + This also rebinds some internals in Click to be mocked (like the + prompt functionality). + + This is automatically done in the :meth:`invoke` method. + + :param input: the input stream to put into sys.stdin. + :param env: the environment overrides as dictionary. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + ``stderr`` is opened with ``errors="backslashreplace"`` + instead of the default ``"strict"``. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + """ + bytes_input = make_input_stream(input, self.charset) + echo_input = None + + old_stdin = sys.stdin + old_stdout = sys.stdout + old_stderr = sys.stderr + old_forced_width = formatting.FORCED_WIDTH + formatting.FORCED_WIDTH = 80 + + env = self.make_env(env) + + bytes_output = io.BytesIO() + + if self.echo_stdin: + bytes_input = echo_input = t.cast( + t.BinaryIO, EchoingStdin(bytes_input, bytes_output) + ) + + sys.stdin = text_input = _NamedTextIOWrapper( + bytes_input, encoding=self.charset, name="", mode="r" + ) + + if self.echo_stdin: + # Force unbuffered reads, otherwise TextIOWrapper reads a + # large chunk which is echoed early. + text_input._CHUNK_SIZE = 1 # type: ignore + + sys.stdout = _NamedTextIOWrapper( + bytes_output, encoding=self.charset, name="", mode="w" + ) + + bytes_error = None + if self.mix_stderr: + sys.stderr = sys.stdout + else: + bytes_error = io.BytesIO() + sys.stderr = _NamedTextIOWrapper( + bytes_error, + encoding=self.charset, + name="", + mode="w", + errors="backslashreplace", + ) + + @_pause_echo(echo_input) # type: ignore + def visible_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(prompt or "") + val = text_input.readline().rstrip("\r\n") + sys.stdout.write(f"{val}\n") + sys.stdout.flush() + return val + + @_pause_echo(echo_input) # type: ignore + def hidden_input(prompt: t.Optional[str] = None) -> str: + sys.stdout.write(f"{prompt or ''}\n") + sys.stdout.flush() + return text_input.readline().rstrip("\r\n") + + @_pause_echo(echo_input) # type: ignore + def _getchar(echo: bool) -> str: + char = sys.stdin.read(1) + + if echo: + sys.stdout.write(char) + + sys.stdout.flush() + return char + + default_color = color + + def should_strip_ansi( + stream: t.Optional[t.IO] = None, color: t.Optional[bool] = None + ) -> bool: + if color is None: + return not default_color + return not color + + old_visible_prompt_func = termui.visible_prompt_func + old_hidden_prompt_func = termui.hidden_prompt_func + old__getchar_func = termui._getchar + old_should_strip_ansi = utils.should_strip_ansi # type: ignore + termui.visible_prompt_func = visible_input + termui.hidden_prompt_func = hidden_input + termui._getchar = _getchar + utils.should_strip_ansi = should_strip_ansi # type: ignore + + old_env = {} + try: + for key, value in env.items(): + old_env[key] = os.environ.get(key) + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + yield (bytes_output, bytes_error) + finally: + for key, value in old_env.items(): + if value is None: + try: + del os.environ[key] + except Exception: + pass + else: + os.environ[key] = value + sys.stdout = old_stdout + sys.stderr = old_stderr + sys.stdin = old_stdin + termui.visible_prompt_func = old_visible_prompt_func + termui.hidden_prompt_func = old_hidden_prompt_func + termui._getchar = old__getchar_func + utils.should_strip_ansi = old_should_strip_ansi # type: ignore + formatting.FORCED_WIDTH = old_forced_width + + def invoke( + self, + cli: "BaseCommand", + args: t.Optional[t.Union[str, t.Sequence[str]]] = None, + input: t.Optional[t.Union[str, bytes, t.IO]] = None, + env: t.Optional[t.Mapping[str, t.Optional[str]]] = None, + catch_exceptions: bool = True, + color: bool = False, + **extra: t.Any, + ) -> Result: + """Invokes a command in an isolated environment. The arguments are + forwarded directly to the command line script, the `extra` keyword + arguments are passed to the :meth:`~clickpkg.Command.main` function of + the command. + + This returns a :class:`Result` object. + + :param cli: the command to invoke + :param args: the arguments to invoke. It may be given as an iterable + or a string. When given as string it will be interpreted + as a Unix shell command. More details at + :func:`shlex.split`. + :param input: the input data for `sys.stdin`. + :param env: the environment overrides. + :param catch_exceptions: Whether to catch any other exceptions than + ``SystemExit``. + :param extra: the keyword arguments to pass to :meth:`main`. + :param color: whether the output should contain color codes. The + application can still override this explicitly. + + .. versionchanged:: 8.0 + The result object has the ``return_value`` attribute with + the value returned from the invoked command. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionchanged:: 3.0 + Added the ``catch_exceptions`` parameter. + + .. versionchanged:: 3.0 + The result object has the ``exc_info`` attribute with the + traceback if available. + """ + exc_info = None + with self.isolation(input=input, env=env, color=color) as outstreams: + return_value = None + exception: t.Optional[BaseException] = None + exit_code = 0 + + if isinstance(args, str): + args = shlex.split(args) + + try: + prog_name = extra.pop("prog_name") + except KeyError: + prog_name = self.get_default_prog_name(cli) + + try: + return_value = cli.main(args=args or (), prog_name=prog_name, **extra) + except SystemExit as e: + exc_info = sys.exc_info() + e_code = t.cast(t.Optional[t.Union[int, t.Any]], e.code) + + if e_code is None: + e_code = 0 + + if e_code != 0: + exception = e + + if not isinstance(e_code, int): + sys.stdout.write(str(e_code)) + sys.stdout.write("\n") + e_code = 1 + + exit_code = e_code + + except Exception as e: + if not catch_exceptions: + raise + exception = e + exit_code = 1 + exc_info = sys.exc_info() + finally: + sys.stdout.flush() + stdout = outstreams[0].getvalue() + if self.mix_stderr: + stderr = None + else: + stderr = outstreams[1].getvalue() # type: ignore + + return Result( + runner=self, + stdout_bytes=stdout, + stderr_bytes=stderr, + return_value=return_value, + exit_code=exit_code, + exception=exception, + exc_info=exc_info, # type: ignore + ) + + @contextlib.contextmanager + def isolated_filesystem( + self, temp_dir: t.Optional[t.Union[str, os.PathLike]] = None + ) -> t.Iterator[str]: + """A context manager that creates a temporary directory and + changes the current working directory to it. This isolates tests + that affect the contents of the CWD to prevent them from + interfering with each other. + + :param temp_dir: Create the temporary directory under this + directory. If given, the created directory is not removed + when exiting. + + .. versionchanged:: 8.0 + Added the ``temp_dir`` parameter. + """ + cwd = os.getcwd() + t = tempfile.mkdtemp(dir=temp_dir) + os.chdir(t) + + try: + yield t + finally: + os.chdir(cwd) + + if temp_dir is None: + try: + shutil.rmtree(t) + except OSError: # noqa: B014 + pass diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/types.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/types.py new file mode 100644 index 00000000..103d2182 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/types.py @@ -0,0 +1,1052 @@ +import os +import stat +import typing as t +from datetime import datetime +from gettext import gettext as _ +from gettext import ngettext + +from ._compat import _get_argv_encoding +from ._compat import get_filesystem_encoding +from ._compat import open_stream +from .exceptions import BadParameter +from .utils import LazyFile +from .utils import safecall + +if t.TYPE_CHECKING: + import typing_extensions as te + from .core import Context + from .core import Parameter + from .shell_completion import CompletionItem + + +class ParamType: + """Represents the type of a parameter. Validates and converts values + from the command line or Python into the correct type. + + To implement a custom type, subclass and implement at least the + following: + + - The :attr:`name` class attribute must be set. + - Calling an instance of the type with ``None`` must return + ``None``. This is already implemented by default. + - :meth:`convert` must convert string values to the correct type. + - :meth:`convert` must accept values that are already the correct + type. + - It must be able to convert a value if the ``ctx`` and ``param`` + arguments are ``None``. This can occur when converting prompt + input. + """ + + is_composite: t.ClassVar[bool] = False + arity: t.ClassVar[int] = 1 + + #: the descriptive name of this type + name: str + + #: if a list of this type is expected and the value is pulled from a + #: string environment variable, this is what splits it up. `None` + #: means any whitespace. For all parameters the general rule is that + #: whitespace splits them up. The exception are paths and files which + #: are split by ``os.path.pathsep`` by default (":" on Unix and ";" on + #: Windows). + envvar_list_splitter: t.ClassVar[t.Optional[str]] = None + + def to_info_dict(self) -> t.Dict[str, t.Any]: + """Gather information that could be useful for a tool generating + user-facing documentation. + + Use :meth:`click.Context.to_info_dict` to traverse the entire + CLI structure. + + .. versionadded:: 8.0 + """ + # The class name without the "ParamType" suffix. + param_type = type(self).__name__.partition("ParamType")[0] + param_type = param_type.partition("ParameterType")[0] + return {"param_type": param_type, "name": self.name} + + def __call__( + self, + value: t.Any, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> t.Any: + if value is not None: + return self.convert(value, param, ctx) + + def get_metavar(self, param: "Parameter") -> t.Optional[str]: + """Returns the metavar default for this param if it provides one.""" + + def get_missing_message(self, param: "Parameter") -> t.Optional[str]: + """Optionally might return extra information about a missing + parameter. + + .. versionadded:: 2.0 + """ + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + """Convert the value to the correct type. This is not called if + the value is ``None`` (the missing value). + + This must accept string values from the command line, as well as + values that are already the correct type. It may also convert + other compatible types. + + The ``param`` and ``ctx`` arguments may be ``None`` in certain + situations, such as when converting prompt input. + + If the value cannot be converted, call :meth:`fail` with a + descriptive message. + + :param value: The value to convert. + :param param: The parameter that is using this type to convert + its value. May be ``None``. + :param ctx: The current context that arrived at this value. May + be ``None``. + """ + return value + + def split_envvar_value(self, rv: str) -> t.Sequence[str]: + """Given a value from an environment variable this splits it up + into small chunks depending on the defined envvar list splitter. + + If the splitter is set to `None`, which means that whitespace splits, + then leading and trailing whitespace is ignored. Otherwise, leading + and trailing splitters usually lead to empty items being included. + """ + return (rv or "").split(self.envvar_list_splitter) + + def fail( + self, + message: str, + param: t.Optional["Parameter"] = None, + ctx: t.Optional["Context"] = None, + ) -> "t.NoReturn": + """Helper method to fail with an invalid value message.""" + raise BadParameter(message, ctx=ctx, param=param) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a list of + :class:`~click.shell_completion.CompletionItem` objects for the + incomplete value. Most types do not provide completions, but + some do, and this allows custom types to provide custom + completions as well. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + return [] + + +class CompositeParamType(ParamType): + is_composite = True + + @property + def arity(self) -> int: # type: ignore + raise NotImplementedError() + + +class FuncParamType(ParamType): + def __init__(self, func: t.Callable[[t.Any], t.Any]) -> None: + self.name = func.__name__ + self.func = func + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["func"] = self.func + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self.func(value) + except ValueError: + try: + value = str(value) + except UnicodeError: + value = value.decode("utf-8", "replace") + + self.fail(value, param, ctx) + + +class UnprocessedParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + return value + + def __repr__(self) -> str: + return "UNPROCESSED" + + +class StringParamType(ParamType): + name = "text" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, bytes): + enc = _get_argv_encoding() + try: + value = value.decode(enc) + except UnicodeError: + fs_enc = get_filesystem_encoding() + if fs_enc != enc: + try: + value = value.decode(fs_enc) + except UnicodeError: + value = value.decode("utf-8", "replace") + else: + value = value.decode("utf-8", "replace") + return value + return str(value) + + def __repr__(self) -> str: + return "STRING" + + +class Choice(ParamType): + """The choice type allows a value to be checked against a fixed set + of supported values. All of these values have to be strings. + + You should only pass a list or tuple of choices. Other iterables + (like generators) may lead to surprising results. + + The resulting value will always be one of the originally passed choices + regardless of ``case_sensitive`` or any ``ctx.token_normalize_func`` + being specified. + + See :ref:`choice-opts` for an example. + + :param case_sensitive: Set to false to make choices case + insensitive. Defaults to true. + """ + + name = "choice" + + def __init__(self, choices: t.Sequence[str], case_sensitive: bool = True) -> None: + self.choices = choices + self.case_sensitive = case_sensitive + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["choices"] = self.choices + info_dict["case_sensitive"] = self.case_sensitive + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + choices_str = "|".join(self.choices) + + # Use curly braces to indicate a required argument. + if param.required and param.param_type_name == "argument": + return f"{{{choices_str}}}" + + # Use square braces to indicate an option or optional argument. + return f"[{choices_str}]" + + def get_missing_message(self, param: "Parameter") -> str: + return _("Choose from:\n\t{choices}").format(choices=",\n\t".join(self.choices)) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + # Match through normalization and case sensitivity + # first do token_normalize_func, then lowercase + # preserve original `value` to produce an accurate message in + # `self.fail` + normed_value = value + normed_choices = {choice: choice for choice in self.choices} + + if ctx is not None and ctx.token_normalize_func is not None: + normed_value = ctx.token_normalize_func(value) + normed_choices = { + ctx.token_normalize_func(normed_choice): original + for normed_choice, original in normed_choices.items() + } + + if not self.case_sensitive: + normed_value = normed_value.casefold() + normed_choices = { + normed_choice.casefold(): original + for normed_choice, original in normed_choices.items() + } + + if normed_value in normed_choices: + return normed_choices[normed_value] + + choices_str = ", ".join(map(repr, self.choices)) + self.fail( + ngettext( + "{value!r} is not {choice}.", + "{value!r} is not one of {choices}.", + len(self.choices), + ).format(value=value, choice=choices_str, choices=choices_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return f"Choice({list(self.choices)})" + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Complete choices that start with the incomplete value. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + str_choices = map(str, self.choices) + + if self.case_sensitive: + matched = (c for c in str_choices if c.startswith(incomplete)) + else: + incomplete = incomplete.lower() + matched = (c for c in str_choices if c.lower().startswith(incomplete)) + + return [CompletionItem(c) for c in matched] + + +class DateTime(ParamType): + """The DateTime type converts date strings into `datetime` objects. + + The format strings which are checked are configurable, but default to some + common (non-timezone aware) ISO 8601 formats. + + When specifying *DateTime* formats, you should only pass a list or a tuple. + Other iterables, like generators, may lead to surprising results. + + The format strings are processed using ``datetime.strptime``, and this + consequently defines the format strings which are allowed. + + Parsing is tried using each format, in order, and the first format which + parses successfully is used. + + :param formats: A list or tuple of date format strings, in the order in + which they should be tried. Defaults to + ``'%Y-%m-%d'``, ``'%Y-%m-%dT%H:%M:%S'``, + ``'%Y-%m-%d %H:%M:%S'``. + """ + + name = "datetime" + + def __init__(self, formats: t.Optional[t.Sequence[str]] = None): + self.formats = formats or ["%Y-%m-%d", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%d %H:%M:%S"] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["formats"] = self.formats + return info_dict + + def get_metavar(self, param: "Parameter") -> str: + return f"[{'|'.join(self.formats)}]" + + def _try_to_convert_date(self, value: t.Any, format: str) -> t.Optional[datetime]: + try: + return datetime.strptime(value, format) + except ValueError: + return None + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if isinstance(value, datetime): + return value + + for format in self.formats: + converted = self._try_to_convert_date(value, format) + + if converted is not None: + return converted + + formats_str = ", ".join(map(repr, self.formats)) + self.fail( + ngettext( + "{value!r} does not match the format {format}.", + "{value!r} does not match the formats {formats}.", + len(self.formats), + ).format(value=value, format=formats_str, formats=formats_str), + param, + ctx, + ) + + def __repr__(self) -> str: + return "DateTime" + + +class _NumberParamTypeBase(ParamType): + _number_class: t.ClassVar[t.Type] + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + return self._number_class(value) + except ValueError: + self.fail( + _("{value!r} is not a valid {number_type}.").format( + value=value, number_type=self.name + ), + param, + ctx, + ) + + +class _NumberRangeBase(_NumberParamTypeBase): + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + self.min = min + self.max = max + self.min_open = min_open + self.max_open = max_open + self.clamp = clamp + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + min=self.min, + max=self.max, + min_open=self.min_open, + max_open=self.max_open, + clamp=self.clamp, + ) + return info_dict + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import operator + + rv = super().convert(value, param, ctx) + lt_min: bool = self.min is not None and ( + operator.le if self.min_open else operator.lt + )(rv, self.min) + gt_max: bool = self.max is not None and ( + operator.ge if self.max_open else operator.gt + )(rv, self.max) + + if self.clamp: + if lt_min: + return self._clamp(self.min, 1, self.min_open) # type: ignore + + if gt_max: + return self._clamp(self.max, -1, self.max_open) # type: ignore + + if lt_min or gt_max: + self.fail( + _("{value} is not in the range {range}.").format( + value=rv, range=self._describe_range() + ), + param, + ctx, + ) + + return rv + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + """Find the valid value to clamp to bound in the given + direction. + + :param bound: The boundary value. + :param dir: 1 or -1 indicating the direction to move. + :param open: If true, the range does not include the bound. + """ + raise NotImplementedError + + def _describe_range(self) -> str: + """Describe the range for use in help text.""" + if self.min is None: + op = "<" if self.max_open else "<=" + return f"x{op}{self.max}" + + if self.max is None: + op = ">" if self.min_open else ">=" + return f"x{op}{self.min}" + + lop = "<" if self.min_open else "<=" + rop = "<" if self.max_open else "<=" + return f"{self.min}{lop}x{rop}{self.max}" + + def __repr__(self) -> str: + clamp = " clamped" if self.clamp else "" + return f"<{type(self).__name__} {self._describe_range()}{clamp}>" + + +class IntParamType(_NumberParamTypeBase): + name = "integer" + _number_class = int + + def __repr__(self) -> str: + return "INT" + + +class IntRange(_NumberRangeBase, IntParamType): + """Restrict an :data:`click.INT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "integer range" + + def _clamp( # type: ignore + self, bound: int, dir: "te.Literal[1, -1]", open: bool + ) -> int: + if not open: + return bound + + return bound + dir + + +class FloatParamType(_NumberParamTypeBase): + name = "float" + _number_class = float + + def __repr__(self) -> str: + return "FLOAT" + + +class FloatRange(_NumberRangeBase, FloatParamType): + """Restrict a :data:`click.FLOAT` value to a range of accepted + values. See :ref:`ranges`. + + If ``min`` or ``max`` are not passed, any value is accepted in that + direction. If ``min_open`` or ``max_open`` are enabled, the + corresponding boundary is not included in the range. + + If ``clamp`` is enabled, a value outside the range is clamped to the + boundary instead of failing. This is not supported if either + boundary is marked ``open``. + + .. versionchanged:: 8.0 + Added the ``min_open`` and ``max_open`` parameters. + """ + + name = "float range" + + def __init__( + self, + min: t.Optional[float] = None, + max: t.Optional[float] = None, + min_open: bool = False, + max_open: bool = False, + clamp: bool = False, + ) -> None: + super().__init__( + min=min, max=max, min_open=min_open, max_open=max_open, clamp=clamp + ) + + if (min_open or max_open) and clamp: + raise TypeError("Clamping is not supported for open bounds.") + + def _clamp(self, bound: float, dir: "te.Literal[1, -1]", open: bool) -> float: + if not open: + return bound + + # Could use Python 3.9's math.nextafter here, but clamping an + # open float range doesn't seem to be particularly useful. It's + # left up to the user to write a callback to do it if needed. + raise RuntimeError("Clamping is not supported for open bounds.") + + +class BoolParamType(ParamType): + name = "boolean" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + if value in {False, True}: + return bool(value) + + norm = value.strip().lower() + + if norm in {"1", "true", "t", "yes", "y", "on"}: + return True + + if norm in {"0", "false", "f", "no", "n", "off"}: + return False + + self.fail( + _("{value!r} is not a valid boolean.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "BOOL" + + +class UUIDParameterType(ParamType): + name = "uuid" + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + import uuid + + if isinstance(value, uuid.UUID): + return value + + value = value.strip() + + try: + return uuid.UUID(value) + except ValueError: + self.fail( + _("{value!r} is not a valid UUID.").format(value=value), param, ctx + ) + + def __repr__(self) -> str: + return "UUID" + + +class File(ParamType): + """Declares a parameter to be a file for reading or writing. The file + is automatically closed once the context tears down (after the command + finished working). + + Files can be opened for reading or writing. The special value ``-`` + indicates stdin or stdout depending on the mode. + + By default, the file is opened for reading text data, but it can also be + opened in binary mode or for writing. The encoding parameter can be used + to force a specific encoding. + + The `lazy` flag controls if the file should be opened immediately or upon + first IO. The default is to be non-lazy for standard input and output + streams as well as files opened for reading, `lazy` otherwise. When opening a + file lazily for reading, it is still opened temporarily for validation, but + will not be held open until first IO. lazy is mainly useful when opening + for writing to avoid creating the file until it is needed. + + Starting with Click 2.0, files can also be opened atomically in which + case all writes go into a separate file in the same folder and upon + completion the file will be moved over to the original location. This + is useful if a file regularly read by other users is modified. + + See :ref:`file-args` for more information. + """ + + name = "filename" + envvar_list_splitter = os.path.pathsep + + def __init__( + self, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: t.Optional[bool] = None, + atomic: bool = False, + ) -> None: + self.mode = mode + self.encoding = encoding + self.errors = errors + self.lazy = lazy + self.atomic = atomic + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update(mode=self.mode, encoding=self.encoding) + return info_dict + + def resolve_lazy_flag(self, value: t.Any) -> bool: + if self.lazy is not None: + return self.lazy + if value == "-": + return False + elif "w" in self.mode: + return True + return False + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + try: + if hasattr(value, "read") or hasattr(value, "write"): + return value + + lazy = self.resolve_lazy_flag(value) + + if lazy: + f: t.IO = t.cast( + t.IO, + LazyFile( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ), + ) + + if ctx is not None: + ctx.call_on_close(f.close_intelligently) # type: ignore + + return f + + f, should_close = open_stream( + value, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + + # If a context is provided, we automatically close the file + # at the end of the context execution (or flush out). If a + # context does not exist, it's the caller's responsibility to + # properly close the file. This for instance happens when the + # type is used with prompts. + if ctx is not None: + if should_close: + ctx.call_on_close(safecall(f.close)) + else: + ctx.call_on_close(safecall(f.flush)) + + return f + except OSError as e: # noqa: B014 + self.fail(f"{os.fsdecode(value)!r}: {e.strerror}", param, ctx) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide file path completions. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + return [CompletionItem(incomplete, type="file")] + + +class Path(ParamType): + """The path type is similar to the :class:`File` type but it performs + different checks. First of all, instead of returning an open file + handle it returns just the filename. Secondly, it can perform various + basic checks about what the file or directory should be. + + :param exists: if set to true, the file or directory needs to exist for + this value to be valid. If this is not required and a + file does indeed not exist, then all further checks are + silently skipped. + :param file_okay: controls if a file is a possible value. + :param dir_okay: controls if a directory is a possible value. + :param writable: if true, a writable check is performed. + :param readable: if true, a readable check is performed. + :param resolve_path: if this is true, then the path is fully resolved + before the value is passed onwards. This means + that it's absolute and symlinks are resolved. It + will not expand a tilde-prefix, as this is + supposed to be done by the shell only. + :param allow_dash: If this is set to `True`, a single dash to indicate + standard streams is permitted. + :param path_type: Convert the incoming path value to this type. If + ``None``, keep Python's default, which is ``str``. Useful to + convert to :class:`pathlib.Path`. + + .. versionchanged:: 8.0 + Allow passing ``type=pathlib.Path``. + + .. versionchanged:: 6.0 + Added the ``allow_dash`` parameter. + """ + + envvar_list_splitter = os.path.pathsep + + def __init__( + self, + exists: bool = False, + file_okay: bool = True, + dir_okay: bool = True, + writable: bool = False, + readable: bool = True, + resolve_path: bool = False, + allow_dash: bool = False, + path_type: t.Optional[t.Type] = None, + ): + self.exists = exists + self.file_okay = file_okay + self.dir_okay = dir_okay + self.writable = writable + self.readable = readable + self.resolve_path = resolve_path + self.allow_dash = allow_dash + self.type = path_type + + if self.file_okay and not self.dir_okay: + self.name = _("file") + elif self.dir_okay and not self.file_okay: + self.name = _("directory") + else: + self.name = _("path") + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict.update( + exists=self.exists, + file_okay=self.file_okay, + dir_okay=self.dir_okay, + writable=self.writable, + readable=self.readable, + allow_dash=self.allow_dash, + ) + return info_dict + + def coerce_path_result(self, rv: t.Any) -> t.Any: + if self.type is not None and not isinstance(rv, self.type): + if self.type is str: + rv = os.fsdecode(rv) + elif self.type is bytes: + rv = os.fsencode(rv) + else: + rv = self.type(rv) + + return rv + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + rv = value + + is_dash = self.file_okay and self.allow_dash and rv in (b"-", "-") + + if not is_dash: + if self.resolve_path: + # os.path.realpath doesn't resolve symlinks on Windows + # until Python 3.8. Use pathlib for now. + import pathlib + + rv = os.fsdecode(pathlib.Path(rv).resolve()) + + try: + st = os.stat(rv) + except OSError: + if not self.exists: + return self.coerce_path_result(rv) + self.fail( + _("{name} {filename!r} does not exist.").format( + name=self.name.title(), filename=os.fsdecode(value) + ), + param, + ctx, + ) + + if not self.file_okay and stat.S_ISREG(st.st_mode): + self.fail( + _("{name} {filename!r} is a file.").format( + name=self.name.title(), filename=os.fsdecode(value) + ), + param, + ctx, + ) + if not self.dir_okay and stat.S_ISDIR(st.st_mode): + self.fail( + _("{name} {filename!r} is a directory.").format( + name=self.name.title(), filename=os.fsdecode(value) + ), + param, + ctx, + ) + if self.writable and not os.access(rv, os.W_OK): + self.fail( + _("{name} {filename!r} is not writable.").format( + name=self.name.title(), filename=os.fsdecode(value) + ), + param, + ctx, + ) + if self.readable and not os.access(rv, os.R_OK): + self.fail( + _("{name} {filename!r} is not readable.").format( + name=self.name.title(), filename=os.fsdecode(value) + ), + param, + ctx, + ) + + return self.coerce_path_result(rv) + + def shell_complete( + self, ctx: "Context", param: "Parameter", incomplete: str + ) -> t.List["CompletionItem"]: + """Return a special completion marker that tells the completion + system to use the shell to provide path completions for only + directories or any paths. + + :param ctx: Invocation context for this command. + :param param: The parameter that is requesting completion. + :param incomplete: Value being completed. May be empty. + + .. versionadded:: 8.0 + """ + from click.shell_completion import CompletionItem + + type = "dir" if self.dir_okay and not self.file_okay else "file" + return [CompletionItem(incomplete, type=type)] + + +class Tuple(CompositeParamType): + """The default behavior of Click is to apply a type on a value directly. + This works well in most cases, except for when `nargs` is set to a fixed + count and different types should be used for different items. In this + case the :class:`Tuple` type can be used. This type can only be used + if `nargs` is set to a fixed number. + + For more information see :ref:`tuple-type`. + + This can be selected by using a Python tuple literal as a type. + + :param types: a list of types that should be used for the tuple items. + """ + + def __init__(self, types: t.Sequence[t.Union[t.Type, ParamType]]) -> None: + self.types = [convert_type(ty) for ty in types] + + def to_info_dict(self) -> t.Dict[str, t.Any]: + info_dict = super().to_info_dict() + info_dict["types"] = [t.to_info_dict() for t in self.types] + return info_dict + + @property + def name(self) -> str: # type: ignore + return f"<{' '.join(ty.name for ty in self.types)}>" + + @property + def arity(self) -> int: # type: ignore + return len(self.types) + + def convert( + self, value: t.Any, param: t.Optional["Parameter"], ctx: t.Optional["Context"] + ) -> t.Any: + len_type = len(self.types) + len_value = len(value) + + if len_value != len_type: + self.fail( + ngettext( + "{len_type} values are required, but {len_value} was given.", + "{len_type} values are required, but {len_value} were given.", + len_value, + ).format(len_type=len_type, len_value=len_value), + param=param, + ctx=ctx, + ) + + return tuple(ty(x, param, ctx) for ty, x in zip(self.types, value)) + + +def convert_type(ty: t.Optional[t.Any], default: t.Optional[t.Any] = None) -> ParamType: + """Find the most appropriate :class:`ParamType` for the given Python + type. If the type isn't provided, it can be inferred from a default + value. + """ + guessed_type = False + + if ty is None and default is not None: + if isinstance(default, (tuple, list)): + # If the default is empty, ty will remain None and will + # return STRING. + if default: + item = default[0] + + # A tuple of tuples needs to detect the inner types. + # Can't call convert recursively because that would + # incorrectly unwind the tuple to a single type. + if isinstance(item, (tuple, list)): + ty = tuple(map(type, item)) + else: + ty = type(item) + else: + ty = type(default) + + guessed_type = True + + if isinstance(ty, tuple): + return Tuple(ty) + + if isinstance(ty, ParamType): + return ty + + if ty is str or ty is None: + return STRING + + if ty is int: + return INT + + if ty is float: + return FLOAT + + if ty is bool: + return BOOL + + if guessed_type: + return STRING + + if __debug__: + try: + if issubclass(ty, ParamType): + raise AssertionError( + f"Attempted to use an uninstantiated parameter type ({ty})." + ) + except TypeError: + # ty is an instance (correct), so issubclass fails. + pass + + return FuncParamType(ty) + + +#: A dummy parameter type that just does nothing. From a user's +#: perspective this appears to just be the same as `STRING` but +#: internally no string conversion takes place if the input was bytes. +#: This is usually useful when working with file paths as they can +#: appear in bytes and unicode. +#: +#: For path related uses the :class:`Path` type is a better choice but +#: there are situations where an unprocessed type is useful which is why +#: it is is provided. +#: +#: .. versionadded:: 4.0 +UNPROCESSED = UnprocessedParamType() + +#: A unicode string parameter type which is the implicit default. This +#: can also be selected by using ``str`` as type. +STRING = StringParamType() + +#: An integer parameter. This can also be selected by using ``int`` as +#: type. +INT = IntParamType() + +#: A floating point value parameter. This can also be selected by using +#: ``float`` as type. +FLOAT = FloatParamType() + +#: A boolean parameter. This is the default for boolean flags. This can +#: also be selected by using ``bool`` as a type. +BOOL = BoolParamType() + +#: A UUID parameter. +UUID = UUIDParameterType() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/click/utils.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/utils.py new file mode 100644 index 00000000..16033d62 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/click/utils.py @@ -0,0 +1,579 @@ +import os +import sys +import typing as t +from functools import update_wrapper +from types import ModuleType + +from ._compat import _default_text_stderr +from ._compat import _default_text_stdout +from ._compat import _find_binary_writer +from ._compat import auto_wrap_for_ansi +from ._compat import binary_streams +from ._compat import get_filesystem_encoding +from ._compat import open_stream +from ._compat import should_strip_ansi +from ._compat import strip_ansi +from ._compat import text_streams +from ._compat import WIN +from .globals import resolve_color_default + +if t.TYPE_CHECKING: + import typing_extensions as te + +F = t.TypeVar("F", bound=t.Callable[..., t.Any]) + + +def _posixify(name: str) -> str: + return "-".join(name.split()).lower() + + +def safecall(func: F) -> F: + """Wraps a function so that it swallows exceptions.""" + + def wrapper(*args, **kwargs): # type: ignore + try: + return func(*args, **kwargs) + except Exception: + pass + + return update_wrapper(t.cast(F, wrapper), func) + + +def make_str(value: t.Any) -> str: + """Converts a value into a valid string.""" + if isinstance(value, bytes): + try: + return value.decode(get_filesystem_encoding()) + except UnicodeError: + return value.decode("utf-8", "replace") + return str(value) + + +def make_default_short_help(help: str, max_length: int = 45) -> str: + """Returns a condensed version of help string.""" + # Consider only the first paragraph. + paragraph_end = help.find("\n\n") + + if paragraph_end != -1: + help = help[:paragraph_end] + + # Collapse newlines, tabs, and spaces. + words = help.split() + + if not words: + return "" + + # The first paragraph started with a "no rewrap" marker, ignore it. + if words[0] == "\b": + words = words[1:] + + total_length = 0 + last_index = len(words) - 1 + + for i, word in enumerate(words): + total_length += len(word) + (i > 0) + + if total_length > max_length: # too long, truncate + break + + if word[-1] == ".": # sentence end, truncate without "..." + return " ".join(words[: i + 1]) + + if total_length == max_length and i != last_index: + break # not at sentence end, truncate with "..." + else: + return " ".join(words) # no truncation needed + + # Account for the length of the suffix. + total_length += len("...") + + # remove words until the length is short enough + while i > 0: + total_length -= len(words[i]) + (i > 0) + + if total_length <= max_length: + break + + i -= 1 + + return " ".join(words[:i]) + "..." + + +class LazyFile: + """A lazy file works like a regular file but it does not fully open + the file but it does perform some basic checks early to see if the + filename parameter does make sense. This is useful for safely opening + files for writing. + """ + + def __init__( + self, + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + atomic: bool = False, + ): + self.name = filename + self.mode = mode + self.encoding = encoding + self.errors = errors + self.atomic = atomic + self._f: t.Optional[t.IO] + + if filename == "-": + self._f, self.should_close = open_stream(filename, mode, encoding, errors) + else: + if "r" in mode: + # Open and close the file in case we're opening it for + # reading so that we can catch at least some errors in + # some cases early. + open(filename, mode).close() + self._f = None + self.should_close = True + + def __getattr__(self, name: str) -> t.Any: + return getattr(self.open(), name) + + def __repr__(self) -> str: + if self._f is not None: + return repr(self._f) + return f"" + + def open(self) -> t.IO: + """Opens the file if it's not yet open. This call might fail with + a :exc:`FileError`. Not handling this error will produce an error + that Click shows. + """ + if self._f is not None: + return self._f + try: + rv, self.should_close = open_stream( + self.name, self.mode, self.encoding, self.errors, atomic=self.atomic + ) + except OSError as e: # noqa: E402 + from .exceptions import FileError + + raise FileError(self.name, hint=e.strerror) from e + self._f = rv + return rv + + def close(self) -> None: + """Closes the underlying file, no matter what.""" + if self._f is not None: + self._f.close() + + def close_intelligently(self) -> None: + """This function only closes the file if it was opened by the lazy + file wrapper. For instance this will never close stdin. + """ + if self.should_close: + self.close() + + def __enter__(self) -> "LazyFile": + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self.close_intelligently() + + def __iter__(self) -> t.Iterator[t.AnyStr]: + self.open() + return iter(self._f) # type: ignore + + +class KeepOpenFile: + def __init__(self, file: t.IO) -> None: + self._file = file + + def __getattr__(self, name: str) -> t.Any: + return getattr(self._file, name) + + def __enter__(self) -> "KeepOpenFile": + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + pass + + def __repr__(self) -> str: + return repr(self._file) + + def __iter__(self) -> t.Iterator[t.AnyStr]: + return iter(self._file) + + +def echo( + message: t.Optional[t.Any] = None, + file: t.Optional[t.IO] = None, + nl: bool = True, + err: bool = False, + color: t.Optional[bool] = None, +) -> None: + """Print a message and newline to stdout or a file. This should be + used instead of :func:`print` because it provides better support + for different data, files, and environments. + + Compared to :func:`print`, this does the following: + + - Ensures that the output encoding is not misconfigured on Linux. + - Supports Unicode in the Windows console. + - Supports writing to binary outputs, and supports writing bytes + to text outputs. + - Supports colors and styles on Windows. + - Removes ANSI color and style codes if the output does not look + like an interactive terminal. + - Always flushes the output. + + :param message: The string or bytes to output. Other objects are + converted to strings. + :param file: The file to write to. Defaults to ``stdout``. + :param err: Write to ``stderr`` instead of ``stdout``. + :param nl: Print a newline after the message. Enabled by default. + :param color: Force showing or hiding colors and other styles. By + default Click will remove color if the output does not look like + an interactive terminal. + + .. versionchanged:: 6.0 + Support Unicode output on the Windows console. Click does not + modify ``sys.stdout``, so ``sys.stdout.write()`` and ``print()`` + will still not support Unicode. + + .. versionchanged:: 4.0 + Added the ``color`` parameter. + + .. versionadded:: 3.0 + Added the ``err`` parameter. + + .. versionchanged:: 2.0 + Support colors on Windows if colorama is installed. + """ + if file is None: + if err: + file = _default_text_stderr() + else: + file = _default_text_stdout() + + # Convert non bytes/text into the native string type. + if message is not None and not isinstance(message, (str, bytes, bytearray)): + out: t.Optional[t.Union[str, bytes]] = str(message) + else: + out = message + + if nl: + out = out or "" + if isinstance(out, str): + out += "\n" + else: + out += b"\n" + + if not out: + file.flush() + return + + # If there is a message and the value looks like bytes, we manually + # need to find the binary stream and write the message in there. + # This is done separately so that most stream types will work as you + # would expect. Eg: you can write to StringIO for other cases. + if isinstance(out, (bytes, bytearray)): + binary_file = _find_binary_writer(file) + + if binary_file is not None: + file.flush() + binary_file.write(out) + binary_file.flush() + return + + # ANSI style code support. For no message or bytes, nothing happens. + # When outputting to a file instead of a terminal, strip codes. + else: + color = resolve_color_default(color) + + if should_strip_ansi(file, color): + out = strip_ansi(out) + elif WIN: + if auto_wrap_for_ansi is not None: + file = auto_wrap_for_ansi(file) # type: ignore + elif not color: + out = strip_ansi(out) + + file.write(out) # type: ignore + file.flush() + + +def get_binary_stream(name: "te.Literal['stdin', 'stdout', 'stderr']") -> t.BinaryIO: + """Returns a system stream for byte processing. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + """ + opener = binary_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener() + + +def get_text_stream( + name: "te.Literal['stdin', 'stdout', 'stderr']", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", +) -> t.TextIO: + """Returns a system stream for text processing. This usually returns + a wrapped stream around a binary stream returned from + :func:`get_binary_stream` but it also can take shortcuts for already + correctly configured streams. + + :param name: the name of the stream to open. Valid names are ``'stdin'``, + ``'stdout'`` and ``'stderr'`` + :param encoding: overrides the detected default encoding. + :param errors: overrides the default error mode. + """ + opener = text_streams.get(name) + if opener is None: + raise TypeError(f"Unknown standard stream '{name}'") + return opener(encoding, errors) + + +def open_file( + filename: str, + mode: str = "r", + encoding: t.Optional[str] = None, + errors: t.Optional[str] = "strict", + lazy: bool = False, + atomic: bool = False, +) -> t.IO: + """This is similar to how the :class:`File` works but for manual + usage. Files are opened non lazy by default. This can open regular + files as well as stdin/stdout if ``'-'`` is passed. + + If stdin/stdout is returned the stream is wrapped so that the context + manager will not close the stream accidentally. This makes it possible + to always use the function like this without having to worry to + accidentally close a standard stream:: + + with open_file(filename) as f: + ... + + .. versionadded:: 3.0 + + :param filename: the name of the file to open (or ``'-'`` for stdin/stdout). + :param mode: the mode in which to open the file. + :param encoding: the encoding to use. + :param errors: the error handling for this file. + :param lazy: can be flipped to true to open the file lazily. + :param atomic: in atomic mode writes go into a temporary file and it's + moved on close. + """ + if lazy: + return t.cast(t.IO, LazyFile(filename, mode, encoding, errors, atomic=atomic)) + f, should_close = open_stream(filename, mode, encoding, errors, atomic=atomic) + if not should_close: + f = t.cast(t.IO, KeepOpenFile(f)) + return f + + +def get_os_args() -> t.Sequence[str]: + """Returns the argument part of ``sys.argv``, removing the first + value which is the name of the script. + + .. deprecated:: 8.0 + Will be removed in Click 8.1. Access ``sys.argv[1:]`` directly + instead. + """ + import warnings + + warnings.warn( + "'get_os_args' is deprecated and will be removed in Click 8.1." + " Access 'sys.argv[1:]' directly instead.", + DeprecationWarning, + stacklevel=2, + ) + return sys.argv[1:] + + +def format_filename( + filename: t.Union[str, bytes, os.PathLike], shorten: bool = False +) -> str: + """Formats a filename for user display. The main purpose of this + function is to ensure that the filename can be displayed at all. This + will decode the filename to unicode if necessary in a way that it will + not fail. Optionally, it can shorten the filename to not include the + full path to the filename. + + :param filename: formats a filename for UI display. This will also convert + the filename into unicode without failing. + :param shorten: this optionally shortens the filename to strip of the + path that leads up to it. + """ + if shorten: + filename = os.path.basename(filename) + + return os.fsdecode(filename) + + +def get_app_dir(app_name: str, roaming: bool = True, force_posix: bool = False) -> str: + r"""Returns the config folder for the application. The default behavior + is to return whatever is most appropriate for the operating system. + + To give you an idea, for an app called ``"Foo Bar"``, something like + the following folders could be returned: + + Mac OS X: + ``~/Library/Application Support/Foo Bar`` + Mac OS X (POSIX): + ``~/.foo-bar`` + Unix: + ``~/.config/foo-bar`` + Unix (POSIX): + ``~/.foo-bar`` + Windows (roaming): + ``C:\Users\\AppData\Roaming\Foo Bar`` + Windows (not roaming): + ``C:\Users\\AppData\Local\Foo Bar`` + + .. versionadded:: 2.0 + + :param app_name: the application name. This should be properly capitalized + and can contain whitespace. + :param roaming: controls if the folder should be roaming or not on Windows. + Has no affect otherwise. + :param force_posix: if this is set to `True` then on any POSIX system the + folder will be stored in the home folder with a leading + dot instead of the XDG config home or darwin's + application support folder. + """ + if WIN: + key = "APPDATA" if roaming else "LOCALAPPDATA" + folder = os.environ.get(key) + if folder is None: + folder = os.path.expanduser("~") + return os.path.join(folder, app_name) + if force_posix: + return os.path.join(os.path.expanduser(f"~/.{_posixify(app_name)}")) + if sys.platform == "darwin": + return os.path.join( + os.path.expanduser("~/Library/Application Support"), app_name + ) + return os.path.join( + os.environ.get("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), + _posixify(app_name), + ) + + +class PacifyFlushWrapper: + """This wrapper is used to catch and suppress BrokenPipeErrors resulting + from ``.flush()`` being called on broken pipe during the shutdown/final-GC + of the Python interpreter. Notably ``.flush()`` is always called on + ``sys.stdout`` and ``sys.stderr``. So as to have minimal impact on any + other cleanup code, and the case where the underlying file is not a broken + pipe, all calls and attributes are proxied. + """ + + def __init__(self, wrapped: t.IO) -> None: + self.wrapped = wrapped + + def flush(self) -> None: + try: + self.wrapped.flush() + except OSError as e: + import errno + + if e.errno != errno.EPIPE: + raise + + def __getattr__(self, attr: str) -> t.Any: + return getattr(self.wrapped, attr) + + +def _detect_program_name( + path: t.Optional[str] = None, _main: ModuleType = sys.modules["__main__"] +) -> str: + """Determine the command used to run the program, for use in help + text. If a file or entry point was executed, the file name is + returned. If ``python -m`` was used to execute a module or package, + ``python -m name`` is returned. + + This doesn't try to be too precise, the goal is to give a concise + name for help text. Files are only shown as their name without the + path. ``python`` is only shown for modules, and the full path to + ``sys.executable`` is not shown. + + :param path: The Python file being executed. Python puts this in + ``sys.argv[0]``, which is used by default. + :param _main: The ``__main__`` module. This should only be passed + during internal testing. + + .. versionadded:: 8.0 + Based on command args detection in the Werkzeug reloader. + + :meta private: + """ + if not path: + path = sys.argv[0] + + # The value of __package__ indicates how Python was called. It may + # not exist if a setuptools script is installed as an egg. It may be + # set incorrectly for entry points created with pip on Windows. + if getattr(_main, "__package__", None) is None or ( + os.name == "nt" + and _main.__package__ == "" + and not os.path.exists(path) + and os.path.exists(f"{path}.exe") + ): + # Executed a file, like "python app.py". + return os.path.basename(path) + + # Executed a module, like "python -m example". + # Rewritten by Python from "-m script" to "/path/to/script.py". + # Need to look at main module to determine how it was executed. + py_module = t.cast(str, _main.__package__) + name = os.path.splitext(os.path.basename(path))[0] + + # A submodule like "example.cli". + if name != "__main__": + py_module = f"{py_module}.{name}" + + return f"python -m {py_module.lstrip('.')}" + + +def _expand_args( + args: t.Iterable[str], + *, + user: bool = True, + env: bool = True, + glob_recursive: bool = True, +) -> t.List[str]: + """Simulate Unix shell expansion with Python functions. + + See :func:`glob.glob`, :func:`os.path.expanduser`, and + :func:`os.path.expandvars`. + + This intended for use on Windows, where the shell does not do any + expansion. It may not exactly match what a Unix shell would do. + + :param args: List of command line arguments to expand. + :param user: Expand user home directory. + :param env: Expand environment variables. + :param glob_recursive: ``**`` matches directories recursively. + + .. versionadded:: 8.0 + + :meta private: + """ + from glob import glob + + out = [] + + for arg in args: + if user: + arg = os.path.expanduser(arg) + + if env: + arg = os.path.expandvars(arg) + + matches = glob(arg, recursive=glob_recursive) + + if not matches: + out.append(arg) + else: + out.extend(matches) + + return out diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/INSTALLER b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/LICENSE.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/LICENSE.txt new file mode 100644 index 00000000..3105888e --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/LICENSE.txt @@ -0,0 +1,27 @@ +Copyright (c) 2010 Jonathan Hartley +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holders, nor those of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/METADATA b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/METADATA new file mode 100644 index 00000000..2a175c26 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/METADATA @@ -0,0 +1,415 @@ +Metadata-Version: 2.1 +Name: colorama +Version: 0.4.4 +Summary: Cross-platform colored terminal text. +Home-page: https://github.com/tartley/colorama +Author: Jonathan Hartley +Author-email: tartley@tartley.com +Maintainer: Arnon Yaari +License: BSD +Keywords: color colour terminal text ansi windows crossplatform xplatform +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.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 +Classifier: Topic :: Terminals +Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* + +.. image:: https://img.shields.io/pypi/v/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/pyversions/colorama.svg + :target: https://pypi.org/project/colorama/ + :alt: Supported Python versions + +.. image:: https://travis-ci.org/tartley/colorama.svg?branch=master + :target: https://travis-ci.org/tartley/colorama + :alt: Build Status + +Colorama +======== + +Makes ANSI escape character sequences (for producing colored terminal text and +cursor positioning) work under MS Windows. + +.. |donate| image:: https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif + :target: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=2MZ9D2GMLYCUJ&item_name=Colorama¤cy_code=USD + :alt: Donate with Paypal + +`PyPI for releases `_ · +`Github for source `_ · +`Colorama for enterprise on Tidelift `_ + +If you find Colorama useful, please |donate| to the authors. Thank you! + + +Installation +------------ + +.. code-block:: bash + + pip install colorama + # or + conda install -c anaconda colorama + + +Description +----------- + +ANSI escape character sequences have long been used to produce colored terminal +text and cursor positioning on Unix and Macs. Colorama makes this work on +Windows, too, by wrapping ``stdout``, stripping ANSI sequences it finds (which +would appear as gobbledygook in the output), and converting them into the +appropriate win32 calls to modify the state of the terminal. On other platforms, +Colorama does nothing. + +This has the upshot of providing a simple cross-platform API for printing +colored terminal text from Python, and has the happy side-effect that existing +applications or libraries which use ANSI sequences to produce colored output on +Linux or Macs can now also work on Windows, simply by calling +``colorama.init()``. + +An alternative approach is to install ``ansi.sys`` on Windows machines, which +provides the same behaviour for all applications running in terminals. Colorama +is intended for situations where that isn't easy (e.g., maybe your app doesn't +have an installer.) + +Demo scripts in the source code repository print some colored text using +ANSI sequences. Compare their output under Gnome-terminal's built in ANSI +handling, versus on Windows Command-Prompt using Colorama: + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/ubuntu-demo.png + :width: 661 + :height: 357 + :alt: ANSI sequences on Ubuntu under gnome-terminal. + +.. image:: https://github.com/tartley/colorama/raw/master/screenshots/windows-demo.png + :width: 668 + :height: 325 + :alt: Same ANSI sequences on Windows, using Colorama. + +These screenshots show that, on Windows, Colorama does not support ANSI 'dim +text'; it looks the same as 'normal text'. + +Usage +----- + +Initialisation +.............. + +Applications should initialise Colorama using: + +.. code-block:: python + + from colorama import init + init() + +On Windows, calling ``init()`` will filter ANSI escape sequences out of any +text sent to ``stdout`` or ``stderr``, and replace them with equivalent Win32 +calls. + +On other platforms, calling ``init()`` has no effect (unless you request other +optional functionality; see "Init Keyword Args", below). By design, this permits +applications to call ``init()`` unconditionally on all platforms, after which +ANSI output should just work. + +To stop using Colorama before your program exits, simply call ``deinit()``. +This will restore ``stdout`` and ``stderr`` to their original values, so that +Colorama is disabled. To resume using Colorama again, call ``reinit()``; it is +cheaper than calling ``init()`` again (but does the same thing). + + +Colored Output +.............. + +Cross-platform printing of colored text can then be done using Colorama's +constant shorthand for ANSI escape sequences: + +.. code-block:: python + + from colorama import Fore, Back, Style + print(Fore.RED + 'some red text') + print(Back.GREEN + 'and with a green background') + print(Style.DIM + 'and in dim text') + print(Style.RESET_ALL) + print('back to normal now') + +...or simply by manually printing ANSI sequences from your own code: + +.. code-block:: python + + print('\033[31m' + 'some red text') + print('\033[39m') # and reset to default color + +...or, Colorama can be used in conjunction with existing ANSI libraries +such as the venerable `Termcolor `_ +or the fabulous `Blessings `_. +This is highly recommended for anything more than trivial coloring: + +.. code-block:: python + + from colorama import init + from termcolor import colored + + # use Colorama to make Termcolor work on Windows too + init() + + # then use Termcolor for all colored text output + print(colored('Hello, World!', 'green', 'on_red')) + +Available formatting constants are:: + + Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET. + Style: DIM, NORMAL, BRIGHT, RESET_ALL + +``Style.RESET_ALL`` resets foreground, background, and brightness. Colorama will +perform this reset automatically on program exit. + + +Cursor Positioning +.................. + +ANSI codes to reposition the cursor are supported. See ``demos/demo06.py`` for +an example of how to generate them. + + +Init Keyword Args +................. + +``init()`` accepts some ``**kwargs`` to override default behaviour. + +init(autoreset=False): + If you find yourself repeatedly sending reset sequences to turn off color + changes at the end of every print, then ``init(autoreset=True)`` will + automate that: + + .. code-block:: python + + from colorama import init + init(autoreset=True) + print(Fore.RED + 'some red text') + print('automatically back to default color again') + +init(strip=None): + Pass ``True`` or ``False`` to override whether ANSI codes should be + stripped from the output. The default behaviour is to strip if on Windows + or if output is redirected (not a tty). + +init(convert=None): + Pass ``True`` or ``False`` to override whether to convert ANSI codes in the + output into win32 calls. The default behaviour is to convert if on Windows + and output is to a tty (terminal). + +init(wrap=True): + On Windows, Colorama works by replacing ``sys.stdout`` and ``sys.stderr`` + with proxy objects, which override the ``.write()`` method to do their work. + If this wrapping causes you problems, then this can be disabled by passing + ``init(wrap=False)``. The default behaviour is to wrap if ``autoreset`` or + ``strip`` or ``convert`` are True. + + When wrapping is disabled, colored printing on non-Windows platforms will + continue to work as normal. To do cross-platform colored output, you can + use Colorama's ``AnsiToWin32`` proxy directly: + + .. code-block:: python + + import sys + from colorama import init, AnsiToWin32 + init(wrap=False) + stream = AnsiToWin32(sys.stderr).stream + + # Python 2 + print >>stream, Fore.BLUE + 'blue text on stderr' + + # Python 3 + print(Fore.BLUE + 'blue text on stderr', file=stream) + + +Recognised ANSI Sequences +......................... + +ANSI sequences generally take the form:: + + ESC [ ; ... + +Where ```` is an integer, and ```` is a single letter. Zero or +more params are passed to a ````. If no params are passed, it is +generally synonymous with passing a single zero. No spaces exist in the +sequence; they have been inserted here simply to read more easily. + +The only ANSI sequences that Colorama converts into win32 calls are:: + + ESC [ 0 m # reset all (colors and brightness) + ESC [ 1 m # bright + ESC [ 2 m # dim (looks same as normal brightness) + ESC [ 22 m # normal brightness + + # FOREGROUND: + ESC [ 30 m # black + ESC [ 31 m # red + ESC [ 32 m # green + ESC [ 33 m # yellow + ESC [ 34 m # blue + ESC [ 35 m # magenta + ESC [ 36 m # cyan + ESC [ 37 m # white + ESC [ 39 m # reset + + # BACKGROUND + ESC [ 40 m # black + ESC [ 41 m # red + ESC [ 42 m # green + ESC [ 43 m # yellow + ESC [ 44 m # blue + ESC [ 45 m # magenta + ESC [ 46 m # cyan + ESC [ 47 m # white + ESC [ 49 m # reset + + # cursor positioning + ESC [ y;x H # position cursor at x across, y down + ESC [ y;x f # position cursor at x across, y down + ESC [ n A # move cursor n lines up + ESC [ n B # move cursor n lines down + ESC [ n C # move cursor n characters forward + ESC [ n D # move cursor n characters backward + + # clear the screen + ESC [ mode J # clear the screen + + # clear the line + ESC [ mode K # clear the line + +Multiple numeric params to the ``'m'`` command can be combined into a single +sequence:: + + ESC [ 36 ; 45 ; 1 m # bright cyan text on magenta background + +All other ANSI sequences of the form ``ESC [ ; ... `` +are silently stripped from the output on Windows. + +Any other form of ANSI sequence, such as single-character codes or alternative +initial characters, are not recognised or stripped. It would be cool to add +them though. Let me know if it would be useful for you, via the Issues on +GitHub. + + +Status & Known Problems +----------------------- + +I've personally only tested it on Windows XP (CMD, Console2), Ubuntu +(gnome-terminal, xterm), and OS X. + +Some presumably valid ANSI sequences aren't recognised (see details below), +but to my knowledge nobody has yet complained about this. Puzzling. + +See outstanding issues and wish-list: +https://github.com/tartley/colorama/issues + +If anything doesn't work for you, or doesn't do what you expected or hoped for, +I'd love to hear about it on that issues list, would be delighted by patches, +and would be happy to grant commit access to anyone who submits a working patch +or two. + + +License +------- + +Copyright Jonathan Hartley & Arnon Yaari, 2013-2020. BSD 3-Clause license; see +LICENSE file. + + +Development +----------- + +Help and fixes welcome! + +Tested on CPython 2.7, 3.5, 3.6, 3.7 and 3.8. + +No requirements other than the standard library. +Development requirements are captured in requirements-dev.txt. + +To create and populate a virtual environment:: + + ./bootstrap.ps1 # Windows + make bootstrap # Linux + +To run tests:: + + ./test.ps1 # Windows + make test # Linux + +If you use nose to run the tests, you must pass the ``-s`` flag; otherwise, +``nosetests`` applies its own proxy to ``stdout``, which confuses the unit +tests. + + +Professional support +-------------------- + +.. |tideliftlogo| image:: https://cdn2.hubspot.net/hubfs/4008838/website/logos/logos_for_download/Tidelift_primary-shorthand-logo.png + :alt: Tidelift + :target: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + +.. list-table:: + :widths: 10 100 + + * - |tideliftlogo| + - Professional support for colorama is available as part of the + `Tidelift Subscription`_. + Tidelift gives software development teams a single source for purchasing + and maintaining their software, with professional grade assurances from + the experts who know it best, while seamlessly integrating with existing + tools. + +.. _Tidelift Subscription: https://tidelift.com/subscription/pkg/pypi-colorama?utm_source=pypi-colorama&utm_medium=referral&utm_campaign=readme + + +Thanks +------ + +* Marc Schlaich (schlamar) for a ``setup.py`` fix for Python2.5. +* Marc Abramowitz, reported & fixed a crash on exit with closed ``stdout``, + providing a solution to issue #7's setuptools/distutils debate, + and other fixes. +* User 'eryksun', for guidance on correctly instantiating ``ctypes.windll``. +* Matthew McCormick for politely pointing out a longstanding crash on non-Win. +* Ben Hoyt, for a magnificent fix under 64-bit Windows. +* Jesse at Empty Square for submitting a fix for examples in the README. +* User 'jamessp', an observant documentation fix for cursor positioning. +* User 'vaal1239', Dave Mckee & Lackner Kristof for a tiny but much-needed Win7 + fix. +* Julien Stuyck, for wisely suggesting Python3 compatible updates to README. +* Daniel Griffith for multiple fabulous patches. +* Oscar Lesta for a valuable fix to stop ANSI chars being sent to non-tty + output. +* Roger Binns, for many suggestions, valuable feedback, & bug reports. +* Tim Golden for thought and much appreciated feedback on the initial idea. +* User 'Zearin' for updates to the README file. +* John Szakmeister for adding support for light colors +* Charles Merriam for adding documentation to demos +* Jurko for a fix on 64-bit Windows CPython2.5 w/o ctypes +* Florian Bruhin for a fix when stdout or stderr are None +* Thomas Weininger for fixing ValueError on Windows +* Remi Rampin for better Github integration and fixes to the README file +* Simeon Visser for closing a file handle using 'with' and updating classifiers + to include Python 3.3 and 3.4 +* Andy Neff for fixing RESET of LIGHT_EX colors. +* Jonathan Hartley for the initial idea and implementation. + + + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/RECORD b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/RECORD new file mode 100644 index 00000000..3516c658 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/RECORD @@ -0,0 +1,18 @@ +colorama-0.4.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +colorama-0.4.4.dist-info/LICENSE.txt,sha256=ysNcAmhuXQSlpxQL-zs25zrtSWZW6JEQLkKIhteTAxg,1491 +colorama-0.4.4.dist-info/METADATA,sha256=JmU7ePpEh1xcqZV0JKcrrlU7cp5o4InDlHJXbo_FTQw,14551 +colorama-0.4.4.dist-info/RECORD,, +colorama-0.4.4.dist-info/WHEEL,sha256=gxPaqcqKPLUXaSAKwmfHO7_iAOlVvmp33DewnUluBB8,116 +colorama-0.4.4.dist-info/top_level.txt,sha256=_Kx6-Cni2BT1PEATPhrSRxo0d7kSgfBbHf5o7IF1ABw,9 +colorama/__init__.py,sha256=pCdErryzLSzDW5P-rRPBlPLqbBtIRNJB6cMgoeJns5k,239 +colorama/__pycache__/__init__.cpython-39.pyc,, +colorama/__pycache__/ansi.cpython-39.pyc,, +colorama/__pycache__/ansitowin32.cpython-39.pyc,, +colorama/__pycache__/initialise.cpython-39.pyc,, +colorama/__pycache__/win32.cpython-39.pyc,, +colorama/__pycache__/winterm.cpython-39.pyc,, +colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 +colorama/ansitowin32.py,sha256=yV7CEmCb19MjnJKODZEEvMH_fnbJhwnpzo4sxZuGXmA,10517 +colorama/initialise.py,sha256=PprovDNxMTrvoNHFcL2NZjpH2XzDc8BLxLxiErfUl4k,1915 +colorama/win32.py,sha256=bJ8Il9jwaBN5BJ8bmN6FoYZ1QYuMKv2j8fGrXh7TJjw,5404 +colorama/winterm.py,sha256=2y_2b7Zsv34feAsP67mLOVc-Bgq51mdYGo571VprlrM,6438 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/WHEEL b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/WHEEL new file mode 100644 index 00000000..6d38aa06 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/top_level.txt b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/top_level.txt new file mode 100644 index 00000000..3fcfb51b --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama-0.4.4.dist-info/top_level.txt @@ -0,0 +1 @@ +colorama diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__init__.py new file mode 100644 index 00000000..b149ed79 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__init__.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.4' diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35c624759bda06ff3cc029bb8626bbf201f2ca39 GIT binary patch literal 428 zcmYk2J5R$f5XbXy(zGFB?U*$~1EO6(2=NjVVkrX2ie#C@sseT#IZh${MtlZ#K7>~$ zCUz!#R7jlU-}xT?>&`SuCXTiDw+;QW{sV&l=GoxXp6=43aw?ZQ!o{xeuqS-%3xtsi zd5;Go#Gx4Bk%(|4#(4aj_xVJ`IJS3$cdB6NWZ|c4r7~nt-PGEI72A5X^+_qYR8&x+ z*^7p@E2)@4=d^q>!BP*Lned`lom81?;a6%nvrfe!j>TH(6pPAX!shcTB+s z$_F4oU||ro&r}HU2oM3rP>G?U_!<)vvSzBQWkblTqjsSc@O@Vu6}pn;Y{mN( zXKAbCBP(?(n^X*GDMj0Briyl0vt~Wd4~y&ip|Ij?*4ka@igm@`u6u;Q#DwJSV4`Co StDdtHn7o4_r|#6<@qPf{2y_7e literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/ansi.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1ceb2dbaa484b6194c61de26eab2ec35c15582e GIT binary patch literal 3213 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 TWZIs29ht(cWuxs{v&;VnTv7Z= literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/initialise.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bbe723bd1f3e7a248d05734c742d508ebc286fca GIT binary patch literal 1695 zcma)6&5j&35VqYv)6?^_KY;+NfLb{qwUh*ul_C)l1VZcqp}Ay~pwUPpr)_3?)6+dF zdv=*+a$)zt1)gD7;*w|J&O`K-Q(l2fsPbfXXCg(yttz|hYPy+loJC>5W%-GV8tKs8e3Iz9~)K zub$@R{{4fDme!j<<69K-Au5Z3&N#ehndN8vLR>Nok3D8Dc`xPTlcsmf$BPqJzHJui$NTrb z82*qy8=BneyHlAxmt$>)SyfaZC-Sqr%xx}<+~|ALIfQt|E{Y+P8IQP|>1WQQDQq+* zKX7x#0NMpP`g9nPqMtRdl)~7%4KkqE? znH3{XHptg`4biLVyu!D<0@<{&Ik&Bgw(VSUL{P|>P)xnv>75gh(?PUB^#kG1K1xR8V_nZt8HE00{7U&d>nYsUf3F z2TiqFrK&|X8ldH5W6}L7t^PT;BUP2U4wpt9fga}u6Xh^Y{kkbE$gA>6TCo)PXmVuv~UbSDxy@5r23Qpfk{5yR_qCu%Tp>H?8|7`f9?us8JlpobX%vQ_A$+v$>%53uLbAg z>Z}T2gqg7q=}Z@%=yJg$0UzVcMtEqmt6EOb_`h&%q3;@8J7m5aE^u(U(%OKFGMo_` zSB)z0stP|vW8uT?RTVBg#eer-1dHH;UoyD82#&-HgcEB-&`Wa@{ehSR@1weUddy)p zE7XX%Mx-Yyry(TdxA_OqV^%koB>-<>3){H(J&GY}Fz(|Qz77Q?-mRtnL9f?Oci;vt z*D+F^a!};Y987gf;(KbV6M9eGo4910AC<3Cb%UsC`8 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/win32.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d630fc9cba7603c425ed0dd127d4c23fc744a687 GIT binary patch literal 3927 zcmai1%~Ko66`!6jjfBA9PmEbx#$ngm^0JPd)YfjfT($v!RJ6i{*pQtfH8o7PK=Mc< z_l%68`<=QN6+@C*DRMy~Qpd>SJ+`DH$XdX8V=v#6`wY8ch4t$!UH9JKxk@)KFPUS(>$ z*4mVz+^r=c7ZL;BPOF>k_Cy+y$l(X`!*Yi41SPdWxY00vWc43G6bqz-Ax-|>;NNUy zJc+*8iu+r!sPtsg7ExA7x|PmuB}zKIekSBbZ}*kxzPh{c^#&B!NL!isq8COl!Yz?* zL`j^;uoHd>Rqozd=GUqwl}=GwWVmR8m~T;vQjC=9B$ zayECRXsTi(ll>^`OQGB-h_*wi3eQ)b)z_9+Pi%=v1}*ylCA|+K44-iWfx&!>o5F4) zP&BpSkS=-->H=z)MzjP)W@!uGAYVwdJ6(xVpSt4<3E@`0?^;@T~rL zW$#?7wW_qb6#x?@-G%K1)eiVr`J*K@zyBxqh!(JQXno9;w0qv_+{lw8t%%J0^R4#%HjNeb-=ms78x5!&B zO-fh!p_$&kYASQ#wqn~KDqp;}CA#8uPu?dDbza!Jdh9$4_u?c9%=k1x+4o$(7^$L z2-z5xHp$AlePLHTahjgd#LiPzaEkyR~u7t@s! zBDJNt-XCat>6ED*+MD1bRpnQx*CNvC@FV0$=)OXS+~<#opaE+$&R(!|7A<7<7fe>j zorn*PIZZX5LeoZ$yX2Xb;UUy^-q-`nro?Ht-LDMO2$=4h=ofU~%#bW$K_@E?oPk9+ zz_%r3;Gc+8OY%A@NohcmV@rZo-X=onP+lT3O@wT$E+50~(b2P2l5%AbXH`Uu*StG~qNDJ5WFYo2GeeG%!Z#3tFK39RX2j5P8jfv+$u+8rLD zGjs619BNFa|aHRf%67+yP)qD4O`XAy?q?3 zDp%l^#H)tPtehpCglB`ttvDWLyOn;1*T^F7_b|evsc|=Jeh3ymW{<1-M+IiOWPNL#ZMS z>IaQ{OoJap{>BA>R5=awX#^O z(J219Yb3CfPQv(_wpy%eM&XyYY-b*2u}_j zU&uvx?Rm&Z)23@qp7l)oz_mORHFN*t+Ih2y H$t(RAtF?fI literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/__pycache__/winterm.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..669fb8d542a8d8fef9b36bd2188b8bc45de28137 GIT binary patch literal 4649 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansi.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansi.py new file mode 100644 index 00000000..11ec695f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansi.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 = '\a' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansitowin32.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansitowin32.py new file mode 100644 index 00000000..6039a054 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/ansitowin32.py @@ -0,0 +1,258 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL +from .winterm import 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\\]([^\a]*)(\a)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # 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 == BEL: + if paramstring.count(";") == 1: + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/initialise.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/initialise.py new file mode 100644 index 00000000..430d0668 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/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/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/win32.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/win32.py new file mode 100644 index 00000000..c2d83603 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/win32.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/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/winterm.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/colorama/winterm.py new file mode 100644 index 00000000..0fdb4ec4 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/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/Rahul/task3/pyvenv3.9/Lib/site-packages/distutils-precedence.pth b/Rahul/task3/pyvenv3.9/Lib/site-packages/distutils-precedence.pth new file mode 100644 index 00000000..6de4198f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/distutils-precedence.pth @@ -0,0 +1 @@ +import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'stdlib') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__init__.py new file mode 100644 index 00000000..43b54683 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__init__.py @@ -0,0 +1,46 @@ +from markupsafe import escape +from markupsafe import Markup +from werkzeug.exceptions import abort as abort +from werkzeug.utils import redirect as redirect + +from . import json as json +from .app import Flask as Flask +from .app import Request as Request +from .app import Response as Response +from .blueprints import Blueprint as Blueprint +from .config import Config as Config +from .ctx import after_this_request as after_this_request +from .ctx import copy_current_request_context as copy_current_request_context +from .ctx import has_app_context as has_app_context +from .ctx import has_request_context as has_request_context +from .globals import _app_ctx_stack as _app_ctx_stack +from .globals import _request_ctx_stack as _request_ctx_stack +from .globals import current_app as current_app +from .globals import g as g +from .globals import request as request +from .globals import session as session +from .helpers import flash as flash +from .helpers import get_flashed_messages as get_flashed_messages +from .helpers import get_template_attribute as get_template_attribute +from .helpers import make_response as make_response +from .helpers import safe_join as safe_join +from .helpers import send_file as send_file +from .helpers import send_from_directory as send_from_directory +from .helpers import stream_with_context as stream_with_context +from .helpers import url_for as url_for +from .json import jsonify as jsonify +from .signals import appcontext_popped as appcontext_popped +from .signals import appcontext_pushed as appcontext_pushed +from .signals import appcontext_tearing_down as appcontext_tearing_down +from .signals import before_render_template as before_render_template +from .signals import got_request_exception as got_request_exception +from .signals import message_flashed as message_flashed +from .signals import request_finished as request_finished +from .signals import request_started as request_started +from .signals import request_tearing_down as request_tearing_down +from .signals import signals_available as signals_available +from .signals import template_rendered as template_rendered +from .templating import render_template as render_template +from .templating import render_template_string as render_template_string + +__version__ = "2.0.2" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__main__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__main__.py new file mode 100644 index 00000000..4e28416e --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__main__.py @@ -0,0 +1,3 @@ +from .cli import main + +main() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0d6f08ee21e54294bf27485f83383a57c968250 GIT binary patch literal 1883 zcmbu9*-k4*5Qc379^-w(>|k~b*l-}{WKk4FiIl4(7w1U1C?U1Rp0+*Ev!uJt_C|Sz zyg;P90k^q2uaK)$m2I%NjS;`U{=3{$UDeZWp^#1B=dVAX+`lu4#6L8c{iJa4J^q_K zl9%w3DiI_hnIujjry#{Vr{;orm}j0>3qcyv$O~RtIY9<8%#K*yoj8K zJabkRf+7@|bE*`Sq0F3Dm7oe$<^pmJYRpCCI@Fm<$V;%qTvm->8J3wV$SbhITt!}m zRpuJ<8muwbk=J3Jc?o#~Hkcb~GuVPH=4Iq<*k)cqZbFlJ6?q4CnAebZVV8Lwc@OrO zH<0&XpLrAc01lY9kPqRId0Sv5Vs{`yh;Udz4@GHEPDqO&^Aq)Xi3?NKp+}9H>2GMJ8!!c3h#-q!`oUU~GBXnZ6(T zlZTe39(G1s&Z9oH-Xu{m{vdP}_WaKEmD}YKRi?R2a^n?n(YJXv-dK1NXoF7+mz|5w z<*%);ARF*Gr)FrnAoUyy)b6FeeUhU==Vfz7&(lotWoBf3W%L4?&k60&+#HrtqWixK#c}UHe(&#;8oI$!e;Q; z>_tJ0?}@&SAMa#%ch&j&`e(m;ZG0=+F}}O>dR^1|c6%-a9wRG6Cw_d+d>cgGNXhT$ ULNdRhg`kf)l%|66JvOV-N=!FabFZKwK;aBvKes7;_kM8KW2(8B!UW85kK-n1UHJ znO`yjB{dmuvE(LZ=J{zd-C|D8$t(hCUCB_y0;IsiuizA`n39zIWZm?f()65Eg@U5| ztkmQZh5S5)+)9Py{M>@llGLJ@g37YgyfR}w%NU=`q?qE&l2qM-#N_P6^wi>*w4B7^ hZ2kCnkVWzFdIgoYIBatBQ%ZAE?LclQ2HDBO1OT6pHM;-+ literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/app.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..523e4cb23a85c0b2b921d48011c710dc8405be9f GIT binary patch literal 63234 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 BMrHs2 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/blueprints.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..592776857f400fca2985a599fa6e190402d8d8c1 GIT binary patch literal 21933 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/config.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40e7ba55835e071e0f036734ebf7311962cfb29c GIT binary patch literal 11712 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/ctx.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/ctx.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd55309ee8bdaea6fa19f282cd1c20843567b1af GIT binary patch literal 15541 zcmdU0TZ|jmd7c?wmdm|rwbsqDJht0NOeI=w?pxciEK9Nzd*e!S6f<_nS3h41yZ1WDOwb25cm83GiP{N zI(Ct~loE$?IrE=${`>!(v);l&*}~_if7bU_U$Lxz;>GAEhl`i+jTddp@-5#Et(yL| zYYwiRFxSr4@;2|~!a}=PE6RC3oN1S8C7c)hVmR9_*UEA}gY&uCoSc`!`SwC>LC$A! zzF0#iXkQNP_EK%hwgP8oS^Yll%!NnVE43AQIv*Zwuhv%Od?9?SeXMp2Esx)~YA3E) z{-VG1zU437cWNhtrC`Zl{=o5%_$%+{Yo|c%aen3AQGXTpP6to;k9}bK$Nb~CI+I?V z@K56ENl-iGKMrb-gPM!0)BY27r8uim`*=9Rn6pqsR!&dfogaWZ!I z2%0scP7>Tr>fH!^_-HzIvlnm6&DBerNuaK48kfB=^fp5FU$`22F*}&Q5yUZu@J8!y ztAp#Av~81<8T}M+@e;oAPjLvWn(bQ{<41r_ZM+@ z$zK6|Ey`uQcO=N4v_=HFf-z9MTA)Y$0)%!NJipZKUQX^_3!@D$jJ-dGEH1g-&}((v zXk#a6CRO*XIPhIBc0IS_wS%||S-P8%a^oaYtc zmdKRDOSS`djbmABY&G1jitg^EeO9ZkAH+@7+6dOx+_SsE-dPv(+tMTAcrR}U&0Ta5 zfQXWzB?+4Mk^udIRuBiBB&Ejopm;k_)Ev+E10Pf`R-e15>5cc+f&!k~stmij9wa@5 zxp!PX^1wqk0xcQ7m-Q-~{`d|#mWngTv-zN?gmlw^ikc74OZZ;KH?HE)pWnB3tbO~W zb<4V8<*mftJ7-(`mpJ?OedzVKowu!ya}iGLhV{^1f0!GT>UF=>OzQPP=_|qB6{R9I zSiEG$D%TG&h&Tv0)e`!6XsHwUd9?1Yy_5J+^TJlx+X@59gc{{SDcX>6)b4`8>YeW1 z?Vxk}Gu1D>^LlIJofvGn03F-)wu1PbO&aR6@CnuK-e9g?-wF~ksa}7U6XMJ)+p*{I zuYYP>m8&C-*DE<0*r0IR3wwcD#%oP_bMxUjzrvqiA8dNPFqzK8JV*|i2u(Y%_w9Y>fdg-2_y7G`kc?Z`#-2Ep^DfK) zPDGP-MM_oo_1116#!fX~Yr{C#8dSt8w4gC!9BW-qd2J!I=B~pO+-TDs+ENm^c%eF^ zq?@Omt+`*LPPk~L?Z<6xP8cIxKqpE*xf|ec`KdUfF@qese>kc(PaYPGa&hlPe6_mF z_E#p<88i;5Y{uZ0Hc!$9(Y_@~A z6ojeBFmm-2xH@6o>KWX7jbbX|V9l27dFPO*@a{*8O1#U2VR)ZQMZy>+$}bv>C}Er| zm9mwL1S41sW7VBjJTwvb6G)Om)gfk@J&nl|FQis5%C29RIZX`bBg`rj1Eu;2BkfRj z#>C3QsZ15yZ$MbLC^m7%<^IVD>l(h!aEcJr*8XiWmhxKs8!H8PHVE=I;-q%Er*RJh zlJM}GIG@m+!F;{WWC*!cj59Paq2cj~(Tui3*pYAr4aq({9~(&`mVO@=FC$6kphTBJ zKt?nXrV!MbfYj@oAZ7+~{Lnyjo91Zm>^X<8@ZlUz5_p_@@bkXav(*_NXFJYL?njRA z{5W^RO7aJVeT&|xl3VZ3KQAG@x+Q(zg*=ClzSZ->^vMiT zpQwr3xj0b+I~n9Ib@tRL4&n(O&fqX8eO2lhFBB)Pp5}vRc%aq|@*7bUDthQa>9sWF zQ=jHzj(cP-S&&xr5xk05aVXjOV=Kkg+;Z{E+^NMA^UJx_oV0+H?ak@Rk%@!bCtF1CjHDyGR->63sYi_J?D$a z?CaYIG05M|peLx1l6h3sP2+Ez{rZKgQFQiQ_XYRto5)L=+Zfi_G3xp~@zLh>vFEA( zKKp7AhLL+KQlbCUSv^}LiFTv{BMvy$5dlhA0IN}8NHl4Id6_Kkc%1~5QY77J8RA_t z2uSWK@-T*0uY)2F?CI=EBtj%$u@+++76YCRC`+V zGG!g#S{+Dx*tID(vl8l1dG#gfr;=AQP-#UsFgQ`yVl*IunPxmFLLq_ckE3K z2$b$QNq*n?u63U&aKT#xnM>eQ2xw#|7h!73<8gb`Hos`sO?G=a?=K!U_Bj(@dpyB0Wtk5Ugnq5G2$w4ypC zHtDa}?isXj#m?9QDx`w*%n6%BQkqS$Pfx09*b^zy6Vr#Lp`)*1c8Chg-HUoqlU|5q z8cddy(lGq?sP`CV@`hx!I(|f@%S>lbA% z>-~N4fJ1l0*+(5fMjPS}p@oSXM$j-f2KQl0qJeZYhx8UO1eHp_#!1&lbAi&0%|EU- zVfopIX%LHN7IWegzH9&98Qc0UB5Vt(;UCyPv~M9x^8vEtt@}9}arZeZK6g>T7TbCo zzl2zH>PQd8tj$wf@Ls!j`1{Zi?^Oe?^DQ7C+KWjMKa*msf5@)IYuQD+f8m#@TlIP2 zO8jEg;If4gPdb0Shw7&tXly4>LW=W4(Ju~EvaUt%dnCfM|{zTIQ$=y;EEsJu2sTem&btj!1r;CM7b zE`u70;c$w$soO|Wv{A60hlF7=CQYFtr8+dB4CkfKwznr?kJ(S+!E8MLHlis|D$z{V zp{a_sIzUH>WkSI)80wgLq*EmEaR$0P?*e9YHvwb{owyakS3#fgrY`t;oebtoGoaDb zrwM>8CPb^w`5V^SJ%9!EPxggo^w1D89BS?3inS)}6dmbZeM*!;)$JGn#NV2A+ zIDDmQ-auMoPRBZ-U1P{2w4uo<$0CVZ`#BU-$>Lm!TDu!j4;6Kq+6tv}aSt#w0OvK~{aPa( zVuKi#xwqA*2u7Z$Ub5YRZ~lKMvvgkLnKLEC&m_CWyZ*{jn&$eyAY5NZ0hnceBMDtr zG!2fTjF{B1KcOd~OR=6%S8)8~?xz12$h&uAS0dyZy~J8$N(T*Xy^uW399gGX_K-oF zr4QGA`;fvRn0wH!C=B3unzH_&1CqR%E@YUT1caepQeR1Wj5}gbaWNWmt+^~PgwQB`c@umVKZ23D*3axDg;HW zXU*)Cf?2Fc<@_?*&H3|Kw<=?yl!4+*5KEg4Z{j6>PjYPR59g~jyapkngRWE*QvuymDW$>-g; z)yDb~WE;8L(H%C|!buJPdb+Tv#|2f8&Qr62oU$;Grn(=Y9wy~wHkuAF%c(yqn58+l z42SV!Lio84RgE&|n#{(ch z4|oprnS~I}@<4;EdVz^f#aUN`k%0J+?qEgFq25y=!jIR5e;&+@T+|*D)x>h}mR_8! z3)=_w)?fy9zS-;~7@|O1GR}!2kNB2^ynjY#88S3)m-GFjLuJA$k#424kx`h7=h-v~ zbL}IK+rg^;7m%dXv2X^ET@aNdcaR4VSRlIMv&zf$FT5?m^M6*1?yr z;8(+8dDc&A7S~)?>-bs}6+R!Ir+NeT{taIZNIQ#m+3qimOpt^gI)hwrw|Q8UoF8-8 z%Ovm~4*gfmEWaqTB*5uAyQri0?S!>%H35?J09-g}0rInU2<~C2!3MgT6c1(|SofSx z*_>UJb+n!pcfJh6-**5Bf>Ssaeq3O^oRkh`NkceS1m|Y@kG&an^;#~ZZx~k<4vF^k zPon{r{M|b$;wth;BiB9mXx_L-4KG&KD`m~qr!hHzczf}n1WrKcFixsX?HKA5tRyHu zy3?UEOogId=QC)b$RM?jgIW4}6Xyd*-JTQ$TmJ{XF;O?macl|$D+KnUvudBQ`-`Ju z!5YD&wq?2RJYL_o4y*^L5s24GjQ|{%vQ|@+0LvG3WQ{~~@rEf0N_KyBq{pnu!@TA} zg3TC%S#m=lnSqmRXbq8yf>XeU=hPC>5WRMB0I7<^%*X(iYu(@3pflGUiRW3+fe+4E#w80lc1DR(C|T;gTZ+SrCT?yy#{i( zTX05%(y)LPA;JRO(k0j{k%VC^;|1+5I*(X9;Z1~RUAXxzg&h&$9*~@LK@$yRGUzeCf$pNa= z+7t?Kq~3SSz&%l03O)g>8#{flz5>)jNN-{95E^me9jU*@+705Fs3`7omkfL6 zb|wtz7Qx$#)z7Ay!}OMgE8q%nvI!oOq3LYWr4*v{e#;m2Be)=13{XCXc2fBpjaRO` z{MNNbL#By7Ufu%)n-Hv**)$qwwdU1jO;+6wj1HZ}JJ6y=CK!+aePA^V!gn{)oENf;RSKpqo;Z$TUbdSN(lCs4cn zptn_hoq*>JZknt@*&!bEB(Nq&rG(QhZC;{}*kT3Kg~g3*B9NA&lcG}udv@J6oTma; zSoN<U|Dlxt#7wh11Sf z#NeP(HOXvSmfFMwxq@w;nn+7C;z!&YF~}5jriJUhSlKJaS>Orw#rWUcddVn_ zPn}^CZf`eBj@a2W_{wag9e>U^xg}d|pQ{e{|DerHx>da{nk^y@XD!jgUGhmq$q zr6fPFff*U5r=fTDhmVfAA|BW!R}N#hp<`j{)3CcZLQEGT5DgZfddY=o^8(&9yC8KV;&~id~!2 z%Z7D@eLCxv8F9sff{+jf)=C7A__Q|5b-Oy((8NtEACpdtckYsoxqWpT_a^-4U_q#v z410&{CgZF;OZioN`==+EJ@&#F*BKx9rQqVf#9?I1fUR8ak>U~Ca%>HNBn9lEa`y38 z1prLe_MM#~WK!JCsTzMZw6gCUlr$)?GkZ|hWq5}>x^d+T43k&~C9~0IXO6VgAMyR2 zc?Q&j1)k%(_y7{E&*99p$sH{5nS@u~U*^J_`g6b#N7$p@JKBG42y7Ya9`RB%DPxN1 z?dp1EWdyk21S525zQr?oU>$7dkTRPLQpS zaZ~<;L+ikiHnOIArx%9VeF@oZkigy%iK*vFZbtgUs%nQlOaur(EROic_{1^T69CO;EtQuj19Qh{nm%dPO6CjuUVh`=be&`AB#AKjC$} zA&Ch#lt4bvjU*2Vem*H26al*BQqXM%GS<>2d{*}J*nX0`m*2-PWcJPd{C!HSa1Uux zGABJ0_H$|uj!PKj1eR)dvoA0z&st9Cbfwbey^hub*zKJk@)br^x7WFc5%q*s|*nS$tOxH4(A_VriOiaSLH)A2RT#+XQ@B`Dq2Fp3SM)Wxb^ zhT(I3F7fX~WLyp8cz`9;R*yx=(8pa}7nE~QXogW7-0UxB>3!OF|4DFb2z^d)tm>Xq zzYC>O*Kt4!E9UbIZ-~u_xlx_f4IUT%cA%hvpD2zL-3Lt8E9eL9Zz2wpV`+tR?p*ZZYQtKi_HPf zhUFDIWq7_BZ5dJ+VDIX2tr=OmZv55FN@*m7yXZ%=_6d{Mn}+qMGprOwH5xe*_-{sq0y?w!(C|T?e-ASR!37;3lr&P1>SB5E)2GfJo7LF*d|C1B%G2VP21Q`?aPu;w!K`>~ERn~u8EH@;kRJ<@ zUptz4$E@_$$sT-{UM|$h1$|d-CT?vZ%a8R^4s}8?ufrdvzWwHv`sG)zT>i>y>(_KH z&b7}$DNQP3K{*Dcbk9_*k&h|~h%coo%Wly@>2mt#rFw7E7x~}{4_A4(#zTXLp)zFb s8f{>>M2i(g+pxq5EV1t*{VUy2L>7ytkO literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/debughelpers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac0c9dab172ed8f3265c4144f358f3b3827f5602 GIT binary patch literal 6482 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 a4S^w6*MctM&t3D^UR!0snbni4m;Vn>TkJUi literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/globals.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ab0ad94ed1bd285d2f2bd3b94dddafeb2311973 GIT binary patch literal 1833 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 DWO=?K literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/scaffold.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/scaffold.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbe5c5e2d5691a7f1b186a18c437eabd8d8642a9 GIT binary patch literal 24874 zcmdUXTWlOxnqF7+g-wd2DC#cDR++Lb(w5p9`8piiV_BjtjWv`;qGvok_I4M$id0k0 zZqBKqBsQqb&d8f_lAXOIlSPu%08+3(U|@3tc5_|qLte5-0t5&G1gO_MEf8QI0wfq` zW9R$+bLvzzN!iu}c}PoLtUh(>T>s1W|K~r)9~&Df;PYqyy6+$T^+Msl@<;wt#*a7g zjsBTaCHOXti3eI((h1A_{s57iIJ{TS{K*AL76IPQqq5&qElXdy#Bb{@4@{O^(W+h68FdI z$K-x5?!CGv_xo`FWc^9G-;evL`jp%s!2R+1ak)Q;`={zpIfbyY^7QXG>O9(esPoL~ ziTVk7ei+ZE>(h8XbGJ}`7P+1aj^KJScnsH5OYY%9aP((xy%yqM@c2D9cp^CVQK|m? zJB7dtp8Ti~JbBlxpXM9k*MccLKOQ`V=VyYagJ(V})L#fr1k?EYBA(9NbAo4s=kWBU zz`0hKIr-5zS8(zEX z1>xfQvbPHA^4d$t8IE}PEVWe>drD7>cgx2s9Tob)hId`M71Si#Off0>YB@?OH*WE- zdIBvT=nwl*!uJ@y(KEPg7VZ}w6x2lQ1kPROCusR*VcFSq{=Rdy&@ODcf8hKU8N{9U zS1~SUy$EBp<}IyvTO?#@N(*EX2A)sKVT*TYZQ4q2;d(pr)}wX2vVrb`%Rq%30QMT) z=j$N%4%4Ol>!Csl2V}hyN_E{H25)t(r(#yx1@D6yl@A(^yq@xUC_>o=`ki*Xk#A+( z>v^R7+Q>o=4ZV#T(V|uVM(9QBs4DK6!ZE@fZ=<)ayqoRtmT5qA(t|kg7yT%dIqD#R zO$cv>Y6B&8moZ5!9xaPGtzci}cRVm#EA$qHUAFZxihUJF7+G~w7a+_R)n?peveAwj zGUSb=cDEgY&y(@95wdc0gswT~QP^2hoKofC@`#_)kt zRv-;LOx)^**XpgVtz*tUSlhT6c5l8=`}zl$+KV4V?KnKO=C^M6%VG4vQpb;OJRi0E zrKMgcsI6@zqed1sNCc-)Q6&1&sXDIXeqI{sKPe5?E- zJ&ErWo=)8>imoo#kIR#%kp6V=^u1E>OmG4vJtMhKNa{55&IHdQb$UzcbHPcZ&TL6N z71WUW?3UE$gVRWTZcFOdf-^`xxh3_5;6k8dF5wcvFbk26SnA$&p7-Uz-aX)hw}rSK(5 zdowsIX)hz~mGBiwdn-66X|E#f>*3cW?R+pNX|qWCM)(a$dpmeX(q2Ov>5(-2I@R1JE+|5&yq8q38NuTJ5}Nj0Z*>)-X)(O+-)uvaN7sD?NxB%ux5BXN&9)$m zqS@wO5t&qbo06$X@hiG-%hSaaszf!5TAH;HopsGu{;HAljjq2M&O$Lk;fhxAnBet9 z`C7drYDiQ?Z;>KY%Asb4@&Kr6cf+9Oy=U~=tRKf}w%L%P8;vG9(p&GaBT#+Fm~RAx zf81_0C|pA|>s45=MR5S!NC z?VH2_HE&^K4LF2Ig_uJI7pRRh-i}&5sC*J9pg;hHYD*!4X*M+}2>~=yva8iRyc0oj z%UsOPdS_~<<-Mdtnww9?8w2E!Or*clIZ8%XqF%QVYJ0={BL1PJQBHQ{s!hfQ%i3*z z+M;%+vto!Z8MedNBIHd!yr-r;hi~+ATsED}LIcncS7)<`tGijkwYXUh3hM>+EC6s} zrEu4|Q{F5iy&PBW0#r7J04EELYCIeOFn@&S_%#v_$GhZi)ZUHRyK&wHg?RU}({}E% zz6twmkG-1=3Xmnm`4*Zs@F8};hHq5GB`(Ckx7PrU=7BNzC@Im#(;!2ThFk<`RA1}( ztBZmE#@|7{|Bi2=e>{~`wMGL(9XA>ov`KT%>{VxwSG~Z?i@dzV%P21|^FpAM6kDBk zGEPt_2ukch-Jr>khDt+&Wz~q*!d6o1w4*rLr=erRSOD^3l-GybCFAW7pUjVh#OR#lYj=Y!OAOrd`?Q&Gp+shzqkz1=#f>A-z}x5Snz zj8xo;Qz=*6sxwlmRI1g={*g~h`zoK6Ch*$;$u6_p|<Ha?KwO^EJoy~vhy!NT%ed@eH7#(k{g-JCP+lts0SXw%{ zy)PW0MuWr=k(vt5K>PI50n>{O<5wD{N%AM~6J0B)SCIM%toHd{d=YkexC*Nw3~@@h98rJjJP%>{JbJ8$ zm;|G);F44cAE^7)0)9d<9p|I>c^Q;AqE6uBEkx8Ng`p9r;*L1upql<6JN#ybQVrkY zfTy2y?yq*OAF0GI>`%6 z?cM^qH)R;3Cg<{P0)VnIQ*~sUgFdIi^`v*}db2 ze#oPy2bQ&T-%)zn4X~JP$=A+!u$EM`V?8NwK3)5|9gca3;9a1k`e92K4MPJdXi19j zStnz0FZMfdr*TlCnWAR4@8eaqgM?1@)8D?W$Qe>QwRd5hu%+bopRoM5;|uB#@(!>f z>E9xh)A&K@7mcSLSa@V1@4%4aOTG{IjORlSkOnSse@4T(*#8TTt2ic8JSL{4H4lxo z_!Y#Ich=K_67%7&$GuhBqhj=^a2eQBtQ;6>cD#iHq-q#ggQ72$JYT4mY(X%nzGRX! z_0&IeVnF|#@K)F15r=eSFC0gR(D~5ZcJq_=XkF)rwOsjldr|@p=ESC6BH72b3e;&4_}{AyJ4j z^kT=VL)cR*g$FK0BSj^@Km-4Y#4ungYx5m5s=XB_AREj|OH}hRaVFBt&Ibv=6CaCp zwXD$oK2y^McvRcExJCJEUpJ(XR%EP7AqA~FA7#Ghp)kdGBCHdHB??o0hd;%-*a@eM zN_!i+xmT=Ss*X4Z-2Q$$5&2w+s}_O%tEo>QDRJ#ZBSbQ4`WawaqHwCLn+_IEU{rA7 zWMGyYu&aBQ3qVExT_~{2Yfv{nByi60koPsDd}J+fXpS7qajAzMl1wGN4bMq<+o!bv zXrg^p)VdI<5tQDlUyFX&Av^@Aftg1Rp>|*vJ7LWxR$AcEN48tWzs2{pUk#46wKef| zXz!K)pq5YXoQHKr_`7U5x7zXb*{o^M3iL;uTIBL1G{PDdM&KW@*{K!y3M;6wC>W}G zSf;14wolD?0Ax$E1F!K_2=8t!ydAb+ibO3y?Ra{r#sQk1naL`d)h@oYg6j8IG@$L%U$@5%*0_F2g;Au*Yx_;Ne`%`9q@_; zSC1a3DK+IyV|J%h%rU^?(v(`9${O$nDN!xr0@95WNA+i}n(>REzPs>6p<+8r0(esT znW-cr-(^)I|B@0%e<$WjWnYU`1-xvLePaXj_Mzpp$*NP$+g}6OW=cs#uL>n4h1I-d zsHa!MHMh|)O+UQn_Z+?vrC|V1(@ic@8g7FeggRV;xv=TbJG5Ce3zfxr2z^;;jry+w zHwxLG5Dj+%K*X#Rk{<|6W9IF5#>6<%)e(&1(6 zz%+DeSf~em#&%$^IyNvc1KBX#S%Eu3X2JyuyolP0OSbIyru%?k!0mrmhml2UG9NElhoAeUjv;492DKD)me9X;Q=+aD%L&=1&Y}%38an z`$a&YK06JW2YuEbwK5kEb_78W@70Ho(yJ?%uRUV7N_<5rG*d;qZ0Sj9trx{V&UIzX zc7;zKu`iD_Ls#B=#I6+a#>0D3#3JvX{&Rux4E|uk-hxe!qzftS@@8vo)ZaXB82Ktjq z#$BM<$ipQUjN<;Z@Kfif?o!bNq!c$PA4>jz12-~a2|*HY<83h;APG~TFE%jc1;wH^ zk>Osknu{`96p|6!HSZkk1X#gZ;6QjZXaF!$jW z3+?h0voMEoz6y|dlORGw-SpJ+Q!}=$lw2@7p_7B~_Vmnl7@1=!BZLQ6*>7Sb#KvG<0?VPVDHXU^A?!A9x|(fMzpO0?2-0?(BKwO_x#G zoo4g$m4%C!=dUpxkVMqNpmCU+rW9&n+V%1qU2;Mz^n?<%vP^zVPD4Jk-rQ{j#{f;r zcpA5h86x|Ryq7Ng-U`)?ez?9YGtQ!~lGcoolhvc>-)e!O?1$=zoU<2S348ijbZ7uu z>W=fVyW)H-p53KlyYO*=NWy`ZrEZ;1s_6^>6cpEbYsqMy(BUCttc|*Z3$&v^0@03w z6-1}dSV)E~^!Q^kx;U$yQRjfuf6_9$&`P$dWZys?gg{A^>?ZMe28v{A_{VI6)b{JV zW0k6h%P&|NJ6l5$C3eP3YIGg zd=TE)L87VRbD>=WAxJekF(6=a&|9z&MNYG6dn+VvU?0l|C?v@v(yk3q4lwwLmd&p$ zkZQFYPkj~9_l4qZpfvIjl$WS{nmrSQs{EI#62q8P{CaUIZ7n+7cD14gW0=gn=48#N258 znR2Op-Ee$bM>8|yavlCE9J4bIq~*RoB|HESVQc092t%iNrfnWRNnlXzMYkC?*fLanUVaE`jsJorTEu|H2 zm-VLj!4_x_9!zFXt1L9wF*3B5I-&9)MM!SjYRV(yg>>*Wx=4R%QbW(NTBE5;+qxVG z60L0@XNhhU$~r3s7_5c9!0(l(V=OWm#lv+)EJ36*%)jUL5)gXN^%pBS5f4H*hcGW7 z!Zg3>qs^q7KF|Udv%TrI1eP?=)oq1upE(Px&IaIY5mXtF)6+VD^H>LbVTh9#L6Da@ znKsTZ32bYFt?~aAl$%%I2B=6wO)Okdcaf?-;$;UfjQSBC{0X6txFO!kxqkC15V(ra zXL~e25vl1nn#2#&@2#$o64>hzYekW6@iLa>hmaTbyu zF?gfb&DH)@G`=YB!Pq%lD`|w3$*LQyY$w_TPfqb!qa94KQKlK&{Ru2>xh8FX-3u0L zX?x-KoHqAAuqAz%!x#jVcGy$oO526%32ZLx-`%jz=~RY*psz1EL~bx$j+c$*`uNh6f-VsM-=z4 zRn9~?b6Dm<=idYwCL>q@G;krQ0E~fz!BxUgkK?(fe#=_P_~67Hw2ZKKpVL2Rxoj}k zfV1pTIAQpUIYIAk$}<9aM2KFmvF0dqU`jFUx!IKY&^i~ErhZcot$=1d{&qTiqn>S6 z6A}XIK$M4+m6DFY60AJ6mp1aOg*ZgndPFj?)f%o&S7ou_kwIRd#GJ7t78J}6ApCTv zB3sLatyLY{ZQF{~L~Z~}qfViuvZe`H)Bb?1p$9{3dAQdgU35&1Ee9q%W93b5FqAgS zd=VS$Gpq#}E3*c868p9worp@awdhs{fSDbZIB&4bd-!Sek#Lz!KrFurn`ub6tL>xtk8tP!s*87dTw#m>X8jokwV z?P&3v5}Yl`4y2fHMmntMcoxyOJB{Kh%Ef}X(TBDy#Ghc}C?mMQAgI~&8YB;I7TUK6 zzyB&;#J0rnrVsZtMjyKxrRMc0?_v`+!t3zbuD7rsk-IT5p7}tm1ru7Hk%DGL|7H)1 z*c2Aj1y)pGb0iX4vdp^Snf)E%hHbkUI|&ysjNM+oj#W&o5RjC!oFYK5D+om)gc#eR zxocNbyO1A{0mlIEfKC~Gz-Yl(Z9K2rVryiyj)YfJrUg*_%U-X=m^*1Vqwn+Gl^I85 z+}2*__mg6LeF!O;ft-}oODUa>t=W26M3}NB>$bLe7DPx>tET}0?9UPa6x9Xp*3(Az~5#7A7g0&j#NB1pjK9TH}`@0qlXWfBAv3c==!lfBQ&fER?3 zQOq)YiP}Xe89kfLVFqfF-c^riDPIz2AN4ewSFX-oo4fkmxyHH6^9ytDFElRCH|E|y zHz(^G;9$Hi@#{Jy@g_WDI>s@T15^ZOzg!Vaq_dPtpVzG}cnZ28ivio3Z<{(OqOx=N zM*DElF<^&H40;OM`=?XH4pP9B>8<=J=W~;<-p+5iw8kwjZ?P8-)nt2&+{pHW1hxm| z2`3lhy)EOf(gpuGN>6)%PH@RcgUiQBF88qOA&s~d+>tWe9?&sF4x zhZF7rE;&m91DlpQmU<^Zy~nJvuygKTg@pTmdJYu1NbPGW0m@rQ*%&!c*GNd|)@Bpv zg(0^yHbA%D#Ten5TTKQ#sJZdvtwzhXBz;qfQIEx+W5iN!$3a7N-E?H78tSF&4PuU-Ej0{6!DGpPA`q|IKvNCZU0lMjFpFg3Pv9rl`|@3Yw=0~td= ztk@zb4j5YEq9M0zEjn5v2We$RN-BcpdI)e8?}TL3EmYGlo_=u zR`k8S6X(qd8A1%(yTfgbZN%Z*!B00lereCrf~o3^A4#xc7@%)2oj#rQ4OnQ)R@>9H zS1gxMy5tPPbUqt0vT198?z2q^TD<4cGRrVwq64qVu1zda$+0_~jgwjgWQqxT2(%}! z474X5_Z$s=X(ujY&kJX;+q=aTLbJ~UOM8P;+Ja>PFPa^1kNX@me+@b!6dv>h0_K+p zQ^XCm=>v8z>fmq2cbD^g52mF_AaMj}HB zR4Q3BTmx=IPRY(6Qu%gLwmne4O*yzNXoMbO${+C%PvGWb=RW+yoA9FQ@DSr8P7dr$ zL8;sLcUbyyUaaRp+{S-sMQU->=}%i7CB$Jm_+_qRDLZo=|4r6H*KsnMFXdy_gg}f! z;c1-F^4Vl1C&2Uh0CuH7@y1D*2W4;ifditzLeAkEt>J=wwFrB^>#8F$7Dup05BpPo zQDiWDe-c5eMebtxz`awvQ~F+^`&6kAmo^ZT&wp_#z*FqUEir#k{)zkjLf1WAh|BjY zK?Q-W+^0Jfln)m+aR|v~5yz@_Q8r>!V9*eP8#W*#$` z*rQCJUIdOW#h~-DKy)xqh7}w*fA`;WeGPKwr}Hf zA-uZ9Yo~q}Z~YNDVhT5fQSQ^>$wigVOBL6dL{ygRjC}5v+`p_=N>1tX9C}R0dr(sl z&e$r6X{1tNABvFlgBk_O2>W~sKe#Pj*k>QMJmQ3)J5Co{UU7^VSR*dob)#p$g*b27 zTf&qw80`&2eLE|aC9FVV|E9~o0lwH}vI|wc!>v#dj%bWNXU^>ASq$mk&~%1lO5RSX zg5HpIP!!3+k~AJ7C@_CE9ZZB&_J?rkm^Fe$9JIBiHq4bRCRcWjKho7bJH2MKW)Z}b z0~xyA6z+6A2vzFxZ1I%yY&ZSB$YRt(hHm?3&TY|ph(k?xj2T5n{#XJwGlK;yc}V?j z%!{h?GK33hH0^paY;$UI{kzBj4E^_*ndd}oC9~f{+J7dQ9l#CAYy>prf}kp{`&kLw z!$#b`XNCSl$R0-&;DdF@MU;UfewvEGTLbT5DruwhmZ_48aVT- z(NGQM+uZ;Ufzx%=DpI+>-UJk0me5N?L&@Ic)68Dtz6bi63+ijUPyr_8_qy<~>5cBy zD=-%?wQq!Kj?XXgd1&USLNfqt~IfhU+(Ipiu`9NUH?mOATtOr+i-ZlCD7%vPU zR6Z_=d+~Bo0WDm^F1$8VU*+W|yint)8D3&uZt`-Qmp(6>yfEZZJ;w_p0QBlU*YDL| z<7I-Ezs?JNE9!6XvY(gVdalGg{ z2Zl?|Q;9F?w^>%{pity2Py}K?7w4fNlN-(EC=Uk;9GLsUyh%fJP2vF zAK%^hKEtQ(XX8WWFG`xMy6zeQ)$XYq(8SL{iBaICPsQb+g}{6tzF$}xJc`f8-O%}MEoq|wO&Cpp?V`e1_#^$5 zIkXd*9KxYHI>1|>tI0Cu7?!^vi<3(Vr3pvxEZQiQU~_cVhaoA4`iWRICtDfWtmX2oIcZ4;UFcnudajJ_kWyKm9%CcTA%=2? zXi0V2M95dDWtD!9ViiYDNn?^d9M3*>0qV1hI_<^!?s-&!<1|{~B{}(NLH!&f*nh2- zy*53Q?EtnL2n-CmGIzy$;q;mGIIruy-i-*ty^;(e=#5cz>K~#wb&;1}@FMbb97Cz& z?F40DPiRGtKvGRR$fJ9r9GeT!p222w`1PP+&A!tH7KOVvqEtF(ZT_F66bd08-!S4< zOZ%Ks$#q6QSAT@GR-U)YNEpUfs0K#_7y2Iec_4VBpigR$;}V{TK`q1wfY%2IujAs9 zyYaGy*Z|a*P6H*ZlmqUZdq1wM4Bf}+OYsQOcHIT8Am#C1#paph;2RG#Rpx$!21oCY zN$sFg)*jshzn4Ive-Kyhk3RsX$Gh=_DCJ+_00$iDftD7#Pe^J7ss8~Kyay?xI8z1Y z!2@Sy@13I5yieD^S!BI;O7VW4Ep^w$8NnsG0u8VSZoRCgZ>8bWI4z0P2n)EpzL+}T%MjZ5o715-GBQ{lX1kge^ z5XTI#E)bAD_B2X{)^03IMI&sIA;b#qTekxBk6G?N=jC6pFJroKhTzy8b^+ZP!jU~3 zBcU%G4>l$nS}iq~=!sGPl;!Xcgk;nVoSX)?mCPr304WX`)?6!DCLr7NIZn_mqc{v< z6t2Nak(;e6&H-q#5qH9^;+T?Aq4rUCUuhKi)W1h%kg{j+XMpHQ@F-FfJq4-W=m;CK zcn87}=OI8`LQEF*cKEowQW3H!-XGcofv8t;3>g@J;uNRHR7p;-KFfD1o0a>+51^EU zSoJfIIGzpNscu%~8Aa{w&7s`;Bb!4H9Q*8^l(~y(IuDLElez*^=SGULsji{#E)tu3a=4M-Qbss0pdehjQoP@K-x(oUJvA#c8`1A;e&^t3fqAxYEUj_NQy~?3u6=p=0zlu zIlcu`r*6>ZvLkL3pHu6P4U9li#MsZzj3&bpT+h%r;g3vqsDBGiz_An?IMrDXEaIr- z#9$iVNjbt{$#GIfKoDT|`^c;Q6qlJ{eJ{vH0-hu1c^NP_bn>$}(ra52vp zH$U`2j;KTuaiEnPNx4-HjON9_c}f8K%?e`^z@6ZD>~fxfH;dnDaUcFxi|W7N`OM47 zxE?O_w?@gP{w0!iH~$Uq{v$3)1+Gbqn>J5&wYaXU<9_r3dBXzqU~5EjSTN28!)b_O zqKL&(ujunC#Ga_{-N6|tR-HEAzQIaISn1Gmr?&`~sXj$!NMqDUAKNG938O>nBW9tM z&D+g)#hlo~J25fDRuIENYzi?VXj3F(3*Wzj_2&z7=ia?I|4vdh2O&ptFpN6PEEOFH zmJIW}8ElIRJIN63urU{dh<8mj9O~SRW$?B7n$|QtqofdB s#YGGb8XXYN^3Tm()3m|A6!FezvEm*nP8=BjQ6c^J@?^DoxccJ%0VC!v_5c6? literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/sessions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32a16698a803d7964e88cf66ac76169c1bdae3e1 GIT binary patch literal 13097 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/templating.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ba727052148d90ae79802c51da69c122defc16d GIT binary patch literal 5551 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/typing.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/typing.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..694bceac710fea7bbfff5b0b778f603502f2398d GIT binary patch literal 1775 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 BT9g0) literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/__pycache__/wrappers.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c8b4c80d7b4be5617c0054b2e6ab123090cf68c GIT binary patch literal 5023 zcmai1TW{RP6(+gdi&m?O3QKh4~~U)Hq0(Zk7~iHD!yN`8xhX-p3^TgQJRFv6N$(`l|2m|@*+sCyIlO}mBr zI%@=TVcTx2`(`j7cI=M2Zv_kCqP?hVT;E#~drIoEy@LO9!D_f>uj$$YjkVeQbB)dO z#!=0#=A|MOld1dpWSP9}J~>?D)Gm(FgG@`>;gHvfs0; zEgtf4my5)bW8Sv#3tj1rv7Se45(8YzjhJ=d^FzxOqcnsWl3rV_+=QgWIvl%_7AICZ zvE0O3_aHi1AACGiTNJ7cu-E3$n#QSh=t8KBq2wfRy?j$_excH|-g6@>Nq3c4Xo)RJ zql8PP#JVe`sCLVbRqW}gPX@FX$} zN{xw#4}8Y)eGpjjkkGV9Gk-UgnEjv-MJDhgOiY55_8J0KrLz)}Ot|L{eb0)qq^G9( zVh)DQTB!&e0d{9|WC{nSNU{|Xr_zr`4u9(LiS*;>3q5NHE>jVC{c8F)7<36Nd|-W-uk6;|8ak3qrc-k+UP&nc{mtY zUK|bmk+sjKJ$v>1ihkD+P3)F6@`cdOOn5N-LKCZ){^vGZeV(6JjBw3?~6joGV(8GGlKel={*v^|84R2Qpsw}-H%LYv_tv?{-=d`6N}l%8~w z-0yEaD(FYPwnJ<_^g)?jZVd)~*d4I?!~9d2)*8Bg0B4MaHHL3RvBXLqDQb`auyPoS z5G$r!o)ru?2Z+0Vh=~*_;s+fdaYJrFds4-< z!kB@m*jAl~G@&0EoHA6_DuEEocvRNThc$Xc>e7CME4N9zt+$NXa%q$D%Ttyh^44%E z0)G!Tg#SnSGY}ZoxWSBP`hg~HJkvkZnen+!p}eq->F!lAapWi96O@kVECscT)M8c1 zE!(3sF3Dr=ZsX)`MG+37DADS?~%o#h&A{!TdvD ziAYYH<*`apAk%w-;ti-kcFx*@fbofem|DSdSHrt_IFVB;0Q-mpu#4b1X{>YPBh;%sE@sRLe)f9S0n!qnbs6JqecgJa zcc=GyC4l_#DgY4#XMuiZ(uvQ)-#$KwgS9#S?S|3PO=Grt4*%qw0V?mjhtH+P}b{%x4% zzl=u5n7vYBcSeudyyU%pyrq(L*T{4(79q+bBA35YQSV!rMcTefX&a-#K?qKY@tCMrAN!J7u6g5Lq3lVhBSG(Ba`b1s$QXxYW z?N=#fDB|$Aaz!CaQ44i971SzSAhtc+c@H_Qa3k~>N>I^fpydBWigFFn71fxk{aGB{ zl=;UHk|!eU54lCFLWMfjh)6}A3-y(}b$IFcOpPD9``jrt9^^%o#2o4wgjbc^QG&tm zY2PAdZeG}c(D{)OP9vz0dujKfv?3%f?mlu+|EK*p4&L6_jYcYbzuvo}L?emhPMf5Y zNsPJz0I3j9(4SQIwaS8J`_#+RPj38S8dUNQ$FKo<5$YI7%!mw$lhc&t1wN&-3Iz(4 z)XY)jD8PG}zSRbAQ4T5*$xG{a-{(%^&-fs(5N30dKb5z~G7Q852z)AyP}M;3h@9(! zE`@^JUQOljKV00UtdrL3MXU1o-OUYWd(+-H)u!Z)E5W8+$tJ2l5H>L%}}L7*UV$?5{{PDVN@=%r85wzQW-7MoRbp=A?-NeyonEA z5H6~XX`+p(&8}`0oIR^#cV2uOYsC#3zC*)zG1$w6TRNq?syHid(t_JG+@XPX$`%S8 zJRSt49!i<-(-IW|DgOKhS3(6p%7hiuFcJP#Tn8ZjdNc?Pi&= (3, 8): + iscoroutinefunction = inspect.iscoroutinefunction +else: + + def iscoroutinefunction(func: t.Any) -> bool: + while inspect.ismethod(func): + func = func.__func__ + + while isinstance(func, functools.partial): + func = func.func + + return inspect.iscoroutinefunction(func) + + +def _make_timedelta(value: t.Optional[timedelta]) -> t.Optional[timedelta]: + if value is None or isinstance(value, timedelta): + return value + + return timedelta(seconds=value) + + +class Flask(Scaffold): + """The flask object implements a WSGI application and acts as the central + object. It is passed the name of the module or package of the + application. Once it is created it will act as a central registry for + the view functions, the URL rules, template configuration and much more. + + The name of the package is used to resolve resources from inside the + package or the folder the module is contained in depending on if the + package parameter resolves to an actual python package (a folder with + an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file). + + For more information about resource loading, see :func:`open_resource`. + + Usually you create a :class:`Flask` instance in your main module or + in the :file:`__init__.py` file of your package like this:: + + from flask import Flask + app = Flask(__name__) + + .. admonition:: About the First Parameter + + The idea of the first parameter is to give Flask an idea of what + belongs to your application. This name is used to find resources + on the filesystem, can be used by extensions to improve debugging + information and a lot more. + + So it's important what you provide there. If you are using a single + module, `__name__` is always the correct value. If you however are + using a package, it's usually recommended to hardcode the name of + your package there. + + For example if your application is defined in :file:`yourapplication/app.py` + you should create it with one of the two versions below:: + + app = Flask('yourapplication') + app = Flask(__name__.split('.')[0]) + + Why is that? The application will work even with `__name__`, thanks + to how resources are looked up. However it will make debugging more + painful. Certain extensions can make assumptions based on the + import name of your application. For example the Flask-SQLAlchemy + extension will look for the code in your application that triggered + an SQL query in debug mode. If the import name is not properly set + up, that debugging information is lost. (For example it would only + pick up SQL queries in `yourapplication.app` and not + `yourapplication.views.frontend`) + + .. versionadded:: 0.7 + The `static_url_path`, `static_folder`, and `template_folder` + parameters were added. + + .. versionadded:: 0.8 + The `instance_path` and `instance_relative_config` parameters were + added. + + .. versionadded:: 0.11 + The `root_path` parameter was added. + + .. versionadded:: 1.0 + The ``host_matching`` and ``static_host`` parameters were added. + + .. versionadded:: 1.0 + The ``subdomain_matching`` parameter was added. Subdomain + matching needs to be enabled manually now. Setting + :data:`SERVER_NAME` does not implicitly enable it. + + :param import_name: the name of the application package + :param static_url_path: can be used to specify a different path for the + static files on the web. Defaults to the name + of the `static_folder` folder. + :param static_folder: The folder with static files that is served at + ``static_url_path``. Relative to the application ``root_path`` + or an absolute path. Defaults to ``'static'``. + :param static_host: the host to use when adding the static route. + Defaults to None. Required when using ``host_matching=True`` + with a ``static_folder`` configured. + :param host_matching: set ``url_map.host_matching`` attribute. + Defaults to False. + :param subdomain_matching: consider the subdomain relative to + :data:`SERVER_NAME` when matching routes. Defaults to False. + :param template_folder: the folder that contains the templates that should + be used by the application. Defaults to + ``'templates'`` folder in the root path of the + application. + :param instance_path: An alternative instance path for the application. + By default the folder ``'instance'`` next to the + package or module is assumed to be the instance + path. + :param instance_relative_config: if set to ``True`` relative filenames + for loading the config are assumed to + be relative to the instance path instead + of the application root. + :param root_path: The path to the root of the application files. + This should only be set manually when it can't be detected + automatically, such as for namespace packages. + """ + + #: The class that is used for request objects. See :class:`~flask.Request` + #: for more information. + request_class = Request + + #: The class that is used for response objects. See + #: :class:`~flask.Response` for more information. + response_class = Response + + #: The class that is used for the Jinja environment. + #: + #: .. versionadded:: 0.11 + jinja_environment = Environment + + #: The class that is used for the :data:`~flask.g` instance. + #: + #: Example use cases for a custom class: + #: + #: 1. Store arbitrary attributes on flask.g. + #: 2. Add a property for lazy per-request database connectors. + #: 3. Return None instead of AttributeError on unexpected attributes. + #: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g. + #: + #: In Flask 0.9 this property was called `request_globals_class` but it + #: was changed in 0.10 to :attr:`app_ctx_globals_class` because the + #: flask.g object is now application context scoped. + #: + #: .. versionadded:: 0.10 + app_ctx_globals_class = _AppCtxGlobals + + #: The class that is used for the ``config`` attribute of this app. + #: Defaults to :class:`~flask.Config`. + #: + #: Example use cases for a custom class: + #: + #: 1. Default values for certain config options. + #: 2. Access to config values through attributes in addition to keys. + #: + #: .. versionadded:: 0.11 + config_class = Config + + #: The testing flag. Set this to ``True`` to enable the test mode of + #: Flask extensions (and in the future probably also Flask itself). + #: For example this might activate test helpers that have an + #: additional runtime cost which should not be enabled by default. + #: + #: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the + #: default it's implicitly enabled. + #: + #: This attribute can also be configured from the config with the + #: ``TESTING`` configuration key. Defaults to ``False``. + testing = ConfigAttribute("TESTING") + + #: If a secret key is set, cryptographic components can use this to + #: sign cookies and other things. Set this to a complex random value + #: when you want to use the secure cookie for instance. + #: + #: This attribute can also be configured from the config with the + #: :data:`SECRET_KEY` configuration key. Defaults to ``None``. + secret_key = ConfigAttribute("SECRET_KEY") + + #: The secure cookie uses this for the name of the session cookie. + #: + #: This attribute can also be configured from the config with the + #: ``SESSION_COOKIE_NAME`` configuration key. Defaults to ``'session'`` + session_cookie_name = ConfigAttribute("SESSION_COOKIE_NAME") + + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute( + "PERMANENT_SESSION_LIFETIME", get_converter=_make_timedelta + ) + + #: A :class:`~datetime.timedelta` or number of seconds which is used + #: as the default ``max_age`` for :func:`send_file`. The default is + #: ``None``, which tells the browser to use conditional requests + #: instead of a timed cache. + #: + #: Configured with the :data:`SEND_FILE_MAX_AGE_DEFAULT` + #: configuration key. + #: + #: .. versionchanged:: 2.0 + #: Defaults to ``None`` instead of 12 hours. + send_file_max_age_default = ConfigAttribute( + "SEND_FILE_MAX_AGE_DEFAULT", get_converter=_make_timedelta + ) + + #: Enable this if you want to use the X-Sendfile feature. Keep in + #: mind that the server has to support this. This only affects files + #: sent with the :func:`send_file` method. + #: + #: .. versionadded:: 0.2 + #: + #: This attribute can also be configured from the config with the + #: ``USE_X_SENDFILE`` configuration key. Defaults to ``False``. + use_x_sendfile = ConfigAttribute("USE_X_SENDFILE") + + #: The JSON encoder class to use. Defaults to :class:`~flask.json.JSONEncoder`. + #: + #: .. versionadded:: 0.10 + json_encoder = json.JSONEncoder + + #: The JSON decoder class to use. Defaults to :class:`~flask.json.JSONDecoder`. + #: + #: .. versionadded:: 0.10 + json_decoder = json.JSONDecoder + + #: Options that are passed to the Jinja environment in + #: :meth:`create_jinja_environment`. Changing these options after + #: the environment is created (accessing :attr:`jinja_env`) will + #: have no effect. + #: + #: .. versionchanged:: 1.1.0 + #: This is a ``dict`` instead of an ``ImmutableDict`` to allow + #: easier configuration. + #: + jinja_options: dict = {} + + #: Default configuration parameters. + default_config = ImmutableDict( + { + "ENV": None, + "DEBUG": None, + "TESTING": False, + "PROPAGATE_EXCEPTIONS": None, + "PRESERVE_CONTEXT_ON_EXCEPTION": None, + "SECRET_KEY": None, + "PERMANENT_SESSION_LIFETIME": timedelta(days=31), + "USE_X_SENDFILE": False, + "SERVER_NAME": None, + "APPLICATION_ROOT": "/", + "SESSION_COOKIE_NAME": "session", + "SESSION_COOKIE_DOMAIN": None, + "SESSION_COOKIE_PATH": None, + "SESSION_COOKIE_HTTPONLY": True, + "SESSION_COOKIE_SECURE": False, + "SESSION_COOKIE_SAMESITE": None, + "SESSION_REFRESH_EACH_REQUEST": True, + "MAX_CONTENT_LENGTH": None, + "SEND_FILE_MAX_AGE_DEFAULT": None, + "TRAP_BAD_REQUEST_ERRORS": None, + "TRAP_HTTP_EXCEPTIONS": False, + "EXPLAIN_TEMPLATE_LOADING": False, + "PREFERRED_URL_SCHEME": "http", + "JSON_AS_ASCII": True, + "JSON_SORT_KEYS": True, + "JSONIFY_PRETTYPRINT_REGULAR": False, + "JSONIFY_MIMETYPE": "application/json", + "TEMPLATES_AUTO_RELOAD": None, + "MAX_COOKIE_SIZE": 4093, + } + ) + + #: The rule object to use for URL rules created. This is used by + #: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`. + #: + #: .. versionadded:: 0.7 + url_rule_class = Rule + + #: The map object to use for storing the URL rules and routing + #: configuration parameters. Defaults to :class:`werkzeug.routing.Map`. + #: + #: .. versionadded:: 1.1.0 + url_map_class = Map + + #: The :meth:`test_client` method creates an instance of this test + #: client class. Defaults to :class:`~flask.testing.FlaskClient`. + #: + #: .. versionadded:: 0.7 + test_client_class: t.Optional[t.Type["FlaskClient"]] = None + + #: The :class:`~click.testing.CliRunner` subclass, by default + #: :class:`~flask.testing.FlaskCliRunner` that is used by + #: :meth:`test_cli_runner`. Its ``__init__`` method should take a + #: Flask app object as the first argument. + #: + #: .. versionadded:: 1.0 + test_cli_runner_class: t.Optional[t.Type["FlaskCliRunner"]] = None + + #: the session interface to use. By default an instance of + #: :class:`~flask.sessions.SecureCookieSessionInterface` is used here. + #: + #: .. versionadded:: 0.8 + session_interface = SecureCookieSessionInterface() + + def __init__( + self, + import_name: str, + static_url_path: t.Optional[str] = None, + static_folder: t.Optional[t.Union[str, os.PathLike]] = "static", + static_host: t.Optional[str] = None, + host_matching: bool = False, + subdomain_matching: bool = False, + template_folder: t.Optional[str] = "templates", + instance_path: t.Optional[str] = None, + instance_relative_config: bool = False, + root_path: t.Optional[str] = None, + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if instance_path is None: + instance_path = self.auto_find_instance_path() + elif not os.path.isabs(instance_path): + raise ValueError( + "If an instance path is provided it must be absolute." + " A relative path was given instead." + ) + + #: Holds the path to the instance folder. + #: + #: .. versionadded:: 0.8 + self.instance_path = instance_path + + #: The configuration dictionary as :class:`Config`. This behaves + #: exactly like a regular dictionary but supports additional methods + #: to load a config from files. + self.config = self.make_config(instance_relative_config) + + #: A list of functions that are called when :meth:`url_for` raises a + #: :exc:`~werkzeug.routing.BuildError`. Each function registered here + #: is called with `error`, `endpoint` and `values`. If a function + #: returns ``None`` or raises a :exc:`BuildError` the next function is + #: tried. + #: + #: .. versionadded:: 0.9 + self.url_build_error_handlers: t.List[ + t.Callable[[Exception, str, dict], str] + ] = [] + + #: A list of functions that will be called at the beginning of the + #: first request to this instance. To register a function, use the + #: :meth:`before_first_request` decorator. + #: + #: .. versionadded:: 0.8 + self.before_first_request_funcs: t.List[BeforeFirstRequestCallable] = [] + + #: A list of functions that are called when the application context + #: is destroyed. Since the application context is also torn down + #: if the request ends this is the place to store code that disconnects + #: from databases. + #: + #: .. versionadded:: 0.9 + self.teardown_appcontext_funcs: t.List[TeardownCallable] = [] + + #: A list of shell context processor functions that should be run + #: when a shell context is created. + #: + #: .. versionadded:: 0.11 + self.shell_context_processors: t.List[t.Callable[[], t.Dict[str, t.Any]]] = [] + + #: Maps registered blueprint names to blueprint objects. The + #: dict retains the order the blueprints were registered in. + #: Blueprints can be registered multiple times, this dict does + #: not track how often they were attached. + #: + #: .. versionadded:: 0.7 + self.blueprints: t.Dict[str, "Blueprint"] = {} + + #: a place where extensions can store application specific state. For + #: example this is where an extension could store database engines and + #: similar things. + #: + #: The key must match the name of the extension module. For example in + #: case of a "Flask-Foo" extension in `flask_foo`, the key would be + #: ``'foo'``. + #: + #: .. versionadded:: 0.7 + self.extensions: dict = {} + + #: The :class:`~werkzeug.routing.Map` for this instance. You can use + #: this to change the routing converters after the class was created + #: but before any routes are connected. Example:: + #: + #: from werkzeug.routing import BaseConverter + #: + #: class ListConverter(BaseConverter): + #: def to_python(self, value): + #: return value.split(',') + #: def to_url(self, values): + #: return ','.join(super(ListConverter, self).to_url(value) + #: for value in values) + #: + #: app = Flask(__name__) + #: app.url_map.converters['list'] = ListConverter + self.url_map = self.url_map_class() + + self.url_map.host_matching = host_matching + self.subdomain_matching = subdomain_matching + + # tracks internally if the application already handled at least one + # request. + self._got_first_request = False + self._before_request_lock = Lock() + + # Add a static route using the provided static_url_path, static_host, + # and static_folder if there is a configured static_folder. + # Note we do this without checking if static_folder exists. + # For one, it might be created while the server is running (e.g. during + # development). Also, Google App Engine stores static files somewhere + if self.has_static_folder: + assert ( + bool(static_host) == host_matching + ), "Invalid static_host/host_matching combination" + # Use a weakref to avoid creating a reference cycle between the app + # and the view function (see #3761). + self_ref = weakref.ref(self) + self.add_url_rule( + f"{self.static_url_path}/", + endpoint="static", + host=static_host, + view_func=lambda **kw: self_ref().send_static_file(**kw), # type: ignore # noqa: B950 + ) + + # Set the name of the Click group in case someone wants to add + # the app's commands to another CLI tool. + self.cli.name = self.name + + def _is_setup_finished(self) -> bool: + return self.debug and self._got_first_request + + @locked_cached_property + def name(self) -> str: # type: ignore + """The name of the application. This is usually the import name + with the difference that it's guessed from the run file if the + import name is main. This name is used as a display name when + Flask needs the name of the application. It can be set and overridden + to change the value. + + .. versionadded:: 0.8 + """ + if self.import_name == "__main__": + fn = getattr(sys.modules["__main__"], "__file__", None) + if fn is None: + return "__main__" + return os.path.splitext(os.path.basename(fn))[0] + return self.import_name + + @property + def propagate_exceptions(self) -> bool: + """Returns the value of the ``PROPAGATE_EXCEPTIONS`` configuration + value in case it's set, otherwise a sensible default is returned. + + .. versionadded:: 0.7 + """ + rv = self.config["PROPAGATE_EXCEPTIONS"] + if rv is not None: + return rv + return self.testing or self.debug + + @property + def preserve_context_on_exception(self) -> bool: + """Returns the value of the ``PRESERVE_CONTEXT_ON_EXCEPTION`` + configuration value in case it's set, otherwise a sensible default + is returned. + + .. versionadded:: 0.7 + """ + rv = self.config["PRESERVE_CONTEXT_ON_EXCEPTION"] + if rv is not None: + return rv + return self.debug + + @locked_cached_property + def logger(self) -> logging.Logger: + """A standard Python :class:`~logging.Logger` for the app, with + the same name as :attr:`name`. + + In debug mode, the logger's :attr:`~logging.Logger.level` will + be set to :data:`~logging.DEBUG`. + + If there are no handlers configured, a default handler will be + added. See :doc:`/logging` for more information. + + .. versionchanged:: 1.1.0 + The logger takes the same name as :attr:`name` rather than + hard-coding ``"flask.app"``. + + .. versionchanged:: 1.0.0 + Behavior was simplified. The logger is always named + ``"flask.app"``. The level is only set during configuration, + it doesn't check ``app.debug`` each time. Only one format is + used, not different ones depending on ``app.debug``. No + handlers are removed, and a handler is only added if no + handlers are already configured. + + .. versionadded:: 0.3 + """ + return create_logger(self) + + @locked_cached_property + def jinja_env(self) -> Environment: + """The Jinja environment used to load templates. + + The environment is created the first time this property is + accessed. Changing :attr:`jinja_options` after that will have no + effect. + """ + return self.create_jinja_environment() + + @property + def got_first_request(self) -> bool: + """This attribute is set to ``True`` if the application started + handling the first request. + + .. versionadded:: 0.8 + """ + return self._got_first_request + + def make_config(self, instance_relative: bool = False) -> Config: + """Used to create the config attribute by the Flask constructor. + The `instance_relative` parameter is passed in from the constructor + of Flask (there named `instance_relative_config`) and indicates if + the config should be relative to the instance path or the root path + of the application. + + .. versionadded:: 0.8 + """ + root_path = self.root_path + if instance_relative: + root_path = self.instance_path + defaults = dict(self.default_config) + defaults["ENV"] = get_env() + defaults["DEBUG"] = get_debug_flag() + return self.config_class(root_path, defaults) + + def auto_find_instance_path(self) -> str: + """Tries to locate the instance path if it was not provided to the + constructor of the application class. It will basically calculate + the path to a folder named ``instance`` next to your main file or + the package. + + .. versionadded:: 0.8 + """ + prefix, package_path = find_package(self.import_name) + if prefix is None: + return os.path.join(package_path, "instance") + return os.path.join(prefix, "var", f"{self.name}-instance") + + def open_instance_resource(self, resource: str, mode: str = "rb") -> t.IO[t.AnyStr]: + """Opens a resource from the application's instance folder + (:attr:`instance_path`). Otherwise works like + :meth:`open_resource`. Instance resources can also be opened for + writing. + + :param resource: the name of the resource. To access resources within + subfolders use forward slashes as separator. + :param mode: resource file opening mode, default is 'rb'. + """ + return open(os.path.join(self.instance_path, resource), mode) + + @property + def templates_auto_reload(self) -> bool: + """Reload templates when they are changed. Used by + :meth:`create_jinja_environment`. + + This attribute can be configured with :data:`TEMPLATES_AUTO_RELOAD`. If + not set, it will be enabled in debug mode. + + .. versionadded:: 1.0 + This property was added but the underlying config and behavior + already existed. + """ + rv = self.config["TEMPLATES_AUTO_RELOAD"] + return rv if rv is not None else self.debug + + @templates_auto_reload.setter + def templates_auto_reload(self, value: bool) -> None: + self.config["TEMPLATES_AUTO_RELOAD"] = value + + def create_jinja_environment(self) -> Environment: + """Create the Jinja environment based on :attr:`jinja_options` + and the various Jinja-related methods of the app. Changing + :attr:`jinja_options` after this will have no effect. Also adds + Flask-related globals and filters to the environment. + + .. versionchanged:: 0.11 + ``Environment.auto_reload`` set in accordance with + ``TEMPLATES_AUTO_RELOAD`` configuration option. + + .. versionadded:: 0.5 + """ + options = dict(self.jinja_options) + + if "autoescape" not in options: + options["autoescape"] = self.select_jinja_autoescape + + if "auto_reload" not in options: + options["auto_reload"] = self.templates_auto_reload + + rv = self.jinja_environment(self, **options) + rv.globals.update( + url_for=url_for, + get_flashed_messages=get_flashed_messages, + config=self.config, + # request, session and g are normally added with the + # context processor for efficiency reasons but for imported + # templates we also want the proxies in there. + request=request, + session=session, + g=g, + ) + rv.policies["json.dumps_function"] = json.dumps + return rv + + def create_global_jinja_loader(self) -> DispatchingJinjaLoader: + """Creates the loader for the Jinja2 environment. Can be used to + override just the loader and keeping the rest unchanged. It's + discouraged to override this function. Instead one should override + the :meth:`jinja_loader` function instead. + + The global loader dispatches between the loaders of the application + and the individual blueprints. + + .. versionadded:: 0.7 + """ + return DispatchingJinjaLoader(self) + + def select_jinja_autoescape(self, filename: str) -> bool: + """Returns ``True`` if autoescaping should be active for the given + template name. If no template name is given, returns `True`. + + .. versionadded:: 0.5 + """ + if filename is None: + return True + return filename.endswith((".html", ".htm", ".xml", ".xhtml")) + + def update_template_context(self, context: dict) -> None: + """Update the template context with some commonly used variables. + This injects request, session, config and g into the template + context as well as everything template context processors want + to inject. Note that the as of Flask 0.6, the original values + in the context will not be overridden if a context processor + decides to return a value with the same key. + + :param context: the context as a dictionary that is updated in place + to add extra variables. + """ + names: t.Iterable[t.Optional[str]] = (None,) + + # A template may be rendered outside a request context. + if request: + names = chain(names, reversed(request.blueprints)) + + # The values passed to render_template take precedence. Keep a + # copy to re-apply after all context functions. + orig_ctx = context.copy() + + for name in names: + if name in self.template_context_processors: + for func in self.template_context_processors[name]: + context.update(func()) + + context.update(orig_ctx) + + def make_shell_context(self) -> dict: + """Returns the shell context for an interactive shell for this + application. This runs all the registered shell context + processors. + + .. versionadded:: 0.11 + """ + rv = {"app": self, "g": g} + for processor in self.shell_context_processors: + rv.update(processor()) + return rv + + #: What environment the app is running in. Flask and extensions may + #: enable behaviors based on the environment, such as enabling debug + #: mode. This maps to the :data:`ENV` config key. This is set by the + #: :envvar:`FLASK_ENV` environment variable and may not behave as + #: expected if set in code. + #: + #: **Do not enable development when deploying in production.** + #: + #: Default: ``'production'`` + env = ConfigAttribute("ENV") + + @property + def debug(self) -> bool: + """Whether debug mode is enabled. When using ``flask run`` to start + the development server, an interactive debugger will be shown for + unhandled exceptions, and the server will be reloaded when code + changes. This maps to the :data:`DEBUG` config key. This is + enabled when :attr:`env` is ``'development'`` and is overridden + by the ``FLASK_DEBUG`` environment variable. It may not behave as + expected if set in code. + + **Do not enable debug mode when deploying in production.** + + Default: ``True`` if :attr:`env` is ``'development'``, or + ``False`` otherwise. + """ + return self.config["DEBUG"] + + @debug.setter + def debug(self, value: bool) -> None: + self.config["DEBUG"] = value + self.jinja_env.auto_reload = self.templates_auto_reload + + def run( + self, + host: t.Optional[str] = None, + port: t.Optional[int] = None, + debug: t.Optional[bool] = None, + load_dotenv: bool = True, + **options: t.Any, + ) -> None: + """Runs the application on a local development server. + + Do not use ``run()`` in a production setting. It is not intended to + meet security and performance requirements for a production server. + Instead, see :doc:`/deploying/index` for WSGI server recommendations. + + If the :attr:`debug` flag is set the server will automatically reload + for code changes and show a debugger in case an exception happened. + + If you want to run the application in debug mode, but disable the + code execution on the interactive debugger, you can pass + ``use_evalex=False`` as parameter. This will keep the debugger's + traceback screen active, but disable code execution. + + It is not recommended to use this function for development with + automatic reloading as this is badly supported. Instead you should + be using the :command:`flask` command line script's ``run`` support. + + .. admonition:: Keep in Mind + + Flask will suppress any server error with a generic error page + unless it is in debug mode. As such to enable just the + interactive debugger without the code reloading, you have to + invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``. + Setting ``use_debugger`` to ``True`` without being in debug mode + won't catch any exceptions because there won't be any to + catch. + + :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to + have the server available externally as well. Defaults to + ``'127.0.0.1'`` or the host in the ``SERVER_NAME`` config variable + if present. + :param port: the port of the webserver. Defaults to ``5000`` or the + port defined in the ``SERVER_NAME`` config variable if present. + :param debug: if given, enable or disable debug mode. See + :attr:`debug`. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param options: the options to be forwarded to the underlying Werkzeug + server. See :func:`werkzeug.serving.run_simple` for more + information. + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment + variables from :file:`.env` and :file:`.flaskenv` files. + + If set, the :envvar:`FLASK_ENV` and :envvar:`FLASK_DEBUG` + environment variables will override :attr:`env` and + :attr:`debug`. + + Threaded mode is enabled by default. + + .. versionchanged:: 0.10 + The default port is now picked from the ``SERVER_NAME`` + variable. + """ + # Change this into a no-op if the server is invoked from the + # command line. Have a look at cli.py for more information. + if os.environ.get("FLASK_RUN_FROM_CLI") == "true": + from .debughelpers import explain_ignored_app_run + + explain_ignored_app_run() + return + + if get_load_dotenv(load_dotenv): + cli.load_dotenv() + + # if set, let env vars override previous values + if "FLASK_ENV" in os.environ: + self.env = get_env() + self.debug = get_debug_flag() + elif "FLASK_DEBUG" in os.environ: + self.debug = get_debug_flag() + + # debug passed to method overrides all other sources + if debug is not None: + self.debug = bool(debug) + + server_name = self.config.get("SERVER_NAME") + sn_host = sn_port = None + + if server_name: + sn_host, _, sn_port = server_name.partition(":") + + if not host: + if sn_host: + host = sn_host + else: + host = "127.0.0.1" + + if port or port == 0: + port = int(port) + elif sn_port: + port = int(sn_port) + else: + port = 5000 + + options.setdefault("use_reloader", self.debug) + options.setdefault("use_debugger", self.debug) + options.setdefault("threaded", True) + + cli.show_server_banner(self.env, self.debug, self.name, False) + + from werkzeug.serving import run_simple + + try: + run_simple(t.cast(str, host), port, self, **options) + finally: + # reset the first request information if the development server + # reset normally. This makes it possible to restart the server + # without reloader and that stuff from an interactive shell. + self._got_first_request = False + + def test_client(self, use_cookies: bool = True, **kwargs: t.Any) -> "FlaskClient": + """Creates a test client for this application. For information + about unit testing head over to :doc:`/testing`. + + Note that if you are testing for assertions or exceptions in your + application code, you must set ``app.testing = True`` in order for the + exceptions to propagate to the test client. Otherwise, the exception + will be handled by the application (not visible to the test client) and + the only indication of an AssertionError or other exception will be a + 500 status code response to the test client. See the :attr:`testing` + attribute. For example:: + + app.testing = True + client = app.test_client() + + The test client can be used in a ``with`` block to defer the closing down + of the context until the end of the ``with`` block. This is useful if + you want to access the context locals for testing:: + + with app.test_client() as c: + rv = c.get('/?vodka=42') + assert request.args['vodka'] == '42' + + Additionally, you may pass optional keyword arguments that will then + be passed to the application's :attr:`test_client_class` constructor. + For example:: + + from flask.testing import FlaskClient + + class CustomClient(FlaskClient): + def __init__(self, *args, **kwargs): + self._authentication = kwargs.pop("authentication") + super(CustomClient,self).__init__( *args, **kwargs) + + app.test_client_class = CustomClient + client = app.test_client(authentication='Basic ....') + + See :class:`~flask.testing.FlaskClient` for more information. + + .. versionchanged:: 0.4 + added support for ``with`` block usage for the client. + + .. versionadded:: 0.7 + The `use_cookies` parameter was added as well as the ability + to override the client to be used by setting the + :attr:`test_client_class` attribute. + + .. versionchanged:: 0.11 + Added `**kwargs` to support passing additional keyword arguments to + the constructor of :attr:`test_client_class`. + """ + cls = self.test_client_class + if cls is None: + from .testing import FlaskClient as cls # type: ignore + return cls( # type: ignore + self, self.response_class, use_cookies=use_cookies, **kwargs + ) + + def test_cli_runner(self, **kwargs: t.Any) -> "FlaskCliRunner": + """Create a CLI runner for testing CLI commands. + See :ref:`testing-cli`. + + Returns an instance of :attr:`test_cli_runner_class`, by default + :class:`~flask.testing.FlaskCliRunner`. The Flask app object is + passed as the first argument. + + .. versionadded:: 1.0 + """ + cls = self.test_cli_runner_class + + if cls is None: + from .testing import FlaskCliRunner as cls # type: ignore + + return cls(self, **kwargs) # type: ignore + + @setupmethod + def register_blueprint(self, blueprint: "Blueprint", **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on the application. Keyword + arguments passed to this method will override the defaults set on the + blueprint. + + Calls the blueprint's :meth:`~flask.Blueprint.register` method after + recording the blueprint in the application's :attr:`blueprints`. + + :param blueprint: The blueprint to register. + :param url_prefix: Blueprint routes will be prefixed with this. + :param subdomain: Blueprint routes will match on this subdomain. + :param url_defaults: Blueprint routes will use these default values for + view arguments. + :param options: Additional keyword arguments are passed to + :class:`~flask.blueprints.BlueprintSetupState`. They can be + accessed in :meth:`~flask.Blueprint.record` callbacks. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 0.7 + """ + blueprint.register(self, options) + + def iter_blueprints(self) -> t.ValuesView["Blueprint"]: + """Iterates over all blueprints by the order they were registered. + + .. versionadded:: 0.11 + """ + return self.blueprints.values() + + @setupmethod + def add_url_rule( + self, + rule: str, + endpoint: t.Optional[str] = None, + view_func: t.Optional[t.Callable] = None, + provide_automatic_options: t.Optional[bool] = None, + **options: t.Any, + ) -> None: + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + options["endpoint"] = endpoint + methods = options.pop("methods", None) + + # if the methods are not given and the view_func object knows its + # methods we can use that instead. If neither exists, we go with + # a tuple of only ``GET`` as default. + if methods is None: + methods = getattr(view_func, "methods", None) or ("GET",) + if isinstance(methods, str): + raise TypeError( + "Allowed methods must be a list of strings, for" + ' example: @app.route(..., methods=["POST"])' + ) + methods = {item.upper() for item in methods} + + # Methods that should always be added + required_methods = set(getattr(view_func, "required_methods", ())) + + # starting with Flask 0.8 the view_func object can disable and + # force-enable the automatic options handling. + if provide_automatic_options is None: + provide_automatic_options = getattr( + view_func, "provide_automatic_options", None + ) + + if provide_automatic_options is None: + if "OPTIONS" not in methods: + provide_automatic_options = True + required_methods.add("OPTIONS") + else: + provide_automatic_options = False + + # Add the required methods now. + methods |= required_methods + + rule = self.url_rule_class(rule, methods=methods, **options) + rule.provide_automatic_options = provide_automatic_options # type: ignore + + self.url_map.add(rule) + if view_func is not None: + old_func = self.view_functions.get(endpoint) + if old_func is not None and old_func != view_func: + raise AssertionError( + "View function mapping is overwriting an existing" + f" endpoint function: {endpoint}" + ) + self.view_functions[endpoint] = view_func + + @setupmethod + def template_filter( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateFilterCallable], TemplateFilterCallable]: + """A decorator that is used to register custom template filter. + You can specify a name for the filter, otherwise the function + name will be used. Example:: + + @app.template_filter() + def reverse(s): + return s[::-1] + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: TemplateFilterCallable) -> TemplateFilterCallable: + self.add_template_filter(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_filter( + self, f: TemplateFilterCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template filter. Works exactly like the + :meth:`template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + self.jinja_env.filters[name or f.__name__] = f + + @setupmethod + def template_test( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateTestCallable], TemplateTestCallable]: + """A decorator that is used to register custom template test. + You can specify a name for the test, otherwise the function + name will be used. Example:: + + @app.template_test() + def is_prime(n): + if n == 2: + return True + for i in range(2, int(math.ceil(math.sqrt(n))) + 1): + if n % i == 0: + return False + return True + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: TemplateTestCallable) -> TemplateTestCallable: + self.add_template_test(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_test( + self, f: TemplateTestCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template test. Works exactly like the + :meth:`template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + self.jinja_env.tests[name or f.__name__] = f + + @setupmethod + def template_global( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateGlobalCallable], TemplateGlobalCallable]: + """A decorator that is used to register a custom template global function. + You can specify a name for the global function, otherwise the function + name will be used. Example:: + + @app.template_global() + def double(n): + return 2 * n + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + + def decorator(f: TemplateGlobalCallable) -> TemplateGlobalCallable: + self.add_template_global(f, name=name) + return f + + return decorator + + @setupmethod + def add_template_global( + self, f: TemplateGlobalCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template global function. Works exactly like the + :meth:`template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global function, otherwise the + function name will be used. + """ + self.jinja_env.globals[name or f.__name__] = f + + @setupmethod + def before_first_request( + self, f: BeforeFirstRequestCallable + ) -> BeforeFirstRequestCallable: + """Registers a function to be run before the first request to this + instance of the application. + + The function will be called without any arguments and its return + value is ignored. + + .. versionadded:: 0.8 + """ + self.before_first_request_funcs.append(f) + return f + + @setupmethod + def teardown_appcontext(self, f: TeardownCallable) -> TeardownCallable: + """Registers a function to be called when the application context + ends. These functions are typically also called when the request + context is popped. + + Example:: + + ctx = app.app_context() + ctx.push() + ... + ctx.pop() + + When ``ctx.pop()`` is executed in the above example, the teardown + functions are called just before the app context moves from the + stack of active contexts. This becomes relevant if you are using + such constructs in tests. + + Since a request context typically also manages an application + context it would also be called when you pop a request context. + + When a teardown function was called because of an unhandled exception + it will be passed an error object. If an :meth:`errorhandler` is + registered, it will handle the exception and the teardown will not + receive it. + + The return values of teardown functions are ignored. + + .. versionadded:: 0.9 + """ + self.teardown_appcontext_funcs.append(f) + return f + + @setupmethod + def shell_context_processor(self, f: t.Callable) -> t.Callable: + """Registers a shell context processor function. + + .. versionadded:: 0.11 + """ + self.shell_context_processors.append(f) + return f + + def _find_error_handler( + self, e: Exception + ) -> t.Optional["ErrorHandlerCallable[Exception]"]: + """Return a registered error handler for an exception in this order: + blueprint handler for a specific code, app handler for a specific code, + blueprint handler for an exception class, app handler for an exception + class, or ``None`` if a suitable handler is not found. + """ + exc_class, code = self._get_exc_class_and_code(type(e)) + names = (*request.blueprints, None) + + for c in (code, None) if code is not None else (None,): + for name in names: + handler_map = self.error_handler_spec[name][c] + + if not handler_map: + continue + + for cls in exc_class.__mro__: + handler = handler_map.get(cls) + + if handler is not None: + return handler + return None + + def handle_http_exception( + self, e: HTTPException + ) -> t.Union[HTTPException, ResponseReturnValue]: + """Handles an HTTP exception. By default this will invoke the + registered error handlers and fall back to returning the + exception as response. + + .. versionchanged:: 1.0.3 + ``RoutingException``, used internally for actions such as + slash redirects during routing, is not passed to error + handlers. + + .. versionchanged:: 1.0 + Exceptions are looked up by code *and* by MRO, so + ``HTTPException`` subclasses can be handled with a catch-all + handler for the base ``HTTPException``. + + .. versionadded:: 0.3 + """ + # Proxy exceptions don't have error codes. We want to always return + # those unchanged as errors + if e.code is None: + return e + + # RoutingExceptions are used internally to trigger routing + # actions, such as slash redirects raising RequestRedirect. They + # are not raised or handled in user code. + if isinstance(e, RoutingException): + return e + + handler = self._find_error_handler(e) + if handler is None: + return e + return self.ensure_sync(handler)(e) + + def trap_http_exception(self, e: Exception) -> bool: + """Checks if an HTTP exception should be trapped or not. By default + this will return ``False`` for all exceptions except for a bad request + key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It + also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``. + + This is called for all HTTP exceptions raised by a view function. + If it returns ``True`` for any exception the error handler for this + exception is not called and it shows up as regular exception in the + traceback. This is helpful for debugging implicitly raised HTTP + exceptions. + + .. versionchanged:: 1.0 + Bad request errors are not trapped by default in debug mode. + + .. versionadded:: 0.8 + """ + if self.config["TRAP_HTTP_EXCEPTIONS"]: + return True + + trap_bad_request = self.config["TRAP_BAD_REQUEST_ERRORS"] + + # if unset, trap key errors in debug mode + if ( + trap_bad_request is None + and self.debug + and isinstance(e, BadRequestKeyError) + ): + return True + + if trap_bad_request: + return isinstance(e, BadRequest) + + return False + + def handle_user_exception( + self, e: Exception + ) -> t.Union[HTTPException, ResponseReturnValue]: + """This method is called whenever an exception occurs that + should be handled. A special case is :class:`~werkzeug + .exceptions.HTTPException` which is forwarded to the + :meth:`handle_http_exception` method. This function will either + return a response value or reraise the exception with the same + traceback. + + .. versionchanged:: 1.0 + Key errors raised from request data like ``form`` show the + bad key in debug mode rather than a generic bad request + message. + + .. versionadded:: 0.7 + """ + if isinstance(e, BadRequestKeyError) and ( + self.debug or self.config["TRAP_BAD_REQUEST_ERRORS"] + ): + e.show_exception = True + + if isinstance(e, HTTPException) and not self.trap_http_exception(e): + return self.handle_http_exception(e) + + handler = self._find_error_handler(e) + + if handler is None: + raise + + return self.ensure_sync(handler)(e) + + def handle_exception(self, e: Exception) -> Response: + """Handle an exception that did not have an error handler + associated with it, or that was raised from an error handler. + This always causes a 500 ``InternalServerError``. + + Always sends the :data:`got_request_exception` signal. + + If :attr:`propagate_exceptions` is ``True``, such as in debug + mode, the error will be re-raised so that the debugger can + display it. Otherwise, the original exception is logged, and + an :exc:`~werkzeug.exceptions.InternalServerError` is returned. + + If an error handler is registered for ``InternalServerError`` or + ``500``, it will be used. For consistency, the handler will + always receive the ``InternalServerError``. The original + unhandled exception is available as ``e.original_exception``. + + .. versionchanged:: 1.1.0 + Always passes the ``InternalServerError`` instance to the + handler, setting ``original_exception`` to the unhandled + error. + + .. versionchanged:: 1.1.0 + ``after_request`` functions and other finalization is done + even for the default 500 response when there is no handler. + + .. versionadded:: 0.3 + """ + exc_info = sys.exc_info() + got_request_exception.send(self, exception=e) + + if self.propagate_exceptions: + # Re-raise if called with an active exception, otherwise + # raise the passed in exception. + if exc_info[1] is e: + raise + + raise e + + self.log_exception(exc_info) + server_error: t.Union[InternalServerError, ResponseReturnValue] + server_error = InternalServerError(original_exception=e) + handler = self._find_error_handler(server_error) + + if handler is not None: + server_error = self.ensure_sync(handler)(server_error) + + return self.finalize_request(server_error, from_error_handler=True) + + def log_exception( + self, + exc_info: t.Union[ + t.Tuple[type, BaseException, TracebackType], t.Tuple[None, None, None] + ], + ) -> None: + """Logs an exception. This is called by :meth:`handle_exception` + if debugging is disabled and right before the handler is called. + The default implementation logs the exception as error on the + :attr:`logger`. + + .. versionadded:: 0.8 + """ + self.logger.error( + f"Exception on {request.path} [{request.method}]", exc_info=exc_info + ) + + def raise_routing_exception(self, request: Request) -> "te.NoReturn": + """Exceptions that are recording during routing are reraised with + this method. During debug we are not reraising redirect requests + for non ``GET``, ``HEAD``, or ``OPTIONS`` requests and we're raising + a different error instead to help debug situations. + + :internal: + """ + if ( + not self.debug + or not isinstance(request.routing_exception, RequestRedirect) + or request.method in ("GET", "HEAD", "OPTIONS") + ): + raise request.routing_exception # type: ignore + + from .debughelpers import FormDataRoutingRedirect + + raise FormDataRoutingRedirect(request) + + def dispatch_request(self) -> ResponseReturnValue: + """Does the request dispatching. Matches the URL and returns the + return value of the view or error handler. This does not have to + be a response object. In order to convert the return value to a + proper response object, call :func:`make_response`. + + .. versionchanged:: 0.7 + This no longer does the exception handling, this code was + moved to the new :meth:`full_dispatch_request`. + """ + req = _request_ctx_stack.top.request + if req.routing_exception is not None: + self.raise_routing_exception(req) + rule = req.url_rule + # if we provide automatic options for this URL and the + # request came with the OPTIONS method, reply automatically + if ( + getattr(rule, "provide_automatic_options", False) + and req.method == "OPTIONS" + ): + return self.make_default_options_response() + # otherwise dispatch to the handler for that endpoint + return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args) + + def full_dispatch_request(self) -> Response: + """Dispatches the request and on top of that performs request + pre and postprocessing as well as HTTP exception catching and + error handling. + + .. versionadded:: 0.7 + """ + self.try_trigger_before_first_request_functions() + try: + request_started.send(self) + rv = self.preprocess_request() + if rv is None: + rv = self.dispatch_request() + except Exception as e: + rv = self.handle_user_exception(e) + return self.finalize_request(rv) + + def finalize_request( + self, + rv: t.Union[ResponseReturnValue, HTTPException], + from_error_handler: bool = False, + ) -> Response: + """Given the return value from a view function this finalizes + the request by converting it into a response and invoking the + postprocessing functions. This is invoked for both normal + request dispatching as well as error handlers. + + Because this means that it might be called as a result of a + failure a special safe mode is available which can be enabled + with the `from_error_handler` flag. If enabled, failures in + response processing will be logged and otherwise ignored. + + :internal: + """ + response = self.make_response(rv) + try: + response = self.process_response(response) + request_finished.send(self, response=response) + except Exception: + if not from_error_handler: + raise + self.logger.exception( + "Request finalizing failed with an error while handling an error" + ) + return response + + def try_trigger_before_first_request_functions(self) -> None: + """Called before each request and will ensure that it triggers + the :attr:`before_first_request_funcs` and only exactly once per + application instance (which means process usually). + + :internal: + """ + if self._got_first_request: + return + with self._before_request_lock: + if self._got_first_request: + return + for func in self.before_first_request_funcs: + self.ensure_sync(func)() + self._got_first_request = True + + def make_default_options_response(self) -> Response: + """This method is called to create the default ``OPTIONS`` response. + This can be changed through subclassing to change the default + behavior of ``OPTIONS`` responses. + + .. versionadded:: 0.7 + """ + adapter = _request_ctx_stack.top.url_adapter + methods = adapter.allowed_methods() + rv = self.response_class() + rv.allow.update(methods) + return rv + + def should_ignore_error(self, error: t.Optional[BaseException]) -> bool: + """This is called to figure out if an error should be ignored + or not as far as the teardown system is concerned. If this + function returns ``True`` then the teardown handlers will not be + passed the error. + + .. versionadded:: 0.10 + """ + return False + + def ensure_sync(self, func: t.Callable) -> t.Callable: + """Ensure that the function is synchronous for WSGI workers. + Plain ``def`` functions are returned as-is. ``async def`` + functions are wrapped to run and wait for the response. + + Override this method to change how the app runs async views. + + .. versionadded:: 2.0 + """ + if iscoroutinefunction(func): + return self.async_to_sync(func) + + return func + + def async_to_sync( + self, func: t.Callable[..., t.Coroutine] + ) -> t.Callable[..., t.Any]: + """Return a sync function that will run the coroutine function. + + .. code-block:: python + + result = app.async_to_sync(func)(*args, **kwargs) + + Override this method to change how the app converts async code + to be synchronously callable. + + .. versionadded:: 2.0 + """ + try: + from asgiref.sync import async_to_sync as asgiref_async_to_sync + except ImportError: + raise RuntimeError( + "Install Flask with the 'async' extra in order to use async views." + ) from None + + # Check that Werkzeug isn't using its fallback ContextVar class. + if ContextVar.__module__ == "werkzeug.local": + raise RuntimeError( + "Async cannot be used with this combination of Python " + "and Greenlet versions." + ) + + return asgiref_async_to_sync(func) + + def make_response(self, rv: ResponseReturnValue) -> Response: + """Convert the return value from a view function to an instance of + :attr:`response_class`. + + :param rv: the return value from the view function. The view function + must return a response. Returning ``None``, or the view ending + without returning, is not allowed. The following types are allowed + for ``view_rv``: + + ``str`` + A response object is created with the string encoded to UTF-8 + as the body. + + ``bytes`` + A response object is created with the bytes as the body. + + ``dict`` + A dictionary that will be jsonify'd before being returned. + + ``tuple`` + Either ``(body, status, headers)``, ``(body, status)``, or + ``(body, headers)``, where ``body`` is any of the other types + allowed here, ``status`` is a string or an integer, and + ``headers`` is a dictionary or a list of ``(key, value)`` + tuples. If ``body`` is a :attr:`response_class` instance, + ``status`` overwrites the exiting value and ``headers`` are + extended. + + :attr:`response_class` + The object is returned unchanged. + + other :class:`~werkzeug.wrappers.Response` class + The object is coerced to :attr:`response_class`. + + :func:`callable` + The function is called as a WSGI application. The result is + used to create a response object. + + .. versionchanged:: 0.9 + Previously a tuple was interpreted as the arguments for the + response object. + """ + + status = headers = None + + # unpack tuple returns + if isinstance(rv, tuple): + len_rv = len(rv) + + # a 3-tuple is unpacked directly + if len_rv == 3: + rv, status, headers = rv + # decide if a 2-tuple has status or headers + elif len_rv == 2: + if isinstance(rv[1], (Headers, dict, tuple, list)): + rv, headers = rv + else: + rv, status = rv + # other sized tuples are not allowed + else: + raise TypeError( + "The view function did not return a valid response tuple." + " The tuple must have the form (body, status, headers)," + " (body, status), or (body, headers)." + ) + + # the body must not be None + if rv is None: + raise TypeError( + f"The view function for {request.endpoint!r} did not" + " return a valid response. The function either returned" + " None or ended without a return statement." + ) + + # make sure the body is an instance of the response class + if not isinstance(rv, self.response_class): + if isinstance(rv, (str, bytes, bytearray)): + # let the response class set the status and headers instead of + # waiting to do it manually, so that the class can handle any + # special logic + rv = self.response_class(rv, status=status, headers=headers) + status = headers = None + elif isinstance(rv, dict): + rv = jsonify(rv) + elif isinstance(rv, BaseResponse) or callable(rv): + # evaluate a WSGI callable, or coerce a different response + # class to the correct type + try: + rv = self.response_class.force_type(rv, request.environ) # type: ignore # noqa: B950 + except TypeError as e: + raise TypeError( + f"{e}\nThe view function did not return a valid" + " response. The return type must be a string," + " dict, tuple, Response instance, or WSGI" + f" callable, but it was a {type(rv).__name__}." + ).with_traceback(sys.exc_info()[2]) from None + else: + raise TypeError( + "The view function did not return a valid" + " response. The return type must be a string," + " dict, tuple, Response instance, or WSGI" + f" callable, but it was a {type(rv).__name__}." + ) + + rv = t.cast(Response, rv) + # prefer the status if it was provided + if status is not None: + if isinstance(status, (str, bytes, bytearray)): + rv.status = status # type: ignore + else: + rv.status_code = status + + # extend existing headers with provided headers + if headers: + rv.headers.update(headers) + + return rv + + def create_url_adapter( + self, request: t.Optional[Request] + ) -> t.Optional[MapAdapter]: + """Creates a URL adapter for the given request. The URL adapter + is created at a point where the request context is not yet set + up so the request is passed explicitly. + + .. versionadded:: 0.6 + + .. versionchanged:: 0.9 + This can now also be called without a request object when the + URL adapter is created for the application context. + + .. versionchanged:: 1.0 + :data:`SERVER_NAME` no longer implicitly enables subdomain + matching. Use :attr:`subdomain_matching` instead. + """ + if request is not None: + # If subdomain matching is disabled (the default), use the + # default subdomain in all cases. This should be the default + # in Werkzeug but it currently does not have that feature. + if not self.subdomain_matching: + subdomain = self.url_map.default_subdomain or None + else: + subdomain = None + + return self.url_map.bind_to_environ( + request.environ, + server_name=self.config["SERVER_NAME"], + subdomain=subdomain, + ) + # We need at the very least the server name to be set for this + # to work. + if self.config["SERVER_NAME"] is not None: + return self.url_map.bind( + self.config["SERVER_NAME"], + script_name=self.config["APPLICATION_ROOT"], + url_scheme=self.config["PREFERRED_URL_SCHEME"], + ) + + return None + + def inject_url_defaults(self, endpoint: str, values: dict) -> None: + """Injects the URL defaults for the given endpoint directly into + the values dictionary passed. This is used internally and + automatically called on URL building. + + .. versionadded:: 0.7 + """ + names: t.Iterable[t.Optional[str]] = (None,) + + # url_for may be called outside a request context, parse the + # passed endpoint instead of using request.blueprints. + if "." in endpoint: + names = chain( + names, reversed(_split_blueprint_path(endpoint.rpartition(".")[0])) + ) + + for name in names: + if name in self.url_default_functions: + for func in self.url_default_functions[name]: + func(endpoint, values) + + def handle_url_build_error( + self, error: Exception, endpoint: str, values: dict + ) -> str: + """Handle :class:`~werkzeug.routing.BuildError` on + :meth:`url_for`. + """ + for handler in self.url_build_error_handlers: + try: + rv = handler(error, endpoint, values) + except BuildError as e: + # make error available outside except block + error = e + else: + if rv is not None: + return rv + + # Re-raise if called with an active exception, otherwise raise + # the passed in exception. + if error is sys.exc_info()[1]: + raise + + raise error + + def preprocess_request(self) -> t.Optional[ResponseReturnValue]: + """Called before the request is dispatched. Calls + :attr:`url_value_preprocessors` registered with the app and the + current blueprint (if any). Then calls :attr:`before_request_funcs` + registered with the app and the blueprint. + + If any :meth:`before_request` handler returns a non-None value, the + value is handled as if it was the return value from the view, and + further request handling is stopped. + """ + names = (None, *reversed(request.blueprints)) + + for name in names: + if name in self.url_value_preprocessors: + for url_func in self.url_value_preprocessors[name]: + url_func(request.endpoint, request.view_args) + + for name in names: + if name in self.before_request_funcs: + for before_func in self.before_request_funcs[name]: + rv = self.ensure_sync(before_func)() + + if rv is not None: + return rv + + return None + + def process_response(self, response: Response) -> Response: + """Can be overridden in order to modify the response object + before it's sent to the WSGI server. By default this will + call all the :meth:`after_request` decorated functions. + + .. versionchanged:: 0.5 + As of Flask 0.5 the functions registered for after request + execution are called in reverse order of registration. + + :param response: a :attr:`response_class` object. + :return: a new response object or the same, has to be an + instance of :attr:`response_class`. + """ + ctx = _request_ctx_stack.top + + for func in ctx._after_request_functions: + response = self.ensure_sync(func)(response) + + for name in chain(request.blueprints, (None,)): + if name in self.after_request_funcs: + for func in reversed(self.after_request_funcs[name]): + response = self.ensure_sync(func)(response) + + if not self.session_interface.is_null_session(ctx.session): + self.session_interface.save_session(self, ctx.session, response) + + return response + + def do_teardown_request( + self, exc: t.Optional[BaseException] = _sentinel # type: ignore + ) -> None: + """Called after the request is dispatched and the response is + returned, right before the request context is popped. + + This calls all functions decorated with + :meth:`teardown_request`, and :meth:`Blueprint.teardown_request` + if a blueprint handled the request. Finally, the + :data:`request_tearing_down` signal is sent. + + This is called by + :meth:`RequestContext.pop() `, + which may be delayed during testing to maintain access to + resources. + + :param exc: An unhandled exception raised while dispatching the + request. Detected from the current exception information if + not passed. Passed to each teardown function. + + .. versionchanged:: 0.9 + Added the ``exc`` argument. + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for name in chain(request.blueprints, (None,)): + if name in self.teardown_request_funcs: + for func in reversed(self.teardown_request_funcs[name]): + self.ensure_sync(func)(exc) + + request_tearing_down.send(self, exc=exc) + + def do_teardown_appcontext( + self, exc: t.Optional[BaseException] = _sentinel # type: ignore + ) -> None: + """Called right before the application context is popped. + + When handling a request, the application context is popped + after the request context. See :meth:`do_teardown_request`. + + This calls all functions decorated with + :meth:`teardown_appcontext`. Then the + :data:`appcontext_tearing_down` signal is sent. + + This is called by + :meth:`AppContext.pop() `. + + .. versionadded:: 0.9 + """ + if exc is _sentinel: + exc = sys.exc_info()[1] + + for func in reversed(self.teardown_appcontext_funcs): + self.ensure_sync(func)(exc) + + appcontext_tearing_down.send(self, exc=exc) + + def app_context(self) -> AppContext: + """Create an :class:`~flask.ctx.AppContext`. Use as a ``with`` + block to push the context, which will make :data:`current_app` + point at this application. + + An application context is automatically pushed by + :meth:`RequestContext.push() ` + when handling a request, and when running a CLI command. Use + this to manually create a context outside of these situations. + + :: + + with app.app_context(): + init_db() + + See :doc:`/appcontext`. + + .. versionadded:: 0.9 + """ + return AppContext(self) + + def request_context(self, environ: dict) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` representing a + WSGI environment. Use a ``with`` block to push the context, + which will make :data:`request` point at this request. + + See :doc:`/reqcontext`. + + Typically you should not call this from your own code. A request + context is automatically pushed by the :meth:`wsgi_app` when + handling a request. Use :meth:`test_request_context` to create + an environment and context instead of this method. + + :param environ: a WSGI environment + """ + return RequestContext(self, environ) + + def test_request_context(self, *args: t.Any, **kwargs: t.Any) -> RequestContext: + """Create a :class:`~flask.ctx.RequestContext` for a WSGI + environment created from the given values. This is mostly useful + during testing, where you may want to run a function that uses + request data without dispatching a full request. + + See :doc:`/reqcontext`. + + Use a ``with`` block to push the context, which will make + :data:`request` point at the request for the created + environment. :: + + with test_request_context(...): + generate_report() + + When using the shell, it may be easier to push and pop the + context manually to avoid indentation. :: + + ctx = app.test_request_context(...) + ctx.push() + ... + ctx.pop() + + Takes the same arguments as Werkzeug's + :class:`~werkzeug.test.EnvironBuilder`, with some defaults from + the application. See the linked Werkzeug docs for most of the + available arguments. Flask-specific behavior is listed here. + + :param path: URL path being requested. + :param base_url: Base URL where the app is being served, which + ``path`` is relative to. If not given, built from + :data:`PREFERRED_URL_SCHEME`, ``subdomain``, + :data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`. + :param subdomain: Subdomain name to append to + :data:`SERVER_NAME`. + :param url_scheme: Scheme to use instead of + :data:`PREFERRED_URL_SCHEME`. + :param data: The request body, either as a string or a dict of + form keys and values. + :param json: If given, this is serialized as JSON and passed as + ``data``. Also defaults ``content_type`` to + ``application/json``. + :param args: other positional arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + :param kwargs: other keyword arguments passed to + :class:`~werkzeug.test.EnvironBuilder`. + """ + from .testing import EnvironBuilder + + builder = EnvironBuilder(self, *args, **kwargs) + + try: + return self.request_context(builder.get_environ()) + finally: + builder.close() + + def wsgi_app(self, environ: dict, start_response: t.Callable) -> t.Any: + """The actual WSGI application. This is not implemented in + :meth:`__call__` so that middlewares can be applied without + losing a reference to the app object. Instead of doing this:: + + app = MyMiddleware(app) + + It's a better idea to do this instead:: + + app.wsgi_app = MyMiddleware(app.wsgi_app) + + Then you still have the original application object around and + can continue to call methods on it. + + .. versionchanged:: 0.7 + Teardown events for the request and app contexts are called + even if an unhandled error occurs. Other events may not be + called depending on when an error occurs during dispatch. + See :ref:`callbacks-and-errors`. + + :param environ: A WSGI environment. + :param start_response: A callable accepting a status code, + a list of headers, and an optional exception context to + start the response. + """ + ctx = self.request_context(environ) + error: t.Optional[BaseException] = None + try: + try: + ctx.push() + response = self.full_dispatch_request() + except Exception as e: + error = e + response = self.handle_exception(e) + except: # noqa: B001 + error = sys.exc_info()[1] + raise + return response(environ, start_response) + finally: + if self.should_ignore_error(error): + error = None + ctx.auto_pop(error) + + def __call__(self, environ: dict, start_response: t.Callable) -> t.Any: + """The WSGI server calls the Flask application object as the + WSGI application. This calls :meth:`wsgi_app`, which can be + wrapped to apply middleware. + """ + return self.wsgi_app(environ, start_response) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/blueprints.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/blueprints.py new file mode 100644 index 00000000..5c23a735 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/blueprints.py @@ -0,0 +1,609 @@ +import os +import typing as t +from collections import defaultdict +from functools import update_wrapper + +from .scaffold import _endpoint_from_view_func +from .scaffold import _sentinel +from .scaffold import Scaffold +from .typing import AfterRequestCallable +from .typing import BeforeFirstRequestCallable +from .typing import BeforeRequestCallable +from .typing import TeardownCallable +from .typing import TemplateContextProcessorCallable +from .typing import TemplateFilterCallable +from .typing import TemplateGlobalCallable +from .typing import TemplateTestCallable +from .typing import URLDefaultCallable +from .typing import URLValuePreprocessorCallable + +if t.TYPE_CHECKING: + from .app import Flask + from .typing import ErrorHandlerCallable + +DeferredSetupFunction = t.Callable[["BlueprintSetupState"], t.Callable] + + +class BlueprintSetupState: + """Temporary holder object for registering a blueprint with the + application. An instance of this class is created by the + :meth:`~flask.Blueprint.make_setup_state` method and later passed + to all register callback functions. + """ + + def __init__( + self, + blueprint: "Blueprint", + app: "Flask", + options: t.Any, + first_registration: bool, + ) -> None: + #: a reference to the current application + self.app = app + + #: a reference to the blueprint that created this setup state. + self.blueprint = blueprint + + #: a dictionary with all options that were passed to the + #: :meth:`~flask.Flask.register_blueprint` method. + self.options = options + + #: as blueprints can be registered multiple times with the + #: application and not everything wants to be registered + #: multiple times on it, this attribute can be used to figure + #: out if the blueprint was registered in the past already. + self.first_registration = first_registration + + subdomain = self.options.get("subdomain") + if subdomain is None: + subdomain = self.blueprint.subdomain + + #: The subdomain that the blueprint should be active for, ``None`` + #: otherwise. + self.subdomain = subdomain + + url_prefix = self.options.get("url_prefix") + if url_prefix is None: + url_prefix = self.blueprint.url_prefix + #: The prefix that should be used for all URLs defined on the + #: blueprint. + self.url_prefix = url_prefix + + self.name = self.options.get("name", blueprint.name) + self.name_prefix = self.options.get("name_prefix", "") + + #: A dictionary with URL defaults that is added to each and every + #: URL that was defined with the blueprint. + self.url_defaults = dict(self.blueprint.url_values_defaults) + self.url_defaults.update(self.options.get("url_defaults", ())) + + def add_url_rule( + self, + rule: str, + endpoint: t.Optional[str] = None, + view_func: t.Optional[t.Callable] = None, + **options: t.Any, + ) -> None: + """A helper method to register a rule (and optionally a view function) + to the application. The endpoint is automatically prefixed with the + blueprint's name. + """ + if self.url_prefix is not None: + if rule: + rule = "/".join((self.url_prefix.rstrip("/"), rule.lstrip("/"))) + else: + rule = self.url_prefix + options.setdefault("subdomain", self.subdomain) + if endpoint is None: + endpoint = _endpoint_from_view_func(view_func) # type: ignore + defaults = self.url_defaults + if "defaults" in options: + defaults = dict(defaults, **options.pop("defaults")) + + self.app.add_url_rule( + rule, + f"{self.name_prefix}.{self.name}.{endpoint}".lstrip("."), + view_func, + defaults=defaults, + **options, + ) + + +class Blueprint(Scaffold): + """Represents a blueprint, a collection of routes and other + app-related functions that can be registered on a real application + later. + + A blueprint is an object that allows defining application functions + without requiring an application object ahead of time. It uses the + same decorators as :class:`~flask.Flask`, but defers the need for an + application by recording them for later registration. + + Decorating a function with a blueprint creates a deferred function + that is called with :class:`~flask.blueprints.BlueprintSetupState` + when the blueprint is registered on an application. + + See :doc:`/blueprints` for more information. + + :param name: The name of the blueprint. Will be prepended to each + endpoint name. + :param import_name: The name of the blueprint package, usually + ``__name__``. This helps locate the ``root_path`` for the + blueprint. + :param static_folder: A folder with static files that should be + served by the blueprint's static route. The path is relative to + the blueprint's root path. Blueprint static files are disabled + by default. + :param static_url_path: The url to serve static files from. + Defaults to ``static_folder``. If the blueprint does not have + a ``url_prefix``, the app's static route will take precedence, + and the blueprint's static files won't be accessible. + :param template_folder: A folder with templates that should be added + to the app's template search path. The path is relative to the + blueprint's root path. Blueprint templates are disabled by + default. Blueprint templates have a lower precedence than those + in the app's templates folder. + :param url_prefix: A path to prepend to all of the blueprint's URLs, + to make them distinct from the rest of the app's routes. + :param subdomain: A subdomain that blueprint routes will match on by + default. + :param url_defaults: A dict of default values that blueprint routes + will receive by default. + :param root_path: By default, the blueprint will automatically set + this based on ``import_name``. In certain situations this + automatic detection can fail, so the path can be specified + manually instead. + + .. versionchanged:: 1.1.0 + Blueprints have a ``cli`` group to register nested CLI commands. + The ``cli_group`` parameter controls the name of the group under + the ``flask`` command. + + .. versionadded:: 0.7 + """ + + warn_on_modifications = False + _got_registered_once = False + + #: Blueprint local JSON encoder class to use. Set to ``None`` to use + #: the app's :class:`~flask.Flask.json_encoder`. + json_encoder = None + #: Blueprint local JSON decoder class to use. Set to ``None`` to use + #: the app's :class:`~flask.Flask.json_decoder`. + json_decoder = None + + def __init__( + self, + name: str, + import_name: str, + static_folder: t.Optional[t.Union[str, os.PathLike]] = None, + static_url_path: t.Optional[str] = None, + template_folder: t.Optional[str] = None, + url_prefix: t.Optional[str] = None, + subdomain: t.Optional[str] = None, + url_defaults: t.Optional[dict] = None, + root_path: t.Optional[str] = None, + cli_group: t.Optional[str] = _sentinel, # type: ignore + ): + super().__init__( + import_name=import_name, + static_folder=static_folder, + static_url_path=static_url_path, + template_folder=template_folder, + root_path=root_path, + ) + + if "." in name: + raise ValueError("'name' may not contain a dot '.' character.") + + self.name = name + self.url_prefix = url_prefix + self.subdomain = subdomain + self.deferred_functions: t.List[DeferredSetupFunction] = [] + + if url_defaults is None: + url_defaults = {} + + self.url_values_defaults = url_defaults + self.cli_group = cli_group + self._blueprints: t.List[t.Tuple["Blueprint", dict]] = [] + + def _is_setup_finished(self) -> bool: + return self.warn_on_modifications and self._got_registered_once + + def record(self, func: t.Callable) -> None: + """Registers a function that is called when the blueprint is + registered on the application. This function is called with the + state as argument as returned by the :meth:`make_setup_state` + method. + """ + if self._got_registered_once and self.warn_on_modifications: + from warnings import warn + + warn( + Warning( + "The blueprint was already registered once but is" + " getting modified now. These changes will not show" + " up." + ) + ) + self.deferred_functions.append(func) + + def record_once(self, func: t.Callable) -> None: + """Works like :meth:`record` but wraps the function in another + function that will ensure the function is only called once. If the + blueprint is registered a second time on the application, the + function passed is not called. + """ + + def wrapper(state: BlueprintSetupState) -> None: + if state.first_registration: + func(state) + + return self.record(update_wrapper(wrapper, func)) + + def make_setup_state( + self, app: "Flask", options: dict, first_registration: bool = False + ) -> BlueprintSetupState: + """Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState` + object that is later passed to the register callback functions. + Subclasses can override this to return a subclass of the setup state. + """ + return BlueprintSetupState(self, app, options, first_registration) + + def register_blueprint(self, blueprint: "Blueprint", **options: t.Any) -> None: + """Register a :class:`~flask.Blueprint` on this blueprint. Keyword + arguments passed to this method will override the defaults set + on the blueprint. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionadded:: 2.0 + """ + if blueprint is self: + raise ValueError("Cannot register a blueprint on itself") + self._blueprints.append((blueprint, options)) + + def register(self, app: "Flask", options: dict) -> None: + """Called by :meth:`Flask.register_blueprint` to register all + views and callbacks registered on the blueprint with the + application. Creates a :class:`.BlueprintSetupState` and calls + each :meth:`record` callback with it. + + :param app: The application this blueprint is being registered + with. + :param options: Keyword arguments forwarded from + :meth:`~Flask.register_blueprint`. + + .. versionchanged:: 2.0.1 + Nested blueprints are registered with their dotted name. + This allows different blueprints with the same name to be + nested at different locations. + + .. versionchanged:: 2.0.1 + The ``name`` option can be used to change the (pre-dotted) + name the blueprint is registered with. This allows the same + blueprint to be registered multiple times with unique names + for ``url_for``. + + .. versionchanged:: 2.0.1 + Registering the same blueprint with the same name multiple + times is deprecated and will become an error in Flask 2.1. + """ + name_prefix = options.get("name_prefix", "") + self_name = options.get("name", self.name) + name = f"{name_prefix}.{self_name}".lstrip(".") + + if name in app.blueprints: + existing_at = f" '{name}'" if self_name != name else "" + + if app.blueprints[name] is not self: + raise ValueError( + f"The name '{self_name}' is already registered for" + f" a different blueprint{existing_at}. Use 'name='" + " to provide a unique name." + ) + else: + import warnings + + warnings.warn( + f"The name '{self_name}' is already registered for" + f" this blueprint{existing_at}. Use 'name=' to" + " provide a unique name. This will become an error" + " in Flask 2.1.", + stacklevel=4, + ) + + first_bp_registration = not any(bp is self for bp in app.blueprints.values()) + first_name_registration = name not in app.blueprints + + app.blueprints[name] = self + self._got_registered_once = True + state = self.make_setup_state(app, options, first_bp_registration) + + if self.has_static_folder: + state.add_url_rule( + f"{self.static_url_path}/", + view_func=self.send_static_file, + endpoint="static", + ) + + # Merge blueprint data into parent. + if first_bp_registration or first_name_registration: + + def extend(bp_dict, parent_dict): + for key, values in bp_dict.items(): + key = name if key is None else f"{name}.{key}" + parent_dict[key].extend(values) + + for key, value in self.error_handler_spec.items(): + key = name if key is None else f"{name}.{key}" + value = defaultdict( + dict, + { + code: { + exc_class: func for exc_class, func in code_values.items() + } + for code, code_values in value.items() + }, + ) + app.error_handler_spec[key] = value + + for endpoint, func in self.view_functions.items(): + app.view_functions[endpoint] = func + + extend(self.before_request_funcs, app.before_request_funcs) + extend(self.after_request_funcs, app.after_request_funcs) + extend( + self.teardown_request_funcs, + app.teardown_request_funcs, + ) + extend(self.url_default_functions, app.url_default_functions) + extend(self.url_value_preprocessors, app.url_value_preprocessors) + extend(self.template_context_processors, app.template_context_processors) + + for deferred in self.deferred_functions: + deferred(state) + + cli_resolved_group = options.get("cli_group", self.cli_group) + + if self.cli.commands: + if cli_resolved_group is None: + app.cli.commands.update(self.cli.commands) + elif cli_resolved_group is _sentinel: + self.cli.name = name + app.cli.add_command(self.cli) + else: + self.cli.name = cli_resolved_group + app.cli.add_command(self.cli) + + for blueprint, bp_options in self._blueprints: + bp_options = bp_options.copy() + bp_url_prefix = bp_options.get("url_prefix") + + if bp_url_prefix is None: + bp_url_prefix = blueprint.url_prefix + + if state.url_prefix is not None and bp_url_prefix is not None: + bp_options["url_prefix"] = ( + state.url_prefix.rstrip("/") + "/" + bp_url_prefix.lstrip("/") + ) + elif bp_url_prefix is not None: + bp_options["url_prefix"] = bp_url_prefix + elif state.url_prefix is not None: + bp_options["url_prefix"] = state.url_prefix + + bp_options["name_prefix"] = name + blueprint.register(app, bp_options) + + def add_url_rule( + self, + rule: str, + endpoint: t.Optional[str] = None, + view_func: t.Optional[t.Callable] = None, + provide_automatic_options: t.Optional[bool] = None, + **options: t.Any, + ) -> None: + """Like :meth:`Flask.add_url_rule` but for a blueprint. The endpoint for + the :func:`url_for` function is prefixed with the name of the blueprint. + """ + if endpoint and "." in endpoint: + raise ValueError("'endpoint' may not contain a dot '.' character.") + + if view_func and hasattr(view_func, "__name__") and "." in view_func.__name__: + raise ValueError("'view_func' name may not contain a dot '.' character.") + + self.record( + lambda s: s.add_url_rule( + rule, + endpoint, + view_func, + provide_automatic_options=provide_automatic_options, + **options, + ) + ) + + def app_template_filter( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateFilterCallable], TemplateFilterCallable]: + """Register a custom template filter, available application wide. Like + :meth:`Flask.template_filter` but for a blueprint. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def decorator(f: TemplateFilterCallable) -> TemplateFilterCallable: + self.add_app_template_filter(f, name=name) + return f + + return decorator + + def add_app_template_filter( + self, f: TemplateFilterCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template filter, available application wide. Like + :meth:`Flask.add_template_filter` but for a blueprint. Works exactly + like the :meth:`app_template_filter` decorator. + + :param name: the optional name of the filter, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.filters[name or f.__name__] = f + + self.record_once(register_template) + + def app_template_test( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateTestCallable], TemplateTestCallable]: + """Register a custom template test, available application wide. Like + :meth:`Flask.template_test` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def decorator(f: TemplateTestCallable) -> TemplateTestCallable: + self.add_app_template_test(f, name=name) + return f + + return decorator + + def add_app_template_test( + self, f: TemplateTestCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template test, available application wide. Like + :meth:`Flask.add_template_test` but for a blueprint. Works exactly + like the :meth:`app_template_test` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the test, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.tests[name or f.__name__] = f + + self.record_once(register_template) + + def app_template_global( + self, name: t.Optional[str] = None + ) -> t.Callable[[TemplateGlobalCallable], TemplateGlobalCallable]: + """Register a custom template global, available application wide. Like + :meth:`Flask.template_global` but for a blueprint. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def decorator(f: TemplateGlobalCallable) -> TemplateGlobalCallable: + self.add_app_template_global(f, name=name) + return f + + return decorator + + def add_app_template_global( + self, f: TemplateGlobalCallable, name: t.Optional[str] = None + ) -> None: + """Register a custom template global, available application wide. Like + :meth:`Flask.add_template_global` but for a blueprint. Works exactly + like the :meth:`app_template_global` decorator. + + .. versionadded:: 0.10 + + :param name: the optional name of the global, otherwise the + function name will be used. + """ + + def register_template(state: BlueprintSetupState) -> None: + state.app.jinja_env.globals[name or f.__name__] = f + + self.record_once(register_template) + + def before_app_request(self, f: BeforeRequestCallable) -> BeforeRequestCallable: + """Like :meth:`Flask.before_request`. Such a function is executed + before each request, even if outside of a blueprint. + """ + self.record_once( + lambda s: s.app.before_request_funcs.setdefault(None, []).append(f) + ) + return f + + def before_app_first_request( + self, f: BeforeFirstRequestCallable + ) -> BeforeFirstRequestCallable: + """Like :meth:`Flask.before_first_request`. Such a function is + executed before the first request to the application. + """ + self.record_once(lambda s: s.app.before_first_request_funcs.append(f)) + return f + + def after_app_request(self, f: AfterRequestCallable) -> AfterRequestCallable: + """Like :meth:`Flask.after_request` but for a blueprint. Such a function + is executed after each request, even if outside of the blueprint. + """ + self.record_once( + lambda s: s.app.after_request_funcs.setdefault(None, []).append(f) + ) + return f + + def teardown_app_request(self, f: TeardownCallable) -> TeardownCallable: + """Like :meth:`Flask.teardown_request` but for a blueprint. Such a + function is executed when tearing down each request, even if outside of + the blueprint. + """ + self.record_once( + lambda s: s.app.teardown_request_funcs.setdefault(None, []).append(f) + ) + return f + + def app_context_processor( + self, f: TemplateContextProcessorCallable + ) -> TemplateContextProcessorCallable: + """Like :meth:`Flask.context_processor` but for a blueprint. Such a + function is executed each request, even if outside of the blueprint. + """ + self.record_once( + lambda s: s.app.template_context_processors.setdefault(None, []).append(f) + ) + return f + + def app_errorhandler(self, code: t.Union[t.Type[Exception], int]) -> t.Callable: + """Like :meth:`Flask.errorhandler` but for a blueprint. This + handler is used for all requests, even if outside of the blueprint. + """ + + def decorator( + f: "ErrorHandlerCallable[Exception]", + ) -> "ErrorHandlerCallable[Exception]": + self.record_once(lambda s: s.app.errorhandler(code)(f)) + return f + + return decorator + + def app_url_value_preprocessor( + self, f: URLValuePreprocessorCallable + ) -> URLValuePreprocessorCallable: + """Same as :meth:`url_value_preprocessor` but application wide.""" + self.record_once( + lambda s: s.app.url_value_preprocessors.setdefault(None, []).append(f) + ) + return f + + def app_url_defaults(self, f: URLDefaultCallable) -> URLDefaultCallable: + """Same as :meth:`url_defaults` but application wide.""" + self.record_once( + lambda s: s.app.url_default_functions.setdefault(None, []).append(f) + ) + return f diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/cli.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/cli.py new file mode 100644 index 00000000..7ab4fa1c --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/cli.py @@ -0,0 +1,998 @@ +import ast +import inspect +import os +import platform +import re +import sys +import traceback +import warnings +from functools import update_wrapper +from operator import attrgetter +from threading import Lock +from threading import Thread + +import click +from werkzeug.utils import import_string + +from .globals import current_app +from .helpers import get_debug_flag +from .helpers import get_env +from .helpers import get_load_dotenv + +try: + import dotenv +except ImportError: + dotenv = None + +try: + import ssl +except ImportError: + ssl = None # type: ignore + + +class NoAppException(click.UsageError): + """Raised if an application cannot be found or loaded.""" + + +def find_best_app(script_info, module): + """Given a module instance this tries to find the best possible + application in the module or raises an exception. + """ + from . import Flask + + # Search for the most common names first. + for attr_name in ("app", "application"): + app = getattr(module, attr_name, None) + + if isinstance(app, Flask): + return app + + # Otherwise find the only object that is a Flask instance. + matches = [v for v in module.__dict__.values() if isinstance(v, Flask)] + + if len(matches) == 1: + return matches[0] + elif len(matches) > 1: + raise NoAppException( + "Detected multiple Flask applications in module" + f" {module.__name__!r}. Use 'FLASK_APP={module.__name__}:name'" + f" to specify the correct one." + ) + + # Search for app factory functions. + for attr_name in ("create_app", "make_app"): + app_factory = getattr(module, attr_name, None) + + if inspect.isfunction(app_factory): + try: + app = call_factory(script_info, app_factory) + + if isinstance(app, Flask): + return app + except TypeError as e: + if not _called_with_wrong_args(app_factory): + raise + + raise NoAppException( + f"Detected factory {attr_name!r} in module {module.__name__!r}," + " but could not call it without arguments. Use" + f" \"FLASK_APP='{module.__name__}:{attr_name}(args)'\"" + " to specify arguments." + ) from e + + raise NoAppException( + "Failed to find Flask application or factory in module" + f" {module.__name__!r}. Use 'FLASK_APP={module.__name__}:name'" + " to specify one." + ) + + +def call_factory(script_info, app_factory, args=None, kwargs=None): + """Takes an app factory, a ``script_info` object and optionally a tuple + of arguments. Checks for the existence of a script_info argument and calls + the app_factory depending on that and the arguments provided. + """ + sig = inspect.signature(app_factory) + args = [] if args is None else args + kwargs = {} if kwargs is None else kwargs + + if "script_info" in sig.parameters: + warnings.warn( + "The 'script_info' argument is deprecated and will not be" + " passed to the app factory function in Flask 2.1.", + DeprecationWarning, + ) + kwargs["script_info"] = script_info + + if not args and len(sig.parameters) == 1: + first_parameter = next(iter(sig.parameters.values())) + + if ( + first_parameter.default is inspect.Parameter.empty + # **kwargs is reported as an empty default, ignore it + and first_parameter.kind is not inspect.Parameter.VAR_KEYWORD + ): + warnings.warn( + "Script info is deprecated and will not be passed as the" + " single argument to the app factory function in Flask" + " 2.1.", + DeprecationWarning, + ) + args.append(script_info) + + return app_factory(*args, **kwargs) + + +def _called_with_wrong_args(f): + """Check whether calling a function raised a ``TypeError`` because + the call failed or because something in the factory raised the + error. + + :param f: The function that was called. + :return: ``True`` if the call failed. + """ + tb = sys.exc_info()[2] + + try: + while tb is not None: + if tb.tb_frame.f_code is f.__code__: + # In the function, it was called successfully. + return False + + tb = tb.tb_next + + # Didn't reach the function. + return True + finally: + # Delete tb to break a circular reference. + # https://docs.python.org/2/library/sys.html#sys.exc_info + del tb + + +def find_app_by_string(script_info, module, app_name): + """Check if the given string is a variable name or a function. Call + a function to get the app instance, or return the variable directly. + """ + from . import Flask + + # Parse app_name as a single expression to determine if it's a valid + # attribute name or function call. + try: + expr = ast.parse(app_name.strip(), mode="eval").body + except SyntaxError: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) from None + + if isinstance(expr, ast.Name): + name = expr.id + args = kwargs = None + elif isinstance(expr, ast.Call): + # Ensure the function name is an attribute name only. + if not isinstance(expr.func, ast.Name): + raise NoAppException( + f"Function reference must be a simple name: {app_name!r}." + ) + + name = expr.func.id + + # Parse the positional and keyword arguments as literals. + try: + args = [ast.literal_eval(arg) for arg in expr.args] + kwargs = {kw.arg: ast.literal_eval(kw.value) for kw in expr.keywords} + except ValueError: + # literal_eval gives cryptic error messages, show a generic + # message with the full expression instead. + raise NoAppException( + f"Failed to parse arguments as literal values: {app_name!r}." + ) from None + else: + raise NoAppException( + f"Failed to parse {app_name!r} as an attribute name or function call." + ) + + try: + attr = getattr(module, name) + except AttributeError as e: + raise NoAppException( + f"Failed to find attribute {name!r} in {module.__name__!r}." + ) from e + + # If the attribute is a function, call it with any args and kwargs + # to get the real application. + if inspect.isfunction(attr): + try: + app = call_factory(script_info, attr, args, kwargs) + except TypeError as e: + if not _called_with_wrong_args(attr): + raise + + raise NoAppException( + f"The factory {app_name!r} in module" + f" {module.__name__!r} could not be called with the" + " specified arguments." + ) from e + else: + app = attr + + if isinstance(app, Flask): + return app + + raise NoAppException( + "A valid Flask application was not obtained from" + f" '{module.__name__}:{app_name}'." + ) + + +def prepare_import(path): + """Given a filename this will try to calculate the python path, add it + to the search path and return the actual module name that is expected. + """ + path = os.path.realpath(path) + + fname, ext = os.path.splitext(path) + if ext == ".py": + path = fname + + if os.path.basename(path) == "__init__": + path = os.path.dirname(path) + + module_name = [] + + # move up until outside package structure (no __init__.py) + while True: + path, name = os.path.split(path) + module_name.append(name) + + if not os.path.exists(os.path.join(path, "__init__.py")): + break + + if sys.path[0] != path: + sys.path.insert(0, path) + + return ".".join(module_name[::-1]) + + +def locate_app(script_info, module_name, app_name, raise_if_not_found=True): + __traceback_hide__ = True # noqa: F841 + + try: + __import__(module_name) + except ImportError as e: + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[2].tb_next: + raise NoAppException( + f"While importing {module_name!r}, an ImportError was raised." + ) from e + elif raise_if_not_found: + raise NoAppException(f"Could not import {module_name!r}.") from e + else: + return + + module = sys.modules[module_name] + + if app_name is None: + return find_best_app(script_info, module) + else: + return find_app_by_string(script_info, module, app_name) + + +def get_version(ctx, param, value): + if not value or ctx.resilient_parsing: + return + + import werkzeug + from . import __version__ + + click.echo( + f"Python {platform.python_version()}\n" + f"Flask {__version__}\n" + f"Werkzeug {werkzeug.__version__}", + color=ctx.color, + ) + ctx.exit() + + +version_option = click.Option( + ["--version"], + help="Show the flask version", + expose_value=False, + callback=get_version, + is_flag=True, + is_eager=True, +) + + +class DispatchingApp: + """Special application that dispatches to a Flask application which + is imported by name in a background thread. If an error happens + it is recorded and shown as part of the WSGI handling which in case + of the Werkzeug debugger means that it shows up in the browser. + """ + + def __init__(self, loader, use_eager_loading=None): + self.loader = loader + self._app = None + self._lock = Lock() + self._bg_loading_exc = None + + if use_eager_loading is None: + use_eager_loading = os.environ.get("WERKZEUG_RUN_MAIN") != "true" + + if use_eager_loading: + self._load_unlocked() + else: + self._load_in_background() + + def _load_in_background(self): + def _load_app(): + __traceback_hide__ = True # noqa: F841 + with self._lock: + try: + self._load_unlocked() + except Exception as e: + self._bg_loading_exc = e + + t = Thread(target=_load_app, args=()) + t.start() + + def _flush_bg_loading_exception(self): + __traceback_hide__ = True # noqa: F841 + exc = self._bg_loading_exc + + if exc is not None: + self._bg_loading_exc = None + raise exc + + def _load_unlocked(self): + __traceback_hide__ = True # noqa: F841 + self._app = rv = self.loader() + self._bg_loading_exc = None + return rv + + def __call__(self, environ, start_response): + __traceback_hide__ = True # noqa: F841 + if self._app is not None: + return self._app(environ, start_response) + self._flush_bg_loading_exception() + with self._lock: + if self._app is not None: + rv = self._app + else: + rv = self._load_unlocked() + return rv(environ, start_response) + + +class ScriptInfo: + """Helper object to deal with Flask applications. This is usually not + necessary to interface with as it's used internally in the dispatching + to click. In future versions of Flask this object will most likely play + a bigger role. Typically it's created automatically by the + :class:`FlaskGroup` but you can also manually create it and pass it + onwards as click object. + """ + + def __init__(self, app_import_path=None, create_app=None, set_debug_flag=True): + #: Optionally the import path for the Flask application. + self.app_import_path = app_import_path or os.environ.get("FLASK_APP") + #: Optionally a function that is passed the script info to create + #: the instance of the application. + self.create_app = create_app + #: A dictionary with arbitrary data that can be associated with + #: this script info. + self.data = {} + self.set_debug_flag = set_debug_flag + self._loaded_app = None + + def load_app(self): + """Loads the Flask app (if not yet loaded) and returns it. Calling + this multiple times will just result in the already loaded app to + be returned. + """ + __traceback_hide__ = True # noqa: F841 + + if self._loaded_app is not None: + return self._loaded_app + + if self.create_app is not None: + app = call_factory(self, self.create_app) + else: + if self.app_import_path: + path, name = ( + re.split(r":(?![\\/])", self.app_import_path, 1) + [None] + )[:2] + import_name = prepare_import(path) + app = locate_app(self, import_name, name) + else: + for path in ("wsgi.py", "app.py"): + import_name = prepare_import(path) + app = locate_app(self, import_name, None, raise_if_not_found=False) + + if app: + break + + if not app: + raise NoAppException( + "Could not locate a Flask application. You did not provide " + 'the "FLASK_APP" environment variable, and a "wsgi.py" or ' + '"app.py" module was not found in the current directory.' + ) + + if self.set_debug_flag: + # Update the app's debug flag through the descriptor so that + # other values repopulate as well. + app.debug = get_debug_flag() + + self._loaded_app = app + return app + + +pass_script_info = click.make_pass_decorator(ScriptInfo, ensure=True) + + +def with_appcontext(f): + """Wraps a callback so that it's guaranteed to be executed with the + script's application context. If callbacks are registered directly + to the ``app.cli`` object then they are wrapped with this function + by default unless it's disabled. + """ + + @click.pass_context + def decorator(__ctx, *args, **kwargs): + with __ctx.ensure_object(ScriptInfo).load_app().app_context(): + return __ctx.invoke(f, *args, **kwargs) + + return update_wrapper(decorator, f) + + +class AppGroup(click.Group): + """This works similar to a regular click :class:`~click.Group` but it + changes the behavior of the :meth:`command` decorator so that it + automatically wraps the functions in :func:`with_appcontext`. + + Not to be confused with :class:`FlaskGroup`. + """ + + def command(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it wraps callbacks in :func:`with_appcontext` + unless it's disabled by passing ``with_appcontext=False``. + """ + wrap_for_ctx = kwargs.pop("with_appcontext", True) + + def decorator(f): + if wrap_for_ctx: + f = with_appcontext(f) + return click.Group.command(self, *args, **kwargs)(f) + + return decorator + + def group(self, *args, **kwargs): + """This works exactly like the method of the same name on a regular + :class:`click.Group` but it defaults the group class to + :class:`AppGroup`. + """ + kwargs.setdefault("cls", AppGroup) + return click.Group.group(self, *args, **kwargs) + + +class FlaskGroup(AppGroup): + """Special subclass of the :class:`AppGroup` group that supports + loading more commands from the configured Flask app. Normally a + developer does not have to interface with this class but there are + some very advanced use cases for which it makes sense to create an + instance of this. see :ref:`custom-scripts`. + + :param add_default_commands: if this is True then the default run and + shell commands will be added. + :param add_version_option: adds the ``--version`` option. + :param create_app: an optional callback that is passed the script info and + returns the loaded app. + :param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv` + files to set environment variables. Will also change the working + directory to the directory containing the first file found. + :param set_debug_flag: Set the app's debug flag based on the active + environment + + .. versionchanged:: 1.0 + If installed, python-dotenv will be used to load environment variables + from :file:`.env` and :file:`.flaskenv` files. + """ + + def __init__( + self, + add_default_commands=True, + create_app=None, + add_version_option=True, + load_dotenv=True, + set_debug_flag=True, + **extra, + ): + params = list(extra.pop("params", None) or ()) + + if add_version_option: + params.append(version_option) + + AppGroup.__init__(self, params=params, **extra) + self.create_app = create_app + self.load_dotenv = load_dotenv + self.set_debug_flag = set_debug_flag + + if add_default_commands: + self.add_command(run_command) + self.add_command(shell_command) + self.add_command(routes_command) + + self._loaded_plugin_commands = False + + def _load_plugin_commands(self): + if self._loaded_plugin_commands: + return + try: + import pkg_resources + except ImportError: + self._loaded_plugin_commands = True + return + + for ep in pkg_resources.iter_entry_points("flask.commands"): + self.add_command(ep.load(), ep.name) + self._loaded_plugin_commands = True + + def get_command(self, ctx, name): + self._load_plugin_commands() + # Look up built-in and plugin commands, which should be + # available even if the app fails to load. + rv = super().get_command(ctx, name) + + if rv is not None: + return rv + + info = ctx.ensure_object(ScriptInfo) + + # Look up commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + return info.load_app().cli.get_command(ctx, name) + except NoAppException as e: + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + + def list_commands(self, ctx): + self._load_plugin_commands() + # Start with the built-in and plugin commands. + rv = set(super().list_commands(ctx)) + info = ctx.ensure_object(ScriptInfo) + + # Add commands provided by the app, showing an error and + # continuing if the app couldn't be loaded. + try: + rv.update(info.load_app().cli.list_commands(ctx)) + except NoAppException as e: + # When an app couldn't be loaded, show the error message + # without the traceback. + click.secho(f"Error: {e.format_message()}\n", err=True, fg="red") + except Exception: + # When any other errors occurred during loading, show the + # full traceback. + click.secho(f"{traceback.format_exc()}\n", err=True, fg="red") + + return sorted(rv) + + def main(self, *args, **kwargs): + # Set a global flag that indicates that we were invoked from the + # command line interface. This is detected by Flask.run to make the + # call into a no-op. This is necessary to avoid ugly errors when the + # script that is loaded here also attempts to start a server. + os.environ["FLASK_RUN_FROM_CLI"] = "true" + + if get_load_dotenv(self.load_dotenv): + load_dotenv() + + obj = kwargs.get("obj") + + if obj is None: + obj = ScriptInfo( + create_app=self.create_app, set_debug_flag=self.set_debug_flag + ) + + kwargs["obj"] = obj + kwargs.setdefault("auto_envvar_prefix", "FLASK") + return super().main(*args, **kwargs) + + +def _path_is_ancestor(path, other): + """Take ``other`` and remove the length of ``path`` from it. Then join it + to ``path``. If it is the original value, ``path`` is an ancestor of + ``other``.""" + return os.path.join(path, other[len(path) :].lstrip(os.sep)) == other + + +def load_dotenv(path=None): + """Load "dotenv" files in order of precedence to set environment variables. + + If an env var is already set it is not overwritten, so earlier files in the + list are preferred over later files. + + This is a no-op if `python-dotenv`_ is not installed. + + .. _python-dotenv: https://github.com/theskumar/python-dotenv#readme + + :param path: Load the file at this location instead of searching. + :return: ``True`` if a file was loaded. + + .. versionchanged:: 1.1.0 + Returns ``False`` when python-dotenv is not installed, or when + the given path isn't a file. + + .. versionchanged:: 2.0 + When loading the env files, set the default encoding to UTF-8. + + .. versionadded:: 1.0 + """ + if dotenv is None: + if path or os.path.isfile(".env") or os.path.isfile(".flaskenv"): + click.secho( + " * Tip: There are .env or .flaskenv files present." + ' Do "pip install python-dotenv" to use them.', + fg="yellow", + err=True, + ) + + return False + + # if the given path specifies the actual file then return True, + # else False + if path is not None: + if os.path.isfile(path): + return dotenv.load_dotenv(path, encoding="utf-8") + + return False + + new_dir = None + + for name in (".env", ".flaskenv"): + path = dotenv.find_dotenv(name, usecwd=True) + + if not path: + continue + + if new_dir is None: + new_dir = os.path.dirname(path) + + dotenv.load_dotenv(path, encoding="utf-8") + + return new_dir is not None # at least one file was located and loaded + + +def show_server_banner(env, debug, app_import_path, eager_loading): + """Show extra startup messages the first time the server is run, + ignoring the reloader. + """ + if os.environ.get("WERKZEUG_RUN_MAIN") == "true": + return + + if app_import_path is not None: + message = f" * Serving Flask app {app_import_path!r}" + + if not eager_loading: + message += " (lazy loading)" + + click.echo(message) + + click.echo(f" * Environment: {env}") + + if env == "production": + click.secho( + " WARNING: This is a development server. Do not use it in" + " a production deployment.", + fg="red", + ) + click.secho(" Use a production WSGI server instead.", dim=True) + + if debug is not None: + click.echo(f" * Debug mode: {'on' if debug else 'off'}") + + +class CertParamType(click.ParamType): + """Click option type for the ``--cert`` option. Allows either an + existing file, the string ``'adhoc'``, or an import for a + :class:`~ssl.SSLContext` object. + """ + + name = "path" + + def __init__(self): + self.path_type = click.Path(exists=True, dir_okay=False, resolve_path=True) + + def convert(self, value, param, ctx): + if ssl is None: + raise click.BadParameter( + 'Using "--cert" requires Python to be compiled with SSL support.', + ctx, + param, + ) + + try: + return self.path_type(value, param, ctx) + except click.BadParameter: + value = click.STRING(value, param, ctx).lower() + + if value == "adhoc": + try: + import cryptography # noqa: F401 + except ImportError: + raise click.BadParameter( + "Using ad-hoc certificates requires the cryptography library.", + ctx, + param, + ) from None + + return value + + obj = import_string(value, silent=True) + + if isinstance(obj, ssl.SSLContext): + return obj + + raise + + +def _validate_key(ctx, param, value): + """The ``--key`` option must be specified when ``--cert`` is a file. + Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed. + """ + cert = ctx.params.get("cert") + is_adhoc = cert == "adhoc" + is_context = ssl and isinstance(cert, ssl.SSLContext) + + if value is not None: + if is_adhoc: + raise click.BadParameter( + 'When "--cert" is "adhoc", "--key" is not used.', ctx, param + ) + + if is_context: + raise click.BadParameter( + 'When "--cert" is an SSLContext object, "--key is not used.', ctx, param + ) + + if not cert: + raise click.BadParameter('"--cert" must also be specified.', ctx, param) + + ctx.params["cert"] = cert, value + + else: + if cert and not (is_adhoc or is_context): + raise click.BadParameter('Required when using "--cert".', ctx, param) + + return value + + +class SeparatedPathType(click.Path): + """Click option type that accepts a list of values separated by the + OS's path separator (``:``, ``;`` on Windows). Each value is + validated as a :class:`click.Path` type. + """ + + def convert(self, value, param, ctx): + items = self.split_envvar_value(value) + super_convert = super().convert + return [super_convert(item, param, ctx) for item in items] + + +@click.command("run", short_help="Run a development server.") +@click.option("--host", "-h", default="127.0.0.1", help="The interface to bind to.") +@click.option("--port", "-p", default=5000, help="The port to bind to.") +@click.option( + "--cert", type=CertParamType(), help="Specify a certificate file to use HTTPS." +) +@click.option( + "--key", + type=click.Path(exists=True, dir_okay=False, resolve_path=True), + callback=_validate_key, + expose_value=False, + help="The key file to use when specifying a certificate.", +) +@click.option( + "--reload/--no-reload", + default=None, + help="Enable or disable the reloader. By default the reloader " + "is active if debug is enabled.", +) +@click.option( + "--debugger/--no-debugger", + default=None, + help="Enable or disable the debugger. By default the debugger " + "is active if debug is enabled.", +) +@click.option( + "--eager-loading/--lazy-loading", + default=None, + help="Enable or disable eager loading. By default eager " + "loading is enabled if the reloader is disabled.", +) +@click.option( + "--with-threads/--without-threads", + default=True, + help="Enable or disable multithreading.", +) +@click.option( + "--extra-files", + default=None, + type=SeparatedPathType(), + help=( + "Extra files that trigger a reload on change. Multiple paths" + f" are separated by {os.path.pathsep!r}." + ), +) +@pass_script_info +def run_command( + info, host, port, reload, debugger, eager_loading, with_threads, cert, extra_files +): + """Run a local development server. + + This server is for development purposes only. It does not provide + the stability, security, or performance of production WSGI servers. + + The reloader and debugger are enabled by default if + FLASK_ENV=development or FLASK_DEBUG=1. + """ + debug = get_debug_flag() + + if reload is None: + reload = debug + + if debugger is None: + debugger = debug + + show_server_banner(get_env(), debug, info.app_import_path, eager_loading) + app = DispatchingApp(info.load_app, use_eager_loading=eager_loading) + + from werkzeug.serving import run_simple + + run_simple( + host, + port, + app, + use_reloader=reload, + use_debugger=debugger, + threaded=with_threads, + ssl_context=cert, + extra_files=extra_files, + ) + + +@click.command("shell", short_help="Run a shell in the app context.") +@with_appcontext +def shell_command() -> None: + """Run an interactive Python shell in the context of a given + Flask application. The application will populate the default + namespace of this shell according to its configuration. + + This is useful for executing small snippets of management code + without having to manually configure the application. + """ + import code + from .globals import _app_ctx_stack + + app = _app_ctx_stack.top.app + banner = ( + f"Python {sys.version} on {sys.platform}\n" + f"App: {app.import_name} [{app.env}]\n" + f"Instance: {app.instance_path}" + ) + ctx: dict = {} + + # Support the regular Python interpreter startup script if someone + # is using it. + startup = os.environ.get("PYTHONSTARTUP") + if startup and os.path.isfile(startup): + with open(startup) as f: + eval(compile(f.read(), startup, "exec"), ctx) + + ctx.update(app.make_shell_context()) + + # Site, customize, or startup script can set a hook to call when + # entering interactive mode. The default one sets up readline with + # tab and history completion. + interactive_hook = getattr(sys, "__interactivehook__", None) + + if interactive_hook is not None: + try: + import readline + from rlcompleter import Completer + except ImportError: + pass + else: + # rlcompleter uses __main__.__dict__ by default, which is + # flask.__main__. Use the shell context instead. + readline.set_completer(Completer(ctx).complete) + + interactive_hook() + + code.interact(banner=banner, local=ctx) + + +@click.command("routes", short_help="Show the routes for the app.") +@click.option( + "--sort", + "-s", + type=click.Choice(("endpoint", "methods", "rule", "match")), + default="endpoint", + help=( + 'Method to sort routes by. "match" is the order that Flask will match ' + "routes when dispatching a request." + ), +) +@click.option("--all-methods", is_flag=True, help="Show HEAD and OPTIONS methods.") +@with_appcontext +def routes_command(sort: str, all_methods: bool) -> None: + """Show all registered routes with endpoints and methods.""" + + rules = list(current_app.url_map.iter_rules()) + if not rules: + click.echo("No routes were registered.") + return + + ignored_methods = set(() if all_methods else ("HEAD", "OPTIONS")) + + if sort in ("endpoint", "rule"): + rules = sorted(rules, key=attrgetter(sort)) + elif sort == "methods": + rules = sorted(rules, key=lambda rule: sorted(rule.methods)) # type: ignore + + rule_methods = [ + ", ".join(sorted(rule.methods - ignored_methods)) # type: ignore + for rule in rules + ] + + headers = ("Endpoint", "Methods", "Rule") + widths = ( + max(len(rule.endpoint) for rule in rules), + max(len(methods) for methods in rule_methods), + max(len(rule.rule) for rule in rules), + ) + widths = [max(len(h), w) for h, w in zip(headers, widths)] + row = "{{0:<{0}}} {{1:<{1}}} {{2:<{2}}}".format(*widths) + + click.echo(row.format(*headers).strip()) + click.echo(row.format(*("-" * width for width in widths))) + + for rule, methods in zip(rules, rule_methods): + click.echo(row.format(rule.endpoint, methods, rule.rule).rstrip()) + + +cli = FlaskGroup( + help="""\ +A general utility script for Flask applications. + +Provides commands from Flask, extensions, and the application. Loads the +application defined in the FLASK_APP environment variable, or from a wsgi.py +file. Setting the FLASK_ENV environment variable to 'development' will enable +debug mode. + +\b + {prefix}{cmd} FLASK_APP=hello.py + {prefix}{cmd} FLASK_ENV=development + {prefix}flask run +""".format( + cmd="export" if os.name == "posix" else "set", + prefix="$ " if os.name == "posix" else "> ", + ) +) + + +def main() -> None: + if int(click.__version__[0]) < 8: + warnings.warn( + "Using the `flask` cli with Click 7 is deprecated and" + " will not be supported starting with Flask 2.1." + " Please upgrade to Click 8 as soon as possible.", + DeprecationWarning, + ) + # TODO omit sys.argv once https://github.com/pallets/click/issues/536 is fixed + cli.main(args=sys.argv[1:]) + + +if __name__ == "__main__": + main() diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/config.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/config.py new file mode 100644 index 00000000..ca769022 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/config.py @@ -0,0 +1,295 @@ +import errno +import os +import types +import typing as t + +from werkzeug.utils import import_string + + +class ConfigAttribute: + """Makes an attribute forward to the config""" + + def __init__(self, name: str, get_converter: t.Optional[t.Callable] = None) -> None: + self.__name__ = name + self.get_converter = get_converter + + def __get__(self, obj: t.Any, owner: t.Any = None) -> t.Any: + if obj is None: + return self + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv + + def __set__(self, obj: t.Any, value: t.Any) -> None: + obj.config[self.__name__] = value + + +class Config(dict): + """Works exactly like a dict but provides ways to fill it from files + or special dictionaries. There are two common patterns to populate the + config. + + Either you can fill the config from a config file:: + + app.config.from_pyfile('yourconfig.cfg') + + Or alternatively you can define the configuration options in the + module that calls :meth:`from_object` or provide an import path to + a module that should be loaded. It is also possible to tell it to + use the same module and with that provide the configuration values + just before the call:: + + DEBUG = True + SECRET_KEY = 'development key' + app.config.from_object(__name__) + + In both cases (loading from any Python file or loading from modules), + only uppercase keys are added to the config. This makes it possible to use + lowercase values in the config file for temporary values that are not added + to the config or to define the config keys in the same file that implements + the application. + + Probably the most interesting way to load configurations is from an + environment variable pointing to a file:: + + app.config.from_envvar('YOURAPPLICATION_SETTINGS') + + In this case before launching the application you have to set this + environment variable to the file you want to use. On Linux and OS X + use the export statement:: + + export YOURAPPLICATION_SETTINGS='/path/to/config/file' + + On windows use `set` instead. + + :param root_path: path to which files are read relative from. When the + config object is created by the application, this is + the application's :attr:`~flask.Flask.root_path`. + :param defaults: an optional dictionary of default values + """ + + def __init__(self, root_path: str, defaults: t.Optional[dict] = None) -> None: + dict.__init__(self, defaults or {}) + self.root_path = root_path + + def from_envvar(self, variable_name: str, silent: bool = False) -> bool: + """Loads a configuration from an environment variable pointing to + a configuration file. This is basically just a shortcut with nicer + error messages for this line of code:: + + app.config.from_pyfile(os.environ['YOURAPPLICATION_SETTINGS']) + + :param variable_name: name of the environment variable + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + """ + rv = os.environ.get(variable_name) + if not rv: + if silent: + return False + raise RuntimeError( + f"The environment variable {variable_name!r} is not set" + " and as such configuration could not be loaded. Set" + " this variable and make it point to a configuration" + " file" + ) + return self.from_pyfile(rv, silent=silent) + + def from_pyfile(self, filename: str, silent: bool = False) -> bool: + """Updates the values in the config from a Python file. This function + behaves as if the file was imported as module with the + :meth:`from_object` function. + + :param filename: the filename of the config. This can either be an + absolute filename or a filename relative to the + root path. + :param silent: set to ``True`` if you want silent failure for missing + files. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 0.7 + `silent` parameter. + """ + filename = os.path.join(self.root_path, filename) + d = types.ModuleType("config") + d.__file__ = filename + try: + with open(filename, mode="rb") as config_file: + exec(compile(config_file.read(), filename, "exec"), d.__dict__) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR, errno.ENOTDIR): + return False + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + self.from_object(d) + return True + + def from_object(self, obj: t.Union[object, str]) -> None: + """Updates the values from the given object. An object can be of one + of the following two types: + + - a string: in this case the object with that name will be imported + - an actual object reference: that object is used directly + + Objects are usually either modules or classes. :meth:`from_object` + loads only the uppercase attributes of the module/class. A ``dict`` + object will not work with :meth:`from_object` because the keys of a + ``dict`` are not attributes of the ``dict`` class. + + Example of module-based configuration:: + + app.config.from_object('yourapplication.default_config') + from yourapplication import default_config + app.config.from_object(default_config) + + Nothing is done to the object before loading. If the object is a + class and has ``@property`` attributes, it needs to be + instantiated before being passed to this method. + + You should not use this function to load the actual configuration but + rather configuration defaults. The actual config should be loaded + with :meth:`from_pyfile` and ideally from a location not within the + package because the package might be installed system wide. + + See :ref:`config-dev-prod` for an example of class-based configuration + using :meth:`from_object`. + + :param obj: an import name or object + """ + if isinstance(obj, str): + obj = import_string(obj) + for key in dir(obj): + if key.isupper(): + self[key] = getattr(obj, key) + + def from_file( + self, + filename: str, + load: t.Callable[[t.IO[t.Any]], t.Mapping], + silent: bool = False, + ) -> bool: + """Update the values in the config from a file that is loaded + using the ``load`` parameter. The loaded data is passed to the + :meth:`from_mapping` method. + + .. code-block:: python + + import toml + app.config.from_file("config.toml", load=toml.load) + + :param filename: The path to the data file. This can be an + absolute path or relative to the config root path. + :param load: A callable that takes a file handle and returns a + mapping of loaded data from the file. + :type load: ``Callable[[Reader], Mapping]`` where ``Reader`` + implements a ``read`` method. + :param silent: Ignore the file if it doesn't exist. + :return: ``True`` if the file was loaded successfully. + + .. versionadded:: 2.0 + """ + filename = os.path.join(self.root_path, filename) + + try: + with open(filename) as f: + obj = load(f) + except OSError as e: + if silent and e.errno in (errno.ENOENT, errno.EISDIR): + return False + + e.strerror = f"Unable to load configuration file ({e.strerror})" + raise + + return self.from_mapping(obj) + + def from_json(self, filename: str, silent: bool = False) -> bool: + """Update the values in the config from a JSON file. The loaded + data is passed to the :meth:`from_mapping` method. + + :param filename: The path to the JSON file. This can be an + absolute path or relative to the config root path. + :param silent: Ignore the file if it doesn't exist. + :return: ``True`` if the file was loaded successfully. + + .. deprecated:: 2.0.0 + Will be removed in Flask 2.1. Use :meth:`from_file` instead. + This was removed early in 2.0.0, was added back in 2.0.1. + + .. versionadded:: 0.11 + """ + import warnings + from . import json + + warnings.warn( + "'from_json' is deprecated and will be removed in Flask" + " 2.1. Use 'from_file(path, json.load)' instead.", + DeprecationWarning, + stacklevel=2, + ) + return self.from_file(filename, json.load, silent=silent) + + def from_mapping( + self, mapping: t.Optional[t.Mapping[str, t.Any]] = None, **kwargs: t.Any + ) -> bool: + """Updates the config like :meth:`update` ignoring items with non-upper + keys. + :return: Always returns ``True``. + + .. versionadded:: 0.11 + """ + mappings: t.Dict[str, t.Any] = {} + if mapping is not None: + mappings.update(mapping) + mappings.update(kwargs) + for key, value in mappings.items(): + if key.isupper(): + self[key] = value + return True + + def get_namespace( + self, namespace: str, lowercase: bool = True, trim_namespace: bool = True + ) -> t.Dict[str, t.Any]: + """Returns a dictionary containing a subset of configuration options + that match the specified namespace/prefix. Example usage:: + + app.config['IMAGE_STORE_TYPE'] = 'fs' + app.config['IMAGE_STORE_PATH'] = '/var/app/images' + app.config['IMAGE_STORE_BASE_URL'] = 'http://img.website.com' + image_store_config = app.config.get_namespace('IMAGE_STORE_') + + The resulting dictionary `image_store_config` would look like:: + + { + 'type': 'fs', + 'path': '/var/app/images', + 'base_url': 'http://img.website.com' + } + + This is often useful when configuration options map directly to + keyword arguments in functions or class constructors. + + :param namespace: a configuration namespace + :param lowercase: a flag indicating if the keys of the resulting + dictionary should be lowercase + :param trim_namespace: a flag indicating if the keys of the resulting + dictionary should not include the namespace + + .. versionadded:: 0.11 + """ + rv = {} + for k, v in self.items(): + if not k.startswith(namespace): + continue + if trim_namespace: + key = k[len(namespace) :] + else: + key = k + if lowercase: + key = key.lower() + rv[key] = v + return rv + + def __repr__(self) -> str: + return f"<{type(self).__name__} {dict.__repr__(self)}>" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/ctx.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/ctx.py new file mode 100644 index 00000000..5c064635 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/ctx.py @@ -0,0 +1,480 @@ +import sys +import typing as t +from functools import update_wrapper +from types import TracebackType + +from werkzeug.exceptions import HTTPException + +from .globals import _app_ctx_stack +from .globals import _request_ctx_stack +from .signals import appcontext_popped +from .signals import appcontext_pushed +from .typing import AfterRequestCallable + +if t.TYPE_CHECKING: + from .app import Flask + from .sessions import SessionMixin + from .wrappers import Request + + +# a singleton sentinel value for parameter defaults +_sentinel = object() + + +class _AppCtxGlobals: + """A plain object. Used as a namespace for storing data during an + application context. + + Creating an app context automatically creates this object, which is + made available as the :data:`g` proxy. + + .. describe:: 'key' in g + + Check whether an attribute is present. + + .. versionadded:: 0.10 + + .. describe:: iter(g) + + Return an iterator over the attribute names. + + .. versionadded:: 0.10 + """ + + # Define attr methods to let mypy know this is a namespace object + # that has arbitrary attributes. + + def __getattr__(self, name: str) -> t.Any: + try: + return self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def __setattr__(self, name: str, value: t.Any) -> None: + self.__dict__[name] = value + + def __delattr__(self, name: str) -> None: + try: + del self.__dict__[name] + except KeyError: + raise AttributeError(name) from None + + def get(self, name: str, default: t.Optional[t.Any] = None) -> t.Any: + """Get an attribute by name, or a default value. Like + :meth:`dict.get`. + + :param name: Name of attribute to get. + :param default: Value to return if the attribute is not present. + + .. versionadded:: 0.10 + """ + return self.__dict__.get(name, default) + + def pop(self, name: str, default: t.Any = _sentinel) -> t.Any: + """Get and remove an attribute by name. Like :meth:`dict.pop`. + + :param name: Name of attribute to pop. + :param default: Value to return if the attribute is not present, + instead of raising a ``KeyError``. + + .. versionadded:: 0.11 + """ + if default is _sentinel: + return self.__dict__.pop(name) + else: + return self.__dict__.pop(name, default) + + def setdefault(self, name: str, default: t.Any = None) -> t.Any: + """Get the value of an attribute if it is present, otherwise + set and return a default value. Like :meth:`dict.setdefault`. + + :param name: Name of attribute to get. + :param default: Value to set and return if the attribute is not + present. + + .. versionadded:: 0.11 + """ + return self.__dict__.setdefault(name, default) + + def __contains__(self, item: str) -> bool: + return item in self.__dict__ + + def __iter__(self) -> t.Iterator[str]: + return iter(self.__dict__) + + def __repr__(self) -> str: + top = _app_ctx_stack.top + if top is not None: + return f"" + return object.__repr__(self) + + +def after_this_request(f: AfterRequestCallable) -> AfterRequestCallable: + """Executes a function after this request. This is useful to modify + response objects. The function is passed the response object and has + to return the same or a new one. + + Example:: + + @app.route('/') + def index(): + @after_this_request + def add_header(response): + response.headers['X-Foo'] = 'Parachute' + return response + return 'Hello World!' + + This is more useful if a function other than the view function wants to + modify a response. For instance think of a decorator that wants to add + some headers without converting the return value into a response object. + + .. versionadded:: 0.9 + """ + _request_ctx_stack.top._after_request_functions.append(f) + return f + + +def copy_current_request_context(f: t.Callable) -> t.Callable: + """A helper function that decorates a function to retain the current + request context. This is useful when working with greenlets. The moment + the function is decorated a copy of the request context is created and + then pushed when the function is called. The current session is also + included in the copied request context. + + Example:: + + import gevent + from flask import copy_current_request_context + + @app.route('/') + def index(): + @copy_current_request_context + def do_some_work(): + # do some work here, it can access flask.request or + # flask.session like you would otherwise in the view function. + ... + gevent.spawn(do_some_work) + return 'Regular response' + + .. versionadded:: 0.10 + """ + top = _request_ctx_stack.top + if top is None: + raise RuntimeError( + "This decorator can only be used at local scopes " + "when a request context is on the stack. For instance within " + "view functions." + ) + reqctx = top.copy() + + def wrapper(*args, **kwargs): + with reqctx: + return f(*args, **kwargs) + + return update_wrapper(wrapper, f) + + +def has_request_context() -> bool: + """If you have code that wants to test if a request context is there or + not this function can be used. For instance, you may want to take advantage + of request information if the request object is available, but fail + silently if it is unavailable. + + :: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and has_request_context(): + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + Alternatively you can also just test any of the context bound objects + (such as :class:`request` or :class:`g`) for truthness:: + + class User(db.Model): + + def __init__(self, username, remote_addr=None): + self.username = username + if remote_addr is None and request: + remote_addr = request.remote_addr + self.remote_addr = remote_addr + + .. versionadded:: 0.7 + """ + return _request_ctx_stack.top is not None + + +def has_app_context() -> bool: + """Works like :func:`has_request_context` but for the application + context. You can also just do a boolean check on the + :data:`current_app` object instead. + + .. versionadded:: 0.9 + """ + return _app_ctx_stack.top is not None + + +class AppContext: + """The application context binds an application object implicitly + to the current thread or greenlet, similar to how the + :class:`RequestContext` binds request information. The application + context is also implicitly created if a request context is created + but the application is not on top of the individual application + context. + """ + + def __init__(self, app: "Flask") -> None: + self.app = app + self.url_adapter = app.create_url_adapter(None) + self.g = app.app_ctx_globals_class() + + # Like request context, app contexts can be pushed multiple times + # but there a basic "refcount" is enough to track them. + self._refcnt = 0 + + def push(self) -> None: + """Binds the app context to the current context.""" + self._refcnt += 1 + _app_ctx_stack.push(self) + appcontext_pushed.send(self.app) + + def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore + """Pops the app context.""" + try: + self._refcnt -= 1 + if self._refcnt <= 0: + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_appcontext(exc) + finally: + rv = _app_ctx_stack.pop() + assert rv is self, f"Popped wrong app context. ({rv!r} instead of {self!r})" + appcontext_popped.send(self.app) + + def __enter__(self) -> "AppContext": + self.push() + return self + + def __exit__( + self, exc_type: type, exc_value: BaseException, tb: TracebackType + ) -> None: + self.pop(exc_value) + + +class RequestContext: + """The request context contains all request relevant information. It is + created at the beginning of the request and pushed to the + `_request_ctx_stack` and removed at the end of it. It will create the + URL adapter and request object for the WSGI environment provided. + + Do not attempt to use this class directly, instead use + :meth:`~flask.Flask.test_request_context` and + :meth:`~flask.Flask.request_context` to create this object. + + When the request context is popped, it will evaluate all the + functions registered on the application for teardown execution + (:meth:`~flask.Flask.teardown_request`). + + The request context is automatically popped at the end of the request + for you. In debug mode the request context is kept around if + exceptions happen so that interactive debuggers have a chance to + introspect the data. With 0.4 this can also be forced for requests + that did not fail and outside of ``DEBUG`` mode. By setting + ``'flask._preserve_context'`` to ``True`` on the WSGI environment the + context will not pop itself at the end of the request. This is used by + the :meth:`~flask.Flask.test_client` for example to implement the + deferred cleanup functionality. + + You might find this helpful for unittests where you need the + information from the context local around for a little longer. Make + sure to properly :meth:`~werkzeug.LocalStack.pop` the stack yourself in + that situation, otherwise your unittests will leak memory. + """ + + def __init__( + self, + app: "Flask", + environ: dict, + request: t.Optional["Request"] = None, + session: t.Optional["SessionMixin"] = None, + ) -> None: + self.app = app + if request is None: + request = app.request_class(environ) + self.request = request + self.url_adapter = None + try: + self.url_adapter = app.create_url_adapter(self.request) + except HTTPException as e: + self.request.routing_exception = e + self.flashes = None + self.session = session + + # Request contexts can be pushed multiple times and interleaved with + # other request contexts. Now only if the last level is popped we + # get rid of them. Additionally if an application context is missing + # one is created implicitly so for each level we add this information + self._implicit_app_ctx_stack: t.List[t.Optional["AppContext"]] = [] + + # indicator if the context was preserved. Next time another context + # is pushed the preserved context is popped. + self.preserved = False + + # remembers the exception for pop if there is one in case the context + # preservation kicks in. + self._preserved_exc = None + + # Functions that should be executed after the request on the response + # object. These will be called before the regular "after_request" + # functions. + self._after_request_functions: t.List[AfterRequestCallable] = [] + + @property + def g(self) -> AppContext: + return _app_ctx_stack.top.g + + @g.setter + def g(self, value: AppContext) -> None: + _app_ctx_stack.top.g = value + + def copy(self) -> "RequestContext": + """Creates a copy of this request context with the same request object. + This can be used to move a request context to a different greenlet. + Because the actual request object is the same this cannot be used to + move a request context to a different thread unless access to the + request object is locked. + + .. versionadded:: 0.10 + + .. versionchanged:: 1.1 + The current session object is used instead of reloading the original + data. This prevents `flask.session` pointing to an out-of-date object. + """ + return self.__class__( + self.app, + environ=self.request.environ, + request=self.request, + session=self.session, + ) + + def match_request(self) -> None: + """Can be overridden by a subclass to hook into the matching + of the request. + """ + try: + result = self.url_adapter.match(return_rule=True) # type: ignore + self.request.url_rule, self.request.view_args = result # type: ignore + except HTTPException as e: + self.request.routing_exception = e + + def push(self) -> None: + """Binds the request context to the current context.""" + # If an exception occurs in debug mode or if context preservation is + # activated under exception situations exactly one context stays + # on the stack. The rationale is that you want to access that + # information under debug situations. However if someone forgets to + # pop that context again we want to make sure that on the next push + # it's invalidated, otherwise we run at risk that something leaks + # memory. This is usually only a problem in test suite since this + # functionality is not active in production environments. + top = _request_ctx_stack.top + if top is not None and top.preserved: + top.pop(top._preserved_exc) + + # Before we push the request context we have to ensure that there + # is an application context. + app_ctx = _app_ctx_stack.top + if app_ctx is None or app_ctx.app != self.app: + app_ctx = self.app.app_context() + app_ctx.push() + self._implicit_app_ctx_stack.append(app_ctx) + else: + self._implicit_app_ctx_stack.append(None) + + _request_ctx_stack.push(self) + + # Open the session at the moment that the request context is available. + # This allows a custom open_session method to use the request context. + # Only open a new session if this is the first time the request was + # pushed, otherwise stream_with_context loses the session. + if self.session is None: + session_interface = self.app.session_interface + self.session = session_interface.open_session(self.app, self.request) + + if self.session is None: + self.session = session_interface.make_null_session(self.app) + + # Match the request URL after loading the session, so that the + # session is available in custom URL converters. + if self.url_adapter is not None: + self.match_request() + + def pop(self, exc: t.Optional[BaseException] = _sentinel) -> None: # type: ignore + """Pops the request context and unbinds it by doing that. This will + also trigger the execution of functions registered by the + :meth:`~flask.Flask.teardown_request` decorator. + + .. versionchanged:: 0.9 + Added the `exc` argument. + """ + app_ctx = self._implicit_app_ctx_stack.pop() + clear_request = False + + try: + if not self._implicit_app_ctx_stack: + self.preserved = False + self._preserved_exc = None + if exc is _sentinel: + exc = sys.exc_info()[1] + self.app.do_teardown_request(exc) + + request_close = getattr(self.request, "close", None) + if request_close is not None: + request_close() + clear_request = True + finally: + rv = _request_ctx_stack.pop() + + # get rid of circular dependencies at the end of the request + # so that we don't require the GC to be active. + if clear_request: + rv.request.environ["werkzeug.request"] = None + + # Get rid of the app as well if necessary. + if app_ctx is not None: + app_ctx.pop(exc) + + assert ( + rv is self + ), f"Popped wrong request context. ({rv!r} instead of {self!r})" + + def auto_pop(self, exc: t.Optional[BaseException]) -> None: + if self.request.environ.get("flask._preserve_context") or ( + exc is not None and self.app.preserve_context_on_exception + ): + self.preserved = True + self._preserved_exc = exc # type: ignore + else: + self.pop(exc) + + def __enter__(self) -> "RequestContext": + self.push() + return self + + def __exit__( + self, exc_type: type, exc_value: BaseException, tb: TracebackType + ) -> None: + # do not pop the request stack if we are in debug mode and an + # exception happened. This will allow the debugger to still + # access the request object in the interactive shell. Furthermore + # the context can be force kept alive for the test client. + # See flask.testing for how this works. + self.auto_pop(exc_value) + + def __repr__(self) -> str: + return ( + f"<{type(self).__name__} {self.request.url!r}" + f" [{self.request.method}] of {self.app.name}>" + ) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/debughelpers.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/debughelpers.py new file mode 100644 index 00000000..212f7d7e --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/debughelpers.py @@ -0,0 +1,172 @@ +import os +import typing as t +from warnings import warn + +from .app import Flask +from .blueprints import Blueprint +from .globals import _request_ctx_stack + + +class UnexpectedUnicodeError(AssertionError, UnicodeError): + """Raised in places where we want some better error reporting for + unexpected unicode or binary data. + """ + + +class DebugFilesKeyError(KeyError, AssertionError): + """Raised from request.files during debugging. The idea is that it can + provide a better error message than just a generic KeyError/BadRequest. + """ + + def __init__(self, request, key): + form_matches = request.form.getlist(key) + buf = [ + f"You tried to access the file {key!r} in the request.files" + " dictionary but it does not exist. The mimetype for the" + f" request is {request.mimetype!r} instead of" + " 'multipart/form-data' which means that no file contents" + " were transmitted. To fix this error you should provide" + ' enctype="multipart/form-data" in your form.' + ] + if form_matches: + names = ", ".join(repr(x) for x in form_matches) + buf.append( + "\n\nThe browser instead transmitted some file names. " + f"This was submitted: {names}" + ) + self.msg = "".join(buf) + + def __str__(self): + return self.msg + + +class FormDataRoutingRedirect(AssertionError): + """This exception is raised by Flask in debug mode if it detects a + redirect caused by the routing system when the request method is not + GET, HEAD or OPTIONS. Reasoning: form data will be dropped. + """ + + def __init__(self, request): + exc = request.routing_exception + buf = [ + f"A request was sent to this URL ({request.url}) but a" + " redirect was issued automatically by the routing system" + f" to {exc.new_url!r}." + ] + + # In case just a slash was appended we can be extra helpful + if f"{request.base_url}/" == exc.new_url.split("?")[0]: + buf.append( + " The URL was defined with a trailing slash so Flask" + " will automatically redirect to the URL with the" + " trailing slash if it was accessed without one." + ) + + buf.append( + " Make sure to directly send your" + f" {request.method}-request to this URL since we can't make" + " browsers or HTTP clients redirect with form data reliably" + " or without user interaction." + ) + buf.append("\n\nNote: this exception is only raised in debug mode") + AssertionError.__init__(self, "".join(buf).encode("utf-8")) + + +def attach_enctype_error_multidict(request): + """Since Flask 0.8 we're monkeypatching the files object in case a + request is detected that does not use multipart form data but the files + object is accessed. + """ + oldcls = request.files.__class__ + + class newcls(oldcls): + def __getitem__(self, key): + try: + return oldcls.__getitem__(self, key) + except KeyError as e: + if key not in request.form: + raise + + raise DebugFilesKeyError(request, key) from e + + newcls.__name__ = oldcls.__name__ + newcls.__module__ = oldcls.__module__ + request.files.__class__ = newcls + + +def _dump_loader_info(loader) -> t.Generator: + yield f"class: {type(loader).__module__}.{type(loader).__name__}" + for key, value in sorted(loader.__dict__.items()): + if key.startswith("_"): + continue + if isinstance(value, (tuple, list)): + if not all(isinstance(x, str) for x in value): + continue + yield f"{key}:" + for item in value: + yield f" - {item}" + continue + elif not isinstance(value, (str, int, float, bool)): + continue + yield f"{key}: {value!r}" + + +def explain_template_loading_attempts(app: Flask, template, attempts) -> None: + """This should help developers understand what failed""" + info = [f"Locating template {template!r}:"] + total_found = 0 + blueprint = None + reqctx = _request_ctx_stack.top + if reqctx is not None and reqctx.request.blueprint is not None: + blueprint = reqctx.request.blueprint + + for idx, (loader, srcobj, triple) in enumerate(attempts): + if isinstance(srcobj, Flask): + src_info = f"application {srcobj.import_name!r}" + elif isinstance(srcobj, Blueprint): + src_info = f"blueprint {srcobj.name!r} ({srcobj.import_name})" + else: + src_info = repr(srcobj) + + info.append(f"{idx + 1:5}: trying loader of {src_info}") + + for line in _dump_loader_info(loader): + info.append(f" {line}") + + if triple is None: + detail = "no match" + else: + detail = f"found ({triple[1] or ''!r})" + total_found += 1 + info.append(f" -> {detail}") + + seems_fishy = False + if total_found == 0: + info.append("Error: the template could not be found.") + seems_fishy = True + elif total_found > 1: + info.append("Warning: multiple loaders returned a match for the template.") + seems_fishy = True + + if blueprint is not None and seems_fishy: + info.append( + " The template was looked up from an endpoint that belongs" + f" to the blueprint {blueprint!r}." + ) + info.append(" Maybe you did not place a template in the right folder?") + info.append(" See https://flask.palletsprojects.com/blueprints/#templates") + + app.logger.info("\n".join(info)) + + +def explain_ignored_app_run() -> None: + if os.environ.get("WERKZEUG_RUN_MAIN") != "true": + warn( + Warning( + "Silently ignoring app.run() because the application is" + " run from the flask command line executable. Consider" + ' putting app.run() behind an if __name__ == "__main__"' + " guard to silence this warning." + ), + stacklevel=3, + ) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/globals.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/globals.py new file mode 100644 index 00000000..6d91c75e --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/globals.py @@ -0,0 +1,59 @@ +import typing as t +from functools import partial + +from werkzeug.local import LocalProxy +from werkzeug.local import LocalStack + +if t.TYPE_CHECKING: + from .app import Flask + from .ctx import _AppCtxGlobals + from .sessions import SessionMixin + from .wrappers import Request + +_request_ctx_err_msg = """\ +Working outside of request context. + +This typically means that you attempted to use functionality that needed +an active HTTP request. Consult the documentation on testing for +information about how to avoid this problem.\ +""" +_app_ctx_err_msg = """\ +Working outside of application context. + +This typically means that you attempted to use functionality that needed +to interface with the current application object in some way. To solve +this, set up an application context with app.app_context(). See the +documentation for more information.\ +""" + + +def _lookup_req_object(name): + top = _request_ctx_stack.top + if top is None: + raise RuntimeError(_request_ctx_err_msg) + return getattr(top, name) + + +def _lookup_app_object(name): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return getattr(top, name) + + +def _find_app(): + top = _app_ctx_stack.top + if top is None: + raise RuntimeError(_app_ctx_err_msg) + return top.app + + +# context locals +_request_ctx_stack = LocalStack() +_app_ctx_stack = LocalStack() +current_app: "Flask" = LocalProxy(_find_app) # type: ignore +request: "Request" = LocalProxy(partial(_lookup_req_object, "request")) # type: ignore +session: "SessionMixin" = LocalProxy( # type: ignore + partial(_lookup_req_object, "session") +) +g: "_AppCtxGlobals" = LocalProxy(partial(_lookup_app_object, "g")) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/helpers.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/helpers.py new file mode 100644 index 00000000..7b8b0870 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/helpers.py @@ -0,0 +1,836 @@ +import os +import pkgutil +import socket +import sys +import typing as t +import warnings +from datetime import datetime +from datetime import timedelta +from functools import lru_cache +from functools import update_wrapper +from threading import RLock + +import werkzeug.utils +from werkzeug.exceptions import NotFound +from werkzeug.routing import BuildError +from werkzeug.urls import url_quote + +from .globals import _app_ctx_stack +from .globals import _request_ctx_stack +from .globals import current_app +from .globals import request +from .globals import session +from .signals import message_flashed + +if t.TYPE_CHECKING: + from .wrappers import Response + + +def get_env() -> str: + """Get the environment the app is running in, indicated by the + :envvar:`FLASK_ENV` environment variable. The default is + ``'production'``. + """ + return os.environ.get("FLASK_ENV") or "production" + + +def get_debug_flag() -> bool: + """Get whether debug mode should be enabled for the app, indicated + by the :envvar:`FLASK_DEBUG` environment variable. The default is + ``True`` if :func:`.get_env` returns ``'development'``, or ``False`` + otherwise. + """ + val = os.environ.get("FLASK_DEBUG") + + if not val: + return get_env() == "development" + + return val.lower() not in ("0", "false", "no") + + +def get_load_dotenv(default: bool = True) -> bool: + """Get whether the user has disabled loading dotenv files by setting + :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load the + files. + + :param default: What to return if the env var isn't set. + """ + val = os.environ.get("FLASK_SKIP_DOTENV") + + if not val: + return default + + return val.lower() in ("0", "false", "no") + + +def stream_with_context( + generator_or_function: t.Union[ + t.Iterator[t.AnyStr], t.Callable[..., t.Iterator[t.AnyStr]] + ] +) -> t.Iterator[t.AnyStr]: + """Request contexts disappear when the response is started on the server. + This is done for efficiency reasons and to make it less likely to encounter + memory leaks with badly written WSGI middlewares. The downside is that if + you are using streamed responses, the generator cannot access request bound + information any more. + + This function however can help you keep the context around for longer:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + @stream_with_context + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(generate()) + + Alternatively it can also be used around a specific generator:: + + from flask import stream_with_context, request, Response + + @app.route('/stream') + def streamed_response(): + def generate(): + yield 'Hello ' + yield request.args['name'] + yield '!' + return Response(stream_with_context(generate())) + + .. versionadded:: 0.9 + """ + try: + gen = iter(generator_or_function) # type: ignore + except TypeError: + + def decorator(*args: t.Any, **kwargs: t.Any) -> t.Any: + gen = generator_or_function(*args, **kwargs) # type: ignore + return stream_with_context(gen) + + return update_wrapper(decorator, generator_or_function) # type: ignore + + def generator() -> t.Generator: + ctx = _request_ctx_stack.top + if ctx is None: + raise RuntimeError( + "Attempted to stream with context but " + "there was no context in the first place to keep around." + ) + with ctx: + # Dummy sentinel. Has to be inside the context block or we're + # not actually keeping the context around. + yield None + + # The try/finally is here so that if someone passes a WSGI level + # iterator in we're still running the cleanup logic. Generators + # don't need that because they are closed on their destruction + # automatically. + try: + yield from gen + finally: + if hasattr(gen, "close"): + gen.close() # type: ignore + + # The trick is to start the generator. Then the code execution runs until + # the first dummy None is yielded at which point the context was already + # pushed. This item is discarded. Then when the iteration continues the + # real generator is executed. + wrapped_g = generator() + next(wrapped_g) + return wrapped_g + + +def make_response(*args: t.Any) -> "Response": + """Sometimes it is necessary to set additional headers in a view. Because + views do not have to return response objects but can return a value that + is converted into a response object by Flask itself, it becomes tricky to + add headers to it. This function can be called instead of using a return + and you will get a response object which you can use to attach headers. + + If view looked like this and you want to add a new header:: + + def index(): + return render_template('index.html', foo=42) + + You can now do something like this:: + + def index(): + response = make_response(render_template('index.html', foo=42)) + response.headers['X-Parachutes'] = 'parachutes are cool' + return response + + This function accepts the very same arguments you can return from a + view function. This for example creates a response with a 404 error + code:: + + response = make_response(render_template('not_found.html'), 404) + + The other use case of this function is to force the return value of a + view function into a response which is helpful with view + decorators:: + + response = make_response(view_function()) + response.headers['X-Parachutes'] = 'parachutes are cool' + + Internally this function does the following things: + + - if no arguments are passed, it creates a new response argument + - if one argument is passed, :meth:`flask.Flask.make_response` + is invoked with it. + - if more than one argument is passed, the arguments are passed + to the :meth:`flask.Flask.make_response` function as tuple. + + .. versionadded:: 0.6 + """ + if not args: + return current_app.response_class() + if len(args) == 1: + args = args[0] + return current_app.make_response(args) + + +def url_for(endpoint: str, **values: t.Any) -> str: + """Generates a URL to the given endpoint with the method provided. + + Variable arguments that are unknown to the target endpoint are appended + to the generated URL as query arguments. If the value of a query argument + is ``None``, the whole pair is skipped. In case blueprints are active + you can shortcut references to the same blueprint by prefixing the + local endpoint with a dot (``.``). + + This will reference the index function local to the current blueprint:: + + url_for('.index') + + See :ref:`url-building`. + + Configuration values ``APPLICATION_ROOT`` and ``SERVER_NAME`` are only used when + generating URLs outside of a request context. + + To integrate applications, :class:`Flask` has a hook to intercept URL build + errors through :attr:`Flask.url_build_error_handlers`. The `url_for` + function results in a :exc:`~werkzeug.routing.BuildError` when the current + app does not have a URL for the given endpoint and values. When it does, the + :data:`~flask.current_app` calls its :attr:`~Flask.url_build_error_handlers` if + it is not ``None``, which can return a string to use as the result of + `url_for` (instead of `url_for`'s default to raise the + :exc:`~werkzeug.routing.BuildError` exception) or re-raise the exception. + An example:: + + def external_url_handler(error, endpoint, values): + "Looks up an external URL when `url_for` cannot build a URL." + # This is an example of hooking the build_error_handler. + # Here, lookup_url is some utility function you've built + # which looks up the endpoint in some external URL registry. + url = lookup_url(endpoint, **values) + if url is None: + # External lookup did not have a URL. + # Re-raise the BuildError, in context of original traceback. + exc_type, exc_value, tb = sys.exc_info() + if exc_value is error: + raise exc_type(exc_value).with_traceback(tb) + else: + raise error + # url_for will use this result, instead of raising BuildError. + return url + + app.url_build_error_handlers.append(external_url_handler) + + Here, `error` is the instance of :exc:`~werkzeug.routing.BuildError`, and + `endpoint` and `values` are the arguments passed into `url_for`. Note + that this is for building URLs outside the current application, and not for + handling 404 NotFound errors. + + .. versionadded:: 0.10 + The `_scheme` parameter was added. + + .. versionadded:: 0.9 + The `_anchor` and `_method` parameters were added. + + .. versionadded:: 0.9 + Calls :meth:`Flask.handle_build_error` on + :exc:`~werkzeug.routing.BuildError`. + + :param endpoint: the endpoint of the URL (name of the function) + :param values: the variable arguments of the URL rule + :param _external: if set to ``True``, an absolute URL is generated. Server + address can be changed via ``SERVER_NAME`` configuration variable which + falls back to the `Host` header, then to the IP and port of the request. + :param _scheme: a string specifying the desired URL scheme. The `_external` + parameter must be set to ``True`` or a :exc:`ValueError` is raised. The default + behavior uses the same scheme as the current request, or + :data:`PREFERRED_URL_SCHEME` if no request context is available. + This also can be set to an empty string to build protocol-relative + URLs. + :param _anchor: if provided this is added as anchor to the URL. + :param _method: if provided this explicitly specifies an HTTP method. + """ + appctx = _app_ctx_stack.top + reqctx = _request_ctx_stack.top + + if appctx is None: + raise RuntimeError( + "Attempted to generate a URL without the application context being" + " pushed. This has to be executed when application context is" + " available." + ) + + # If request specific information is available we have some extra + # features that support "relative" URLs. + if reqctx is not None: + url_adapter = reqctx.url_adapter + blueprint_name = request.blueprint + + if endpoint[:1] == ".": + if blueprint_name is not None: + endpoint = f"{blueprint_name}{endpoint}" + else: + endpoint = endpoint[1:] + + external = values.pop("_external", False) + + # Otherwise go with the url adapter from the appctx and make + # the URLs external by default. + else: + url_adapter = appctx.url_adapter + + if url_adapter is None: + raise RuntimeError( + "Application was not able to create a URL adapter for request" + " independent URL generation. You might be able to fix this by" + " setting the SERVER_NAME config variable." + ) + + external = values.pop("_external", True) + + anchor = values.pop("_anchor", None) + method = values.pop("_method", None) + scheme = values.pop("_scheme", None) + appctx.app.inject_url_defaults(endpoint, values) + + # This is not the best way to deal with this but currently the + # underlying Werkzeug router does not support overriding the scheme on + # a per build call basis. + old_scheme = None + if scheme is not None: + if not external: + raise ValueError("When specifying _scheme, _external must be True") + old_scheme = url_adapter.url_scheme + url_adapter.url_scheme = scheme + + try: + try: + rv = url_adapter.build( + endpoint, values, method=method, force_external=external + ) + finally: + if old_scheme is not None: + url_adapter.url_scheme = old_scheme + except BuildError as error: + # We need to inject the values again so that the app callback can + # deal with that sort of stuff. + values["_external"] = external + values["_anchor"] = anchor + values["_method"] = method + values["_scheme"] = scheme + return appctx.app.handle_url_build_error(error, endpoint, values) + + if anchor is not None: + rv += f"#{url_quote(anchor)}" + return rv + + +def get_template_attribute(template_name: str, attribute: str) -> t.Any: + """Loads a macro (or variable) a template exports. This can be used to + invoke a macro from within Python code. If you for example have a + template named :file:`_cider.html` with the following contents: + + .. sourcecode:: html+jinja + + {% macro hello(name) %}Hello {{ name }}!{% endmacro %} + + You can access this from Python code like this:: + + hello = get_template_attribute('_cider.html', 'hello') + return hello('World') + + .. versionadded:: 0.2 + + :param template_name: the name of the template + :param attribute: the name of the variable of macro to access + """ + return getattr(current_app.jinja_env.get_template(template_name).module, attribute) + + +def flash(message: str, category: str = "message") -> None: + """Flashes a message to the next request. In order to remove the + flashed message from the session and to display it to the user, + the template has to call :func:`get_flashed_messages`. + + .. versionchanged:: 0.3 + `category` parameter added. + + :param message: the message to be flashed. + :param category: the category for the message. The following values + are recommended: ``'message'`` for any kind of message, + ``'error'`` for errors, ``'info'`` for information + messages and ``'warning'`` for warnings. However any + kind of string can be used as category. + """ + # Original implementation: + # + # session.setdefault('_flashes', []).append((category, message)) + # + # This assumed that changes made to mutable structures in the session are + # always in sync with the session object, which is not true for session + # implementations that use external storage for keeping their keys/values. + flashes = session.get("_flashes", []) + flashes.append((category, message)) + session["_flashes"] = flashes + message_flashed.send( + current_app._get_current_object(), # type: ignore + message=message, + category=category, + ) + + +def get_flashed_messages( + with_categories: bool = False, category_filter: t.Iterable[str] = () +) -> t.Union[t.List[str], t.List[t.Tuple[str, str]]]: + """Pulls all flashed messages from the session and returns them. + Further calls in the same request to the function will return + the same messages. By default just the messages are returned, + but when `with_categories` is set to ``True``, the return value will + be a list of tuples in the form ``(category, message)`` instead. + + Filter the flashed messages to one or more categories by providing those + categories in `category_filter`. This allows rendering categories in + separate html blocks. The `with_categories` and `category_filter` + arguments are distinct: + + * `with_categories` controls whether categories are returned with message + text (``True`` gives a tuple, where ``False`` gives just the message text). + * `category_filter` filters the messages down to only those matching the + provided categories. + + See :doc:`/patterns/flashing` for examples. + + .. versionchanged:: 0.3 + `with_categories` parameter added. + + .. versionchanged:: 0.9 + `category_filter` parameter added. + + :param with_categories: set to ``True`` to also receive categories. + :param category_filter: filter of categories to limit return values. Only + categories in the list will be returned. + """ + flashes = _request_ctx_stack.top.flashes + if flashes is None: + _request_ctx_stack.top.flashes = flashes = ( + session.pop("_flashes") if "_flashes" in session else [] + ) + if category_filter: + flashes = list(filter(lambda f: f[0] in category_filter, flashes)) + if not with_categories: + return [x[1] for x in flashes] + return flashes + + +def _prepare_send_file_kwargs( + download_name: t.Optional[str] = None, + attachment_filename: t.Optional[str] = None, + etag: t.Optional[t.Union[bool, str]] = None, + add_etags: t.Optional[t.Union[bool]] = None, + max_age: t.Optional[ + t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] + ] = None, + cache_timeout: t.Optional[int] = None, + **kwargs: t.Any, +) -> t.Dict[str, t.Any]: + if attachment_filename is not None: + warnings.warn( + "The 'attachment_filename' parameter has been renamed to" + " 'download_name'. The old name will be removed in Flask" + " 2.1.", + DeprecationWarning, + stacklevel=3, + ) + download_name = attachment_filename + + if cache_timeout is not None: + warnings.warn( + "The 'cache_timeout' parameter has been renamed to" + " 'max_age'. The old name will be removed in Flask 2.1.", + DeprecationWarning, + stacklevel=3, + ) + max_age = cache_timeout + + if add_etags is not None: + warnings.warn( + "The 'add_etags' parameter has been renamed to 'etag'. The" + " old name will be removed in Flask 2.1.", + DeprecationWarning, + stacklevel=3, + ) + etag = add_etags + + if max_age is None: + max_age = current_app.get_send_file_max_age + + kwargs.update( + environ=request.environ, + download_name=download_name, + etag=etag, + max_age=max_age, + use_x_sendfile=current_app.use_x_sendfile, + response_class=current_app.response_class, + _root_path=current_app.root_path, # type: ignore + ) + return kwargs + + +def send_file( + path_or_file: t.Union[os.PathLike, str, t.BinaryIO], + mimetype: t.Optional[str] = None, + as_attachment: bool = False, + download_name: t.Optional[str] = None, + attachment_filename: t.Optional[str] = None, + conditional: bool = True, + etag: t.Union[bool, str] = True, + add_etags: t.Optional[bool] = None, + last_modified: t.Optional[t.Union[datetime, int, float]] = None, + max_age: t.Optional[ + t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] + ] = None, + cache_timeout: t.Optional[int] = None, +): + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. Use :func:`send_from_directory` to safely serve + user-requested paths from within a directory. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, configuring Flask with + ``USE_X_SENDFILE = True`` will tell the server to send the given + path, which is much more efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + + .. versionchanged:: 2.0 + ``download_name`` replaces the ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces the ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces the ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + Passing a file-like object that inherits from + :class:`~io.TextIOBase` will raise a :exc:`ValueError` rather + than sending an empty file. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionchanged:: 1.1 + ``filename`` may be a :class:`~os.PathLike` object. + + .. versionchanged:: 1.1 + Passing a :class:`~io.BytesIO` object supports range requests. + + .. versionchanged:: 1.0.3 + Filenames are encoded with ASCII instead of Latin-1 for broader + compatibility with WSGI servers. + + .. versionchanged:: 1.0 + UTF-8 filenames as specified in :rfc:`2231` are supported. + + .. versionchanged:: 0.12 + The filename is no longer automatically inferred from file + objects. If you want to use automatic MIME and etag support, + pass a filename via ``filename_or_fp`` or + ``attachment_filename``. + + .. versionchanged:: 0.12 + ``attachment_filename`` is preferred over ``filename`` for MIME + detection. + + .. versionchanged:: 0.9 + ``cache_timeout`` defaults to + :meth:`Flask.get_send_file_max_age`. + + .. versionchanged:: 0.7 + MIME guessing and etag support for file-like objects was + deprecated because it was unreliable. Pass a filename if you are + able to, otherwise attach an etag yourself. + + .. versionchanged:: 0.5 + The ``add_etags``, ``cache_timeout`` and ``conditional`` + parameters were added. The default behavior is to add etags. + + .. versionadded:: 0.2 + """ + return werkzeug.utils.send_file( + **_prepare_send_file_kwargs( + path_or_file=path_or_file, + environ=request.environ, + mimetype=mimetype, + as_attachment=as_attachment, + download_name=download_name, + attachment_filename=attachment_filename, + conditional=conditional, + etag=etag, + add_etags=add_etags, + last_modified=last_modified, + max_age=max_age, + cache_timeout=cache_timeout, + ) + ) + + +def safe_join(directory: str, *pathnames: str) -> str: + """Safely join zero or more untrusted path components to a base + directory to avoid escaping the base directory. + + :param directory: The trusted base directory. + :param pathnames: The untrusted path components relative to the + base directory. + :return: A safe path, otherwise ``None``. + """ + warnings.warn( + "'flask.helpers.safe_join' is deprecated and will be removed in" + " Flask 2.1. Use 'werkzeug.utils.safe_join' instead.", + DeprecationWarning, + stacklevel=2, + ) + path = werkzeug.utils.safe_join(directory, *pathnames) + + if path is None: + raise NotFound() + + return path + + +def send_from_directory( + directory: t.Union[os.PathLike, str], + path: t.Union[os.PathLike, str], + filename: t.Optional[str] = None, + **kwargs: t.Any, +) -> "Response": + """Send a file from within a directory using :func:`send_file`. + + .. code-block:: python + + @app.route("/uploads/") + def download_file(name): + return send_from_directory( + app.config['UPLOAD_FOLDER'], name, as_attachment=True + ) + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + raises a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under. + :param path: The path to the file to send, relative to + ``directory``. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionchanged:: 2.0 + ``path`` replaces the ``filename`` parameter. + + .. versionadded:: 2.0 + Moved the implementation to Werkzeug. This is now a wrapper to + pass some Flask-specific arguments. + + .. versionadded:: 0.5 + """ + if filename is not None: + warnings.warn( + "The 'filename' parameter has been renamed to 'path'. The" + " old name will be removed in Flask 2.1.", + DeprecationWarning, + stacklevel=2, + ) + path = filename + + return werkzeug.utils.send_from_directory( # type: ignore + directory, path, **_prepare_send_file_kwargs(**kwargs) + ) + + +def get_root_path(import_name: str) -> str: + """Find the root path of a package, or the path that contains a + module. If it cannot be found, returns the current working + directory. + + Not to be confused with the value returned by :func:`find_package`. + + :meta private: + """ + # Module already imported and has a file attribute. Use that first. + mod = sys.modules.get(import_name) + + if mod is not None and hasattr(mod, "__file__"): + return os.path.dirname(os.path.abspath(mod.__file__)) + + # Next attempt: check the loader. + loader = pkgutil.get_loader(import_name) + + # Loader does not exist or we're referring to an unloaded main + # module or a main module without path (interactive sessions), go + # with the current working directory. + if loader is None or import_name == "__main__": + return os.getcwd() + + if hasattr(loader, "get_filename"): + filepath = loader.get_filename(import_name) # type: ignore + else: + # Fall back to imports. + __import__(import_name) + mod = sys.modules[import_name] + filepath = getattr(mod, "__file__", None) + + # If we don't have a file path it might be because it is a + # namespace package. In this case pick the root path from the + # first module that is contained in the package. + if filepath is None: + raise RuntimeError( + "No root path can be found for the provided module" + f" {import_name!r}. This can happen because the module" + " came from an import hook that does not provide file" + " name information or because it's a namespace package." + " In this case the root path needs to be explicitly" + " provided." + ) + + # filepath is import_name.py for a module, or __init__.py for a package. + return os.path.dirname(os.path.abspath(filepath)) + + +class locked_cached_property(werkzeug.utils.cached_property): + """A :func:`property` that is only evaluated once. Like + :class:`werkzeug.utils.cached_property` except access uses a lock + for thread safety. + + .. versionchanged:: 2.0 + Inherits from Werkzeug's ``cached_property`` (and ``property``). + """ + + def __init__( + self, + fget: t.Callable[[t.Any], t.Any], + name: t.Optional[str] = None, + doc: t.Optional[str] = None, + ) -> None: + super().__init__(fget, name=name, doc=doc) + self.lock = RLock() + + def __get__(self, obj: object, type: type = None) -> t.Any: # type: ignore + if obj is None: + return self + + with self.lock: + return super().__get__(obj, type=type) + + def __set__(self, obj: object, value: t.Any) -> None: + with self.lock: + super().__set__(obj, value) + + def __delete__(self, obj: object) -> None: + with self.lock: + super().__delete__(obj) + + +def total_seconds(td: timedelta) -> int: + """Returns the total seconds from a timedelta object. + + :param timedelta td: the timedelta to be converted in seconds + + :returns: number of seconds + :rtype: int + + .. deprecated:: 2.0 + Will be removed in Flask 2.1. Use + :meth:`timedelta.total_seconds` instead. + """ + warnings.warn( + "'total_seconds' is deprecated and will be removed in Flask" + " 2.1. Use 'timedelta.total_seconds' instead.", + DeprecationWarning, + stacklevel=2, + ) + return td.days * 60 * 60 * 24 + td.seconds + + +def is_ip(value: str) -> bool: + """Determine if the given string is an IP address. + + :param value: value to check + :type value: str + + :return: True if string is an IP address + :rtype: bool + """ + for family in (socket.AF_INET, socket.AF_INET6): + try: + socket.inet_pton(family, value) + except OSError: + pass + else: + return True + + return False + + +@lru_cache(maxsize=None) +def _split_blueprint_path(name: str) -> t.List[str]: + out: t.List[str] = [name] + + if "." in name: + out.extend(_split_blueprint_path(name.rpartition(".")[0])) + + return out diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__init__.py new file mode 100644 index 00000000..10d5123a --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/flask/json/__init__.py @@ -0,0 +1,357 @@ +import decimal +import io +import json as _json +import typing as t +import uuid +import warnings +from datetime import date + +from jinja2.utils import htmlsafe_json_dumps as _jinja_htmlsafe_dumps +from werkzeug.http import http_date + +from ..globals import current_app +from ..globals import request + +if t.TYPE_CHECKING: + from ..app import Flask + from ..wrappers import Response + +try: + import dataclasses +except ImportError: + # Python < 3.7 + dataclasses = None # type: ignore + + +class JSONEncoder(_json.JSONEncoder): + """The default JSON encoder. Handles extra types compared to the + built-in :class:`json.JSONEncoder`. + + - :class:`datetime.datetime` and :class:`datetime.date` are + serialized to :rfc:`822` strings. This is the same as the HTTP + date format. + - :class:`uuid.UUID` is serialized to a string. + - :class:`dataclasses.dataclass` is passed to + :func:`dataclasses.asdict`. + - :class:`~markupsafe.Markup` (or any object with a ``__html__`` + method) will call the ``__html__`` method to get a string. + + Assign a subclass of this to :attr:`flask.Flask.json_encoder` or + :attr:`flask.Blueprint.json_encoder` to override the default. + """ + + def default(self, o: t.Any) -> t.Any: + """Convert ``o`` to a JSON serializable type. See + :meth:`json.JSONEncoder.default`. Python does not support + overriding how basic types like ``str`` or ``list`` are + serialized, they are handled before this method. + """ + if isinstance(o, date): + return http_date(o) + if isinstance(o, (decimal.Decimal, uuid.UUID)): + return str(o) + if dataclasses and dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + if hasattr(o, "__html__"): + return str(o.__html__()) + return super().default(o) + + +class JSONDecoder(_json.JSONDecoder): + """The default JSON decoder. + + This does not change any behavior from the built-in + :class:`json.JSONDecoder`. + + Assign a subclass of this to :attr:`flask.Flask.json_decoder` or + :attr:`flask.Blueprint.json_decoder` to override the default. + """ + + +def _dump_arg_defaults( + kwargs: t.Dict[str, t.Any], app: t.Optional["Flask"] = None +) -> None: + """Inject default arguments for dump functions.""" + if app is None: + app = current_app + + if app: + cls = app.json_encoder + bp = app.blueprints.get(request.blueprint) if request else None # type: ignore + if bp is not None and bp.json_encoder is not None: + cls = bp.json_encoder + + kwargs.setdefault("cls", cls) + kwargs.setdefault("ensure_ascii", app.config["JSON_AS_ASCII"]) + kwargs.setdefault("sort_keys", app.config["JSON_SORT_KEYS"]) + else: + kwargs.setdefault("sort_keys", True) + kwargs.setdefault("cls", JSONEncoder) + + +def _load_arg_defaults( + kwargs: t.Dict[str, t.Any], app: t.Optional["Flask"] = None +) -> None: + """Inject default arguments for load functions.""" + if app is None: + app = current_app + + if app: + cls = app.json_decoder + bp = app.blueprints.get(request.blueprint) if request else None # type: ignore + if bp is not None and bp.json_decoder is not None: + cls = bp.json_decoder + + kwargs.setdefault("cls", cls) + else: + kwargs.setdefault("cls", JSONDecoder) + + +def dumps(obj: t.Any, app: t.Optional["Flask"] = None, **kwargs: t.Any) -> str: + """Serialize an object to a string of JSON. + + Takes the same arguments as the built-in :func:`json.dumps`, with + some defaults from application configuration. + + :param obj: Object to serialize to JSON. + :param app: Use this app's config instead of the active app context + or defaults. + :param kwargs: Extra arguments passed to :func:`json.dumps`. + + .. versionchanged:: 2.0.2 + :class:`decimal.Decimal` is supported by converting to a string. + + .. versionchanged:: 2.0 + ``encoding`` is deprecated and will be removed in Flask 2.1. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _dump_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + rv = _json.dumps(obj, **kwargs) + + if encoding is not None: + warnings.warn( + "'encoding' is deprecated and will be removed in Flask 2.1.", + DeprecationWarning, + stacklevel=2, + ) + + if isinstance(rv, str): + return rv.encode(encoding) # type: ignore + + return rv + + +def dump( + obj: t.Any, fp: t.IO[str], app: t.Optional["Flask"] = None, **kwargs: t.Any +) -> None: + """Serialize an object to JSON written to a file object. + + Takes the same arguments as the built-in :func:`json.dump`, with + some defaults from application configuration. + + :param obj: Object to serialize to JSON. + :param fp: File object to write JSON to. + :param app: Use this app's config instead of the active app context + or defaults. + :param kwargs: Extra arguments passed to :func:`json.dump`. + + .. versionchanged:: 2.0 + Writing to a binary file, and the ``encoding`` argument, is + deprecated and will be removed in Flask 2.1. + """ + _dump_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + show_warning = encoding is not None + + try: + fp.write("") + except TypeError: + show_warning = True + fp = io.TextIOWrapper(fp, encoding or "utf-8") # type: ignore + + if show_warning: + warnings.warn( + "Writing to a binary file, and the 'encoding' argument, is" + " deprecated and will be removed in Flask 2.1.", + DeprecationWarning, + stacklevel=2, + ) + + _json.dump(obj, fp, **kwargs) + + +def loads(s: str, app: t.Optional["Flask"] = None, **kwargs: t.Any) -> t.Any: + """Deserialize an object from a string of JSON. + + Takes the same arguments as the built-in :func:`json.loads`, with + some defaults from application configuration. + + :param s: JSON string to deserialize. + :param app: Use this app's config instead of the active app context + or defaults. + :param kwargs: Extra arguments passed to :func:`json.loads`. + + .. versionchanged:: 2.0 + ``encoding`` is deprecated and will be removed in Flask 2.1. The + data must be a string or UTF-8 bytes. + + .. versionchanged:: 1.0.3 + ``app`` can be passed directly, rather than requiring an app + context for configuration. + """ + _load_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + + if encoding is not None: + warnings.warn( + "'encoding' is deprecated and will be removed in Flask 2.1." + " The data must be a string or UTF-8 bytes.", + DeprecationWarning, + stacklevel=2, + ) + + if isinstance(s, bytes): + s = s.decode(encoding) + + return _json.loads(s, **kwargs) + + +def load(fp: t.IO[str], app: t.Optional["Flask"] = None, **kwargs: t.Any) -> t.Any: + """Deserialize an object from JSON read from a file object. + + Takes the same arguments as the built-in :func:`json.load`, with + some defaults from application configuration. + + :param fp: File object to read JSON from. + :param app: Use this app's config instead of the active app context + or defaults. + :param kwargs: Extra arguments passed to :func:`json.load`. + + .. versionchanged:: 2.0 + ``encoding`` is deprecated and will be removed in Flask 2.1. The + file must be text mode, or binary mode with UTF-8 bytes. + """ + _load_arg_defaults(kwargs, app=app) + encoding = kwargs.pop("encoding", None) + + if encoding is not None: + warnings.warn( + "'encoding' is deprecated and will be removed in Flask 2.1." + " The file must be text mode, or binary mode with UTF-8" + " bytes.", + DeprecationWarning, + stacklevel=2, + ) + + if isinstance(fp.read(0), bytes): + fp = io.TextIOWrapper(fp, encoding) # type: ignore + + return _json.load(fp, **kwargs) + + +def htmlsafe_dumps(obj: t.Any, **kwargs: t.Any) -> str: + """Serialize an object to a string of JSON with :func:`dumps`, then + replace HTML-unsafe characters with Unicode escapes and mark the + result safe with :class:`~markupsafe.Markup`. + + This is available in templates as the ``|tojson`` filter. + + The returned string is safe to render in HTML documents and + ``') + # => <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/Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 00000000..0d12584b --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/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/Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/html5parser.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 00000000..d06784f3 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2795 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types + +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 = {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.tokenizer: + 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 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 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 = {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] + info = {"type": type_names[token['type']]} + 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 + """ + __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache") + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + self.__startTagCache = {} + self.__endTagCache = {} + + 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): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__startTagCache: + func = self.__startTagCache[name] + else: + func = self.__startTagCache[name] = self.startTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__startTagCache) > len(self.startTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__startTagCache.pop(next(iter(self.__startTagCache))) + return func(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): + # Note the caching is done here rather than BoundMethodDispatcher as doing it there + # requires a circular reference to the Phase, and this ends up with a significant + # (CPython 2.7, 3.8) GC cost when parsing many short inputs + name = token["name"] + # In Py2, using `in` is quicker in general than try/except KeyError + # In Py3, `in` is quicker when there are few cache hits (typically short inputs) + if name in self.__endTagCache: + func = self.__endTagCache[name] + else: + func = self.__endTagCache[name] = self.endTagHandler[name] + # bound the cache size in case we get loads of unknown tags + while len(self.__endTagCache) > len(self.endTagHandler) * 1.1: + # this makes the eviction policy random on Py < 3.7 and FIFO >= 3.7 + self.__endTagCache.pop(next(iter(self.__endTagCache))) + return func(token) + + class InitialPhase(Phase): + __slots__ = tuple() + + 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): + __slots__ = tuple() + + # 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): + __slots__ = tuple() + + 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"]}) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), endTagImplyHead) + ]) + endTagHandler.default = endTagOther + + class InHeadPhase(Phase): + __slots__ = tuple() + + # 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")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("title", startTagTitle), + (("noframes", "style"), startTagNoFramesStyle), + ("noscript", startTagNoscript), + ("script", startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + startTagBaseLinkCommand), + ("meta", startTagMeta), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("head", endTagHead), + (("br", "html", "body"), endTagHtmlBodyBr) + ]) + endTagHandler.default = endTagOther + + class InHeadNoscriptPhase(Phase): + __slots__ = tuple() + + 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")) + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), startTagBaseLinkCommand), + (("head", "noscript"), startTagHeadNoscript), + ]) + startTagHandler.default = startTagOther + + endTagHandler = _utils.MethodDispatcher([ + ("noscript", endTagNoscript), + ("br", endTagBr), + ]) + endTagHandler.default = endTagOther + + class AfterHeadPhase(Phase): + __slots__ = tuple() + + 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 + + startTagHandler = _utils.MethodDispatcher([ + ("html", startTagHtml), + ("body", startTagBody), + ("frameset", startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + startTagFromHead), + ("head", startTagHead) + ]) + startTagHandler.default = startTagOther + endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + endTagHtmlBodyBr)]) + endTagHandler.default = endTagOther + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + __slots__ = ("processSpaceCharacters",) + + def __init__(self, *args, **kwargs): + super(InBodyPhase, self).__init__(*args, **kwargs) + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + 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 
    +

Charset Detection, for Everyone 👋

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

Interactive Console

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

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

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

{title if title else ''}

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

    {description}

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

    {escape(self.name)}

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

    WSGI Information

    +

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

    Python Interpreter

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

    WSGI Environment

    + %(wsgi_env)s
    +

    Installed Eggs

    +

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

      %(python_eggs)s
    +

    System Path

    +

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

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

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

    foo bar

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

    <foo>

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

    Redirecting...

    \n" + "

    You should be redirected automatically to target URL: " + f'{display_location}. If' + " not click the link.", + code, + mimetype="text/html", + ) + response.headers["Location"] = location + return response + + +def append_slash_redirect(environ: "WSGIEnvironment", code: int = 301) -> "Response": + """Redirects to the same URL but with a slash appended. The behavior + of this function is undefined if the path ends with a slash already. + + :param environ: the WSGI environment for the request that triggers + the redirect. + :param code: the status code for the redirect. + """ + new_path = environ["PATH_INFO"].strip("/") + "/" + query_string = environ.get("QUERY_STRING") + if query_string: + new_path += f"?{query_string}" + return redirect(new_path, code) + + +def send_file( + path_or_file: t.Union[os.PathLike, str, t.IO[bytes]], + environ: "WSGIEnvironment", + mimetype: t.Optional[str] = None, + as_attachment: bool = False, + download_name: t.Optional[str] = None, + conditional: bool = True, + etag: t.Union[bool, str] = True, + last_modified: t.Optional[t.Union[datetime, int, float]] = None, + max_age: t.Optional[ + t.Union[int, t.Callable[[t.Optional[str]], t.Optional[int]]] + ] = None, + use_x_sendfile: bool = False, + response_class: t.Optional[t.Type["Response"]] = None, + _root_path: t.Optional[t.Union[os.PathLike, str]] = None, +) -> "Response": + """Send the contents of a file to the client. + + The first argument can be a file path or a file-like object. Paths + are preferred in most cases because Werkzeug can manage the file and + get extra information from the path. Passing a file-like object + requires that the file is opened in binary mode, and is mostly + useful when building a file in memory with :class:`io.BytesIO`. + + Never pass file paths provided by a user. The path is assumed to be + trusted, so a user could craft a path to access a file you didn't + intend. + + If the WSGI server sets a ``file_wrapper`` in ``environ``, it is + used, otherwise Werkzeug's built-in wrapper is used. Alternatively, + if the HTTP server supports ``X-Sendfile``, ``use_x_sendfile=True`` + will tell the server to send the given path, which is much more + efficient than reading it in Python. + + :param path_or_file: The path to the file to send, relative to the + current working directory if a relative path is given. + Alternatively, a file-like object opened in binary mode. Make + sure the file pointer is seeked to the start of the data. + :param environ: The WSGI environ for the current request. + :param mimetype: The MIME type to send for the file. If not + provided, it will try to detect it from the file name. + :param as_attachment: Indicate to a browser that it should offer to + save the file instead of displaying it. + :param download_name: The default name browsers will use when saving + the file. Defaults to the passed file name. + :param conditional: Enable conditional and range responses based on + request headers. Requires passing a file path and ``environ``. + :param etag: Calculate an ETag for the file, which requires passing + a file path. Can also be a string to use instead. + :param last_modified: The last modified time to send for the file, + in seconds. If not provided, it will try to detect it from the + file path. + :param max_age: How long the client should cache the file, in + seconds. If set, ``Cache-Control`` will be ``public``, otherwise + it will be ``no-cache`` to prefer conditional caching. + :param use_x_sendfile: Set the ``X-Sendfile`` header to let the + server to efficiently send the file. Requires support from the + HTTP server. Requires passing a file path. + :param response_class: Build the response using this class. Defaults + to :class:`~werkzeug.wrappers.Response`. + :param _root_path: Do not use. For internal use only. Use + :func:`send_from_directory` to safely send files under a path. + + .. versionchanged:: 2.0.2 + ``send_file`` only sets a detected ``Content-Encoding`` if + ``as_attachment`` is disabled. + + .. versionadded:: 2.0 + Adapted from Flask's implementation. + + .. versionchanged:: 2.0 + ``download_name`` replaces Flask's ``attachment_filename`` + parameter. If ``as_attachment=False``, it is passed with + ``Content-Disposition: inline`` instead. + + .. versionchanged:: 2.0 + ``max_age`` replaces Flask's ``cache_timeout`` parameter. + ``conditional`` is enabled and ``max_age`` is not set by + default. + + .. versionchanged:: 2.0 + ``etag`` replaces Flask's ``add_etags`` parameter. It can be a + string to use instead of generating one. + + .. versionchanged:: 2.0 + If an encoding is returned when guessing ``mimetype`` from + ``download_name``, set the ``Content-Encoding`` header. + """ + if response_class is None: + from .wrappers import Response + + response_class = Response + + path: t.Optional[str] = None + file: t.Optional[t.IO[bytes]] = None + size: t.Optional[int] = None + mtime: t.Optional[float] = None + headers = Headers() + + if isinstance(path_or_file, (os.PathLike, str)) or hasattr( + path_or_file, "__fspath__" + ): + path_or_file = t.cast(t.Union[os.PathLike, str], path_or_file) + + # Flask will pass app.root_path, allowing its send_file wrapper + # to not have to deal with paths. + if _root_path is not None: + path = os.path.join(_root_path, path_or_file) + else: + path = os.path.abspath(path_or_file) + + stat = os.stat(path) + size = stat.st_size + mtime = stat.st_mtime + else: + file = path_or_file + + if download_name is None and path is not None: + download_name = os.path.basename(path) + + if mimetype is None: + if download_name is None: + raise TypeError( + "Unable to detect the MIME type because a file name is" + " not available. Either set 'download_name', pass a" + " path instead of a file, or set 'mimetype'." + ) + + mimetype, encoding = mimetypes.guess_type(download_name) + + if mimetype is None: + mimetype = "application/octet-stream" + + # Don't send encoding for attachments, it causes browsers to + # save decompress tar.gz files. + if encoding is not None and not as_attachment: + headers.set("Content-Encoding", encoding) + + if download_name is not None: + try: + download_name.encode("ascii") + except UnicodeEncodeError: + simple = unicodedata.normalize("NFKD", download_name) + simple = simple.encode("ascii", "ignore").decode("ascii") + quoted = url_quote(download_name, safe="") + names = {"filename": simple, "filename*": f"UTF-8''{quoted}"} + else: + names = {"filename": download_name} + + value = "attachment" if as_attachment else "inline" + headers.set("Content-Disposition", value, **names) + elif as_attachment: + raise TypeError( + "No name provided for attachment. Either set" + " 'download_name' or pass a path instead of a file." + ) + + if use_x_sendfile and path is not None: + headers["X-Sendfile"] = path + data = None + else: + if file is None: + file = open(path, "rb") # type: ignore + elif isinstance(file, io.BytesIO): + size = file.getbuffer().nbytes + elif isinstance(file, io.TextIOBase): + raise ValueError("Files must be opened in binary mode or use BytesIO.") + + data = wrap_file(environ, file) + + rv = response_class( + data, mimetype=mimetype, headers=headers, direct_passthrough=True + ) + + if size is not None: + rv.content_length = size + + if last_modified is not None: + rv.last_modified = last_modified # type: ignore + elif mtime is not None: + rv.last_modified = mtime # type: ignore + + rv.cache_control.no_cache = True + + # Flask will pass app.get_send_file_max_age, allowing its send_file + # wrapper to not have to deal with paths. + if callable(max_age): + max_age = max_age(path) + + if max_age is not None: + if max_age > 0: + rv.cache_control.no_cache = None + rv.cache_control.public = True + + rv.cache_control.max_age = max_age + rv.expires = int(time() + max_age) # type: ignore + + if isinstance(etag, str): + rv.set_etag(etag) + elif etag and path is not None: + check = adler32(path.encode("utf-8")) & 0xFFFFFFFF + rv.set_etag(f"{mtime}-{size}-{check}") + + if conditional: + try: + rv = rv.make_conditional(environ, accept_ranges=True, complete_length=size) + except RequestedRangeNotSatisfiable: + if file is not None: + file.close() + + raise + + # Some x-sendfile implementations incorrectly ignore the 304 + # status code and send the file anyway. + if rv.status_code == 304: + rv.headers.pop("x-sendfile", None) + + return rv + + +def send_from_directory( + directory: t.Union[os.PathLike, str], + path: t.Union[os.PathLike, str], + environ: "WSGIEnvironment", + **kwargs: t.Any, +) -> "Response": + """Send a file from within a directory using :func:`send_file`. + + This is a secure way to serve files from a folder, such as static + files or uploads. Uses :func:`~werkzeug.security.safe_join` to + ensure the path coming from the client is not maliciously crafted to + point outside the specified directory. + + If the final path does not point to an existing regular file, + returns a 404 :exc:`~werkzeug.exceptions.NotFound` error. + + :param directory: The directory that ``path`` must be located under. + :param path: The path to the file to send, relative to + ``directory``. + :param environ: The WSGI environ for the current request. + :param kwargs: Arguments to pass to :func:`send_file`. + + .. versionadded:: 2.0 + Adapted from Flask's implementation. + """ + path = safe_join(os.fspath(directory), os.fspath(path)) + + if path is None: + raise NotFound() + + # Flask will pass app.root_path, allowing its send_from_directory + # wrapper to not have to deal with paths. + if "_root_path" in kwargs: + path = os.path.join(kwargs["_root_path"], path) + + try: + if not os.path.isfile(path): + raise NotFound() + except ValueError: + # path contains null byte on Python < 3.8 + raise NotFound() from None + + return send_file(path, environ, **kwargs) + + +def import_string(import_name: str, silent: bool = False) -> t.Any: + """Imports an object based on a string. This is useful if you want to + use import paths as endpoints or something similar. An import path can + be specified either in dotted notation (``xml.sax.saxutils.escape``) + or with a colon as object delimiter (``xml.sax.saxutils:escape``). + + If `silent` is True the return value will be `None` if the import fails. + + :param import_name: the dotted name for the object to import. + :param silent: if set to `True` import errors are ignored and + `None` is returned instead. + :return: imported object + """ + import_name = import_name.replace(":", ".") + try: + try: + __import__(import_name) + except ImportError: + if "." not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit(".", 1) + module = __import__(module_name, globals(), locals(), [obj_name]) + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) from None + + except ImportError as e: + if not silent: + raise ImportStringError(import_name, e).with_traceback( + sys.exc_info()[2] + ) from None + + return None + + +def find_modules( + import_path: str, include_packages: bool = False, recursive: bool = False +) -> t.Iterator[str]: + """Finds all the modules below a package. This can be useful to + automatically import all views / controllers so that their metaclasses / + function decorators have a chance to register themselves on the + application. + + Packages are not returned unless `include_packages` is `True`. This can + also recursively list modules but in that case it will import all the + packages to get the correct load path of that module. + + :param import_path: the dotted name for the package to find child modules. + :param include_packages: set to `True` if packages should be returned, too. + :param recursive: set to `True` if recursion should happen. + :return: generator + """ + module = import_string(import_path) + path = getattr(module, "__path__", None) + if path is None: + raise ValueError(f"{import_path!r} is not a package") + basename = f"{module.__name__}." + for _importer, modname, ispkg in pkgutil.iter_modules(path): + modname = basename + modname + if ispkg: + if include_packages: + yield modname + if recursive: + yield from find_modules(modname, include_packages, True) + else: + yield modname + + +def validate_arguments(func, args, kwargs, drop_extra=True): # type: ignore + """Checks if the function accepts the arguments and keyword arguments. + Returns a new ``(args, kwargs)`` tuple that can safely be passed to + the function without causing a `TypeError` because the function signature + is incompatible. If `drop_extra` is set to `True` (which is the default) + any extra positional or keyword arguments are dropped automatically. + + The exception raised provides three attributes: + + `missing` + A set of argument names that the function expected but where + missing. + + `extra` + A dict of keyword arguments that the function can not handle but + where provided. + + `extra_positional` + A list of values that where given by positional argument but the + function cannot accept. + + This can be useful for decorators that forward user submitted data to + a view function:: + + from werkzeug.utils import ArgumentValidationError, validate_arguments + + def sanitize(f): + def proxy(request): + data = request.values.to_dict() + try: + args, kwargs = validate_arguments(f, (request,), data) + except ArgumentValidationError: + raise BadRequest('The browser failed to transmit all ' + 'the data expected.') + return f(*args, **kwargs) + return proxy + + :param func: the function the validation is performed against. + :param args: a tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :param drop_extra: set to `False` if you don't want extra arguments + to be silently dropped. + :return: tuple in the form ``(args, kwargs)``. + + .. deprecated:: 2.0 + Will be removed in Werkzeug 2.1. Use :func:`inspect.signature` + instead. + """ + warnings.warn( + "'utils.validate_arguments' is deprecated and will be removed" + " in Werkzeug 2.1. Use 'inspect.signature' instead.", + DeprecationWarning, + stacklevel=2, + ) + parser = _parse_signature(func) + args, kwargs, missing, extra, extra_positional = parser(args, kwargs)[:5] + if missing: + raise ArgumentValidationError(tuple(missing)) + elif (extra or extra_positional) and not drop_extra: + raise ArgumentValidationError(None, extra, extra_positional) + return tuple(args), kwargs + + +def bind_arguments(func, args, kwargs): # type: ignore + """Bind the arguments provided into a dict. When passed a function, + a tuple of arguments and a dict of keyword arguments `bind_arguments` + returns a dict of names as the function would see it. This can be useful + to implement a cache decorator that uses the function arguments to build + the cache key based on the values of the arguments. + + :param func: the function the arguments should be bound for. + :param args: tuple of positional arguments. + :param kwargs: a dict of keyword arguments. + :return: a :class:`dict` of bound keyword arguments. + + .. deprecated:: 2.0 + Will be removed in Werkzeug 2.1. Use :meth:`Signature.bind` + instead. + """ + warnings.warn( + "'utils.bind_arguments' is deprecated and will be removed in" + " Werkzeug 2.1. Use 'Signature.bind' instead.", + DeprecationWarning, + stacklevel=2, + ) + ( + args, + kwargs, + missing, + extra, + extra_positional, + arg_spec, + vararg_var, + kwarg_var, + ) = _parse_signature(func)(args, kwargs) + values = {} + for (name, _has_default, _default), value in zip(arg_spec, args): + values[name] = value + if vararg_var is not None: + values[vararg_var] = tuple(extra_positional) + elif extra_positional: + raise TypeError("too many positional arguments") + if kwarg_var is not None: + multikw = set(extra) & {x[0] for x in arg_spec} + if multikw: + raise TypeError( + f"got multiple values for keyword argument {next(iter(multikw))!r}" + ) + values[kwarg_var] = extra + elif extra: + raise TypeError(f"got unexpected keyword argument {next(iter(extra))!r}") + return values + + +class ArgumentValidationError(ValueError): + """Raised if :func:`validate_arguments` fails to validate + + .. deprecated:: 2.0 + Will be removed in Werkzeug 2.1 along with ``utils.bind`` and + ``validate_arguments``. + """ + + def __init__(self, missing=None, extra=None, extra_positional=None): # type: ignore + self.missing = set(missing or ()) + self.extra = extra or {} + self.extra_positional = extra_positional or [] + super().__init__( + "function arguments invalid." + f" ({len(self.missing)} missing," + f" {len(self.extra) + len(self.extra_positional)} additional)" + ) + + +class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" + + #: String in dotted notation that failed to be imported. + import_name: str + #: Wrapped exception. + exception: BaseException + + def __init__(self, import_name: str, exception: BaseException) -> None: + self.import_name = import_name + self.exception = exception + msg = import_name + name = "" + tracked = [] + for part in import_name.replace(":", ".").split("."): + name = f"{name}.{part}" if name else part + imported = import_string(name, silent=True) + if imported: + tracked.append((name, getattr(imported, "__file__", None))) + else: + track = [f"- {n!r} found in {i!r}." for n, i in tracked] + track.append(f"- {name!r} not found.") + track_str = "\n".join(track) + msg = ( + f"import_string() failed for {import_name!r}. Possible reasons" + f" are:\n\n" + "- missing __init__.py in a package;\n" + "- package or module path not included in sys.path;\n" + "- duplicated package or module name taking precedence in" + " sys.path;\n" + "- missing module, class, function or variable;\n\n" + f"Debugged import:\n\n{track_str}\n\n" + f"Original exception:\n\n{type(exception).__name__}: {exception}" + ) + break + + super().__init__(msg) + + def __repr__(self) -> str: + return f"<{type(self).__name__}({self.import_name!r}, {self.exception!r})>" diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__init__.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__init__.py new file mode 100644 index 00000000..eb69a994 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__init__.py @@ -0,0 +1,16 @@ +from .accept import AcceptMixin +from .auth import AuthorizationMixin +from .auth import WWWAuthenticateMixin +from .base_request import BaseRequest +from .base_response import BaseResponse +from .common_descriptors import CommonRequestDescriptorsMixin +from .common_descriptors import CommonResponseDescriptorsMixin +from .etag import ETagRequestMixin +from .etag import ETagResponseMixin +from .request import PlainRequest +from .request import Request as Request +from .request import StreamOnlyMixin +from .response import Response as Response +from .response import ResponseStream +from .response import ResponseStreamMixin +from .user_agent import UserAgentMixin diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0aeeef85edf3f9c41f5a2e09e951f9674f41c0f GIT binary patch literal 907 zcmaKq&2G~`5XbGrNu2m2A5BX*Q01CK+XE*mga{uuzSM#uts+@ldu5jH+V1YUC3y(m zgJ^i0(A=dKfH~*cPogFO>f`J9=+m|i=)UvGa+WB*VW<7>qeg%_Q ziOno-Biq*8VlCcAZNqI~2RViv*5O^$HQZr6?jqN4m-YDo4Gi~yJ>(g7na=|h814gy zC^S4^Lq0+y!yfP$jSc(26Era#usuFSQ^O(fKH4`t1U^6qhDYoUpP?D>_}p4de%Nr8 zgwB&0OXx$aN z8;MYBLv2QSV^BiZ5!P*sF$kY6G1Hsc{EU**wMz2%C}m~J$h;8w2NJ7!p3V7Y4viJ1 zB4S-^u1R)%|Mo4+<4Y(i*Ed95Zb_M*+z4D0M97mUq8U|DbX;sI_aV=d Ql95OHxyeH?zWu-N7Y{A}+yDRo literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/accept.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f7dac6991ca795d0da01cf250b6595dab6379c7 GIT binary patch literal 813 zcmYjP&2AGh5VqHwbSW)=g1g0mC`e5OoInUs35g5z0EbFZkmatY!Kvfj+TMgjy|q$L z@B|#W^uQDF0K9{*ocaoIVVp!&Mw;==j`htqpI2^gZxXcMzvl8MCFD;k){SBD8r?s{ zpopS|^y%Wv`q^8eGR4k`VrN;ODf*Fg^DDeZ_RAF4EngM>F($CU=x4x2d2&Tn_MKgj zBdVCn&$s%m3zCz58}VB4=3ZGs9p39N+U|E*%%vOp*gl>vPY0oKwnXmNmN>W2Z=?H1 z7y=nlMMIX@er1#dc1A||Db?gO`$4}^ikl_w`*Yt}o7Umla|N}7QU*|5TE(Z@7=8%c z!MK{>H*NU=xZ^oAL;ke)q{llS;G_W`I^0%MY?r1{;Cc8A{HU>I(3O=&hZ$EIaf6xl zt}>+9rE${-SsojhfWfs3+|O!@tL7<-_uj0CAi%-06C*L*h; zcPqyrMBEf&T&c#Sd`pOvMw(TJhRF8p519DvkbRVb~lBjXL^61l7cSk lZXVlVR->TqLAq05u0*KX>>@osHzLZWhN zrJmpkICAMT@BqBSUODv@;KEE2Rgu~QLbWtwk4HN*-#4>PS5}q@te-z7>4%VzUuY~Y zxFat?+(S@;2&ze&PWPZ4ye1+L;SmwxVbBi2ibM=n3|1uQdvd>a3SW`!4E5rQ=7xI! z2RV({4rJJiPy`jhxA2(kQW1*isNRl`NkrN;h!<>syWq|Ek7SVgJr zx~kS6&2}q&X-!5Kaw3ozDrF6c*Og;j4 zrb{6m^Lvu*mL@|)saAf>go3zUkDI3fRC+?IW#`kZujNqclekI%rcnkEM|i4MU(E}F z0Iiv;id|VqTP2(;qdezGl9PJZBKH=VfUs9M&vfb>xXJI2;#tRwJlp8%va2O4Y~F(^ zSZ>&0%(8q?lwR6SF&;`YeA0Z{d82kZPI zfw(#-LL(Z40S*4tmL_-4liNHidIEd(WvS2!KBDYZC(mo<`~8yDsH-=TCx zZk+u0skBP~#U`lm^{_WkP3fJoJ>?i1j#uX!zJ5{ZXDzq4G1x_2TL;HYj5zNa+VCRO n{J4OB!QR2|uA)M}MejnGv%;$6`D}__;OpRUCKH;3*Xn-(g1AOc literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/base_request.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a40092f703243bfa42fe29b2de40189c22a88ef GIT binary patch literal 1766 zcmd5+%WfP+6s_v6evD&7Vws0{se};DATr^x0wEMg1RLZ90Yw^(RO;y}k9(%3yHi!| z(OBNuQdVKfDoZx`20nm)s4Xl10SSSGMe6jQNG zAG2X1>3!1gUBFA^;DQ47sZYLD4;y7&j?&E$!r~50`vHJzwGIOnPML}%ebVYaXTumI z2}l@7A{m1ul?iA`{jT^bo2mQFIMjyryoxsONxyF=v0MD-n{zowH!nCge zI5MS@x>nockP;W3Qpe5$(7+B(j`qLItm+)t=Y{1`)kfu+Q<7(;+*4f5rq(hpv0h;Pld0x%y#wjzZm&d9+{&?`o=$m3ZvV~K(YOp4oC_7qoUfo`ptge-@x5p3} zVOF^v)JuOuh_#nF=0b=RblYtJLKzK$fChiW@yR<^(>Azr6%&cE$;wyBZIUv*AOrSn5XsiE>GqK+}uULEUn-=o`q1Z&vv1_0pfof%D-Ga z==XdoM48Q%5PnODc_kZ-|Jy=5Y%<;LQ0Liq%UXFht}1O%qYu9*muByoanGA+pq&u( z*y2x0cYCem3eRyDhkXy=Ii3U8C6&RG@DVwrGL-Cmdl)?;j0|JoU*xZCuy;juL z!P|HQ%hjMdykN13rLv(^EkKy?Fr*-^; zVC)xK?2Zr@cW~N!2%2f0u@P^6y^*Iq?PvZ%j09(2F)eg(#&iI|sXq#F9qJCQJ0Kv` z(GxN1Xnvm!y65;3J3Qxz1MZ@4z?MaBAtCYZ@Nsbmr+ps*8nq)2{F#72^QVpSGcgKL z(m{zpNuWcNM7o1&B6py^jOTE_o+Mdp?cIlv%m{j4H166JE#KY&?LEiz+yEyG@ z2o;-g&8tS+6Q8rnKjD=)^-zO2T+jMn#1>i)`ZBdrLunw1E6_5|wOpoICMO^bEQ({4 zrMY|nX1<1cDnA^4FqGd}kp0xQR^3Q4dsDVA4)Dp`RuJpqIhpp1yFFXQ$vlH&$OeIn zma)mxd}^JbFL!Wnt3ECA2b(Rock#NRm|_ro)MCibXUx2WKfh}I$+*%*a%-B^(+p&3 ziWwx8EONP6$)s46bp>Wzu8tu;{%H8|`0I2swrK^oO0*`Pf*minZrxs*xGcfg+Y^k9 zGTZbH%ayyTRO@F#=};;{<+g{wxZs}WaqssqT)%TUbHhtlDVG$SI8VS(nf^Z#*_w2t zn9Tk*k*0&T8ghIP7$To}fq;TQscP?UQ)OPH%>x2T)CR85Sqx@-b{ovADE_y>{L9tD zLDxk}ZeAvMh2T|!*9jzo+uv$QAj?`! zO)b1lN2p{C>7xsldRfGqHU0&37l1vDnlyIpuv(Sa&^E6VJzUhbkcJXY-~nigsJXvG ai$+_+jp)-&{eDJ?x5TxGM_$jra_tXPiNSXO literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/common_descriptors.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06ccb2efa375567ef2861e473c4aac0f597162fe GIT binary patch literal 1368 zcmb_c&2AGh5Vm(WX(%Z_6>vZ*@~II>P5C*25CTz&3-kboN>L)ytK4PVEy<$ia&;g{6uGd z!5(=I;_ibIL{Lpybo>ok!7CyH5grf`?gy<9yhv2QtAG~?`i|VK9>XcJnV_Cu(bRGG zz>wpNtw4s|2t`m4d<_rD4i%w@4(hGSA&E$<3i&GK%F8TGGxJvN7Sj0*=@P4QpIP@t zeNbleC@iDcc3fHQ4JKbJePK;P=gK3d3dmIuw+hOWE)~=Vh~{%hi4XTlH`=3$>;>QG z7fJy+RF5`CpBm@ZZ!qPUkhzsf?4@9_5p1BeX4{fknPz?1Q-*Cx+Z)NE!yYytG+AQ` zrol`$fN-JzwZv zv7Sb#FT)pRQmoZA~vd7_rlx`_(AjjeHL)acm1KuX^^0q63}IC+ZG7WsNn z1U{S*`0Q%`%iu}2f2Xir08qAu3LhYQ4b`~i;|YxWj(ota(|q^~h#4X5ElhjXOjjUq v9dl1-iatCqRX@z(7qYkU++|c4w-}vEGrMA0dphCRGkjkhlD9@{;g$LyOMGWJ literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/cors.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97fddd4fa61d1298f824f6bbaabe2b7e0ac471d5 GIT binary patch literal 1276 zcmb_c&1w`u5bmCz%@{YD1QiSjeR5H7USJbKA9_yE4cTs`F#^kUV{5SGM)NE)iTs*9St-TQPu)twW+3}Vx_ zWn*_-?MAx7=!DKyL>M8+br5?Olp_NwsPhoOXP*-1ACf_EKvQzyeWPC}1+Y*s=uG!p z=S#L&YMGF^kxA^NV6hf#oGQh(B{OoEjo>WRY)hKmsVw^Jar;r5wd$r@OlM;VC#n$A zGWSWcokAxr&2+3%H(?@$yiQHprylfqLd!+#;$&CJkyIyP839P0YQP(yRj$6N8-WB{ zRj3SYkxNrXoToZCIdApuu#Fx8>w$EB#!1i@Kl$@7~oDVZmD72fL?-jACBh;1tD_xZ+muf_b zREl$R1Bz8@6|I}7kW$2N(TM2Gzr^WWsqol5(^gjFX>jx|YZj;VEY219-(jp${QEST z1;Aki$?xin{8mC^HRcwXRxU~v#58u{0ne*jRhJ}v+N literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/etag.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a22973644c82e5e0e7c23ad5dd60a55cd047aa1 GIT binary patch literal 1276 zcmb_c&1w`u5bmCz%@{YD1QiSjeR5IA#-EcSqM&%uJ*W^^7lz4nXVaVBo=JDlZg$Bn zft>USJbKA9_yE4cTs`F#^kUV{5SGM)NE)iTs*9`Ff){Z5f!u4H!dIk|qMlzt?b!QZ zh*`$2C;UNx!YTK@`p0COa-RoB&2D&10@7_jzOY<={W0mk7kh=U?w#D1x^v=}L1Oy0 zZ0wG!-3V70ozl6A2qOf!4r1?ua%4a`bshrv>{H_WLox^ss3Zs8H~NKA01E|!&UC+Z zzGRC@%ecsmNE0VGOEhO=sTA81%!pw&f-|YvrZBrxQS{lP_QN)7)lIjU&c+ZLe^90I8)0ya8I}>Z`gDNU&Lj z%Fq_MFl7|SQcD-dNRbt4+aT`-d4RN6;y6`_wGbx1KJlkL$Fp?3uZq4BEH~Kzx?q`R z!wE~XVO}_4dii7|^yqQ>N$;)P>RIW;dJerMePMg!8t%r}Bsr9~8^R_1c0MskdIQ8Z zK@l2I&-bYJyRk66eV*F(S<4I9zD|ZBj?2Y39%j5yXgA|{uSirKp|12_>Z(M!R3l1- zQgLizzU|TFAIHm0vc|T!w+EA g@Vl$1Fm5n9m*%XiGI~}G&vSebEDmBsBmY|S4`-1-6aWAK literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/json.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d1c53524fcbb3874b5041a0a888b734351642d3 GIT binary patch literal 805 zcmYjP&2AGh5VpOWu&q*lDsi_s5Cy5JfKw4dAR!?k2ogP13X!bsdK#QM-mUFTNYq;^ z^#l)qICAMT@BqAnublb{hy&v!iZarSXLhV_zHip~&dxSL`~7R4f2V}}iN&TRSiD4c z4=_j~sV058I9Z>)A(F}DlE~zO^%F@CNhiI*d!$#yxM}ICaE~y71xBAiGD@RMD%p?Z zikwiH$n>(+Z(Na-^qYv+2wQItKlI+KFUs^fNl0@$bfI}VU7i+vZB2p9*A^K!(C?tT zhZsB=QAs_ET)!ri_~e3&(sQcFIr~Y!QHr`E^WOZdy`I(P%5e#mg(CMLd2S@1Dy{i3 za0}ydg5Q+kM_^CqP!IW&?&B_Re}uCdoNseePO)9+T7u*LGw_qz6ke4k*UHbhREX>K ztb4O=C%EV0ARN=gA*3t{i#lx4UbvwJbbUB*A}Vv^BC m-AO~!&njG|y&vynF~t4`!U8KIgzWi}%8U4*TwG#Cv*bSq@Y2Zu literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/request.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8de8aaa85d967b5369e45e1d79d6584ffcc79784 GIT binary patch literal 21304 zcmdUXTZ|mXxn6hAWoLJX%O%B|C`xY8lE}5GAtg(ew5D`SEtevX#U)KH&7+azncnH% z-67|)s_x-(2TRAt)H#xoNOlq+0TP{nOimsYAjwnCLk^IK^AhAOFG+w#fCR{spMn5^ zA8a2f-}hHlPwz#Sz`+5s!#!U4?g7oN_hA_ zKJj_iaY83_J5F7HyLDHdy}D<<3-Vp87xC?NO5Jk3>^fl~EOy4am3l?)OP%rVM14Z; z%ebGcPs;rm?yL2x+*feFr@lw-$8kSZpOX6t-0!XLmHWxgba!8UpWIh*zrVg;?)P*a z=^m&bl>4d9q3+@OVY%On`y=%uazEX9w0pFERPOiT{;~RFxOc++onzg{>yNumRJirT zFI_b)^=w5eb9{UyNcVWg&$6nt^qWIF4UwJ6N^MS^CywYxjQL7)e zdn=7F=(Qr0@0;s)m)gB3ygcY6?epzcg2Ji!-krAU_bx_37^xT~lNZ{Z=z7vu!3taL zztrsxl3=M5<(o~nlSnnX1k}K7mkr0W3ZJ^^p)gtw@VXHvDhj%d<)8(S8>lvQp|85< zgCw{bs5nw68M_v}H;7`Qv$qwrR->@7ruu7(&BvP|HjNi>=hg*a!99j?*?eM zUI@KU8`h-W)6p}xPJ}ms?`h24;qc5S z#qhcC`S(khos;tJkMQmVygMlGUbOGRw>a1MSGqM59gYsl?6LKCSp#jK3}2F-UJhT8 zp1y^WStKRhQT&jMpz@_INYB{hr;>kys~=VeT% z@eG;>FNAN%^BMDeF}x(t&za{x41XZc&qv>>zkq(Yo}dV{CrSHmA-%r8f;uy%M26m&gY#Olm`;1r$u_aJfJR#V`J z;A6=0YtfpDVlYkY2R*;tYxTR3G(I`Xzqq(~)mNIMPx1`(f-a_m#jH#O#*Mmj}HT89V5- zlMNrjhl0*u+VJlLs@)&N8m)LOYQ;5w5e-5}AYd+F47Rb~U%C~w62Bc|073X{zt`EQ zO-Pl+=x$=#0F^i%bOAo;`-3?0Z!BJT_GLf9EKuHJ%&YCzsvocR2OXdg`H30;L4z`p zy%WTV-wkf{6_M>P``tc-Z_jUa+MLsxe?!KFskK1;I7&Dgv=(%9O(Htz#ldofk@#0P zFgZOxL}x$@_^KdlAN%culX<5dM)4^>9<){k4yL%-9Jbe*P0UK)Z>s1v5(G^>PZ=1q&^0MA z2(IH2iuHN7uB_X*Ol)yY0K0V9-b4lcCUGvzb-OfCy1r zo+CDWu&oqg&Orqsg&oWWP$?&Qz1`_>8CBHn--$*f3J$z!mK``g_a!4ZQ+qM%{F;?B zA_Lf6L<(=AGZCF_Ykg%H;jIs{kZIS{vXJiY26r3e5iC)o6ZKY-)${<%$SjR6FjX6k zxIK*0LsCNF*8qQlZyGYv^l;dYxgxL@@d`qsrP^z-*wi7&{B+Dvb~Mae+*T17nAKi*H`19QrW|1BaBC@rog$y$B#`rNfkR~H)# z=Pu8uPJR69xy6f(OA8mSq*cJU_EzKi;tPpWQ7^>msi7!~|6JJg3 z)H7SC+@FJ3Nwmr^!cG(J2}3EbE<*bOaxYFm>NUm1r+FSHLF;x0LZvgD-Yza@_NJwH z00$tgG+@`alSU&gz{Xem&{&a-(lMiL(!EweH6jYHI4w&-q{^&I5>-dppaQ|v!=%J% zk$36-^M~~wkJUYZaE=$-Bcq+}P)NTl9b+kn)(^PSo&@4VSwdMAdf^z0hO4c97u$Bz2+x`O0`m^*DI zu(r0LPNUD;_{7iS;*`to1pbv>&pq(DSJ2mKJXijAd8+J9xJ8$x-fzoe6JFV?xWj29 z=W2EWKP{xiKwJ+M8M` zQ>~xx`@KFi9yF~O6sAx1FaTM@Z3nl*V#G*+Dv%0b$fDzA@YFz|uWj~=u}@FViqM{I z&WXX;oB;r+c`+7Z;@8qlDgHUcd}6VTPi2Dzf35ZLhPbr){o6FLqoifj7Lk`(3R17|V%iKXfq2UnZd*5B)cb_W)&H4O=UH`Sh3j1~biWxf8o zzXKQ0G3;>hLPo2IhF=pI-+vu?or?n#T-GN)BEV@H0&DtW%SPa6E)sERVY0D4wnhV{ zfKoKB^JARVN^sUrzoGDK(nJ^{6k&rfW}4Je5Zuww+JsQMSc!xka!OYA9@en51bF& z54`09qk8XG?z{KAr1+o|mNsDoKt_~L*ZMtBlOg&Xftp!C zt!#=(w{Tj(9EMgb`>*%a?bz?MZ)@E(O9yhcnE`KR5Ew@T8eo$p<84@9leDk~hlnx( z-Pqm@lWt>>El7wVxl0>sTgs}AOv_-9^y%}E=r(3&wMPp2l)vxW1{kOHY1Gt6N(O>|`0P0%T-PE*ZaVc~)j!JVs88 z^(V}F_wFXrtiT9&H$ZOzxir0l?@**)xh?A-HiI=$zM&WFy%k6nk_ba-^L@BjuSTR#N#-*nzWt9yl? z6nZdA`F+MY1HH-`p+i_7J2xEfBT?shxxhqF#SA$L8S#`m zJh=<;)y{VMSdjR&S`L5~8Rc|hL?P01IxgJQ?|0&~L_;V}-6Soxz_K%i99ow%+}`9J zMVMmQzr-h|)#4nj!tU8WJ`z~D-e*ebfux@Vo$XFi)jCbd##)qCU@SyEXt{LCmTPB9 zi#cv$*gxLWV4A}xp2j7iXHmeC6+`zU8aiI^-ys9%w4MNUV?7|rw7)J|m;BET{lQwN z57T(WUfMnxKx&zg4H~lMvm&lU_iG~?@+t^V&NNT?atB6<@RSiX-PL9sMYmCy#m>Z3 zfaF^0BQm#+2vj7T!@7jVhb^ceRHj4ue!IKYflGr(jKo(oThV601^{e{KyB#pw5d($ z+hf8rT+D>}dO|5WSKBKvdnm9}*5RniPaL=F^L?Bn8*5llejeOaSUbM)OHx`~95JVN0n*C)xP^5n0pNT&T zf`%*UHpm8z)ls6IzaBWu=gI&9H-rGRFlF44R^`YTHRH0BO^Vm!=_2yOCv65Z8^M|4~Jw0m10kt?ht;w}sQUIf#~PRBM}^jc_$W?igFCO8;lROW-EGl&ONg&8;t zcH1{?Z$m5$#A;h_JzCmEShmhrffEx^a2O2)lJz>cU)|t^PLui(FAQ_cl+;VSm-q5Y zD#`n8#@Mv%XK|=zzwAGuVO+()hDOCQD`oYa&r@fC&&}o717F zXBRtF}5w3D>K`-B; zFAQH-hol~sF`e%4?`yYKdrJ^TCN`=AZ8iTAtQuh0hE2Q8dC~!Nw$Smnd}ywzMSa|d z^Od6e9}i2rsl`(!&{0(4Or2>M)0@v&!}YkuUxpbb4ui3U@-WxH(|fe{I+VXexv(TrUzT^Vtx3@KxL zST6%w8{1C-@kdA~#J-dN7J?it=wp~~h$3i(2JSWDAh#cY&Rg1ZBCTTNRsoE#`r6!H zWSa#9HziddEy*m+OfdMzsc1CR+a$$zaY;+U8tGx30AO+p`bvV?z#^?!WhQdCzSlmo zLePy>gOJ|A1%jK>IV}r7l@__2sT*#m_`MApXCsnF4v7={Xz5HK?B*c^2YN4Sn*Uw7 z!u#@H7b|6Vc-RV?Z4kClJq1%HrH|tQb|j5{?|y+)9(ssTA4_mYi47_ytrmv=Q!GRZ zT@ZwXW#DZxJfg#2+xCVs(h1wk%P3RVgVGMXs zYAQ~ktm=#>3tFGd)!eq2s)fp@xq#v^j8(CCh?RaLTPO}rc)bBx(Af)@8%R0cG> z=0oBGfWS~8M2Zg+8e4A&;N4}0OFO}~^)_DCA;>I9kwLOM z-e7s7XE3c|YFv%;!ihA@DD~1}<94)> zmc-E7zJRR!JuV4RJZgc_%|ny<}!-efMXiP}nZo{0m+xK#EzL`I7e9cB&VD z9m0jCwBA@TswnVpBM!=tJLCe)ybKOS5(R`Ff(3+ZAjIWOy-tFVaqs zqr9Xu&d?H>3u07bBwnL+ZL_gp13K>&-{^@aZu-qA*SLhT~8(U^%NL=&T1DjF&>@bEfk1 zE*1^?kh#z^MhlH;A{nT)KD3G1q-SJC126(Zbc)O%vitOy!amwV9AR}htGlWH(Jua( z+ACQ{pg>ADy8^hAXun2(lqNu804EL@&Y6JSw?myVNuJIUP{N31K}@OrGzAqTtwPzBPFa%FEnaVmN(7*S0YHX$FPPsN@dm zX*aoQcIB)z(6WH?39(0!HZ5*$Ioy{-wKti08+6{j024iW7rWJ^7A>}PEQlKklfDL|6xrO} zuA%@}PZwWgs!4Rtr`j4;>uh|N7Xh=?`%`!DVm-rdY_!R2$5b0m=TKy5;oTjI@=LH# z8|-V?gM@}ZDjDr8#FG{>-o?cxm__y)GJ z)x}M0Kj9s7OvdyEH;E|tj{t7?Jb-OX0$Lh~4NXmEC`l+N<7=Cl*Mo=!Yh<*u#3XIA z0SL+;1yZzFh0v3Agg}#BCT!;}MXLcM7JWuNIzfr566&T)fh<$4lU#BVX#qJbc!Rltq~>B|&ZgKXL5F&CL!`DS zT1=|(T*Vv!mu6$p8XkL5NSfq0F^mx~EA}(qmg$uqWwELJGe{x?O*d?S#a--6tXx~- zAe1|O>@w~IZ}$;1P}D)qZ6ZT2szm7k`6iMEfd>YL{~<*$r@;(H%*YIw4WQ;{0E!c| zr2T#?@NzRLT`TKNWRTbe$IX$kYn`=8I|UCEeZ7dDC*%K^Mzb{Qt9>{oGF^GcMSGVg zwaJ0z0$cAdFpI%VlR-pQO@c9eqxmDlNhi!l;hXlDTb!V^y z{BG0@b-CmXK&jqz63$eLcA&I7l_T({G1x#8#15AiSxm7&V!Mmm}s&%YM_y zY!e}cwFmx{rIzvJmlcW#&K}nf+c8Kq&Ltk|h0H+%|<=Kx0EYk_B_}HD{0PObj8ppyNS{`8IKFCvKzN zG%UAX5y%!J?oni!*fNI})+Uo$%u^$zGa@m@4(L{+yEW`8{EkI7p&HNxoGS}l%-;+U zsA0r;hVA{+S%4(CtGCp790o7dOEpS zYI-O^?K6wzs?hW;XN3s_py|-PT~JRjUlmVvQo8TOXOq$DIvYBFh1hq3MQGOnE?rVE&Jq`+p=drCW2&8D8iu0b_yO%Ko=0+Gl%j1Z-wJu z!ae#*ftQ`x!>)ur{9>31Mp4Edj5BIsK+(rN3<#uosB#~XItmU;5qf*WsC6b%SV1{5 zmzvG9+TWyHd-XV>9rs!F)#Jxs<0%OZSmtF{&_RY)CKJALl(|{7)0>$fJ9Sc%5@xrc4`2MZOeY(so%f?K9uVp6-z>-`IImPw%adVF0+LbGd$8o4B8=-X^5tGHq zB5sBHF;X5^bK`N|ecBY&pe#>AgPf)^ zvq}a@coo~{uA{E-m7B@3uVD@2~2L2)Q zM46x^V`1eCBRz}s+Tdy@IO!OL%st0*W}``}M;0w3R1xEODAJY4uu*r=3qg$NkHi;+ zW0O_-6T`Qexe>wX)NVVr!?k~7%+*|u9?_CfiP1cgk2z@QC3iruHrzMr4g;bOI_&)3 z{pEVlNXKizIzky*4neA#uAl^mdjtVB=ry=OF#NAyzjGtGvZaacMlG1gJof-4L}*lg zf$a?HXgT6Gi1h@Fjupo=FKOm*0vFG4Kn<;mna=Pn4fuSD7{e%}B;7OUMY_%q(jjlg zVjw`-@eaPrTr+N_YS&Bz%D-6zRPo9~{|~QUSujC>Wh-863>98)5BvL)4a0g_*C%If zmDy&FKu+I^`#q#OBB9ZOYR3&JoXJW2IjC_Mt<+F@w_0jwR=1gqHW@tc0+`S&Ywyaf zMZP(XLEB`a%md(y(GE4A7?#B79(9a!BFm8EgXkHjzkiqlw7$0(UMk@B0k z-21mr*!_3oZ{f*{zZL3S0OqoIAG!C6!)cT=f?32SbP37Et3@X%Z~QAH8<&x6d=(MS zyCL2H`adE(Y)p^ct89*KmX_gZG@RaXEZ^8>nXPkmD)+`WOPk}mj-)8N_sTyh_l^J- zz9mJup#B}|7&x0H5I`Y#29tD^hYRg8QN_XjkA)m^OJ!u4U2P~(7+$1POBmAN_n`|d z-ZBWjEX2RyQlV)c9ODjEV$7ORvTgvR{B?z=-fiH5-Naq+hn&@Wz>m)vi z5<4<|L{987gNU7pY>KG8?7mA@Xwx+ry#v(D%FJ^)FfuSHe~=~>)6LE$+!8WpEXQ>C z`4Zs_M5F!$)Sp)75nEe}+i`u&u(s?uq?2T-1~!ogohU6aAtz2Je#E0;a$-3>wEH5> zOz1qpKLu>{0WT83;wFpQ*Je+j)7LakYc;NyrHC}jk;lkp~S>|WZ zJi_tRiH0Fh+*cco_mH1#-i#rOt=~ct+hKI5euzt2xgyyPK_@L>zdqgDXaqfoJ+azi z)Rg4RJ*>{u&9t}(S6NQ6s<&9kv!UsvxF&l2(!#mkhMH$_h2+5;emNbH7T{Q<-lZ#P zNw#1l3pB03f&su}W0Y5?!(S~zr!G=GUKB5Td6BF+o^q&H#d$YLQnFo{mf@#CFs2or zfg^8fo-N(z!Kjdciux&mG=?}VgYToK%A=VQa0{c*&YHbdCl^2G|iEYd9H+F_!odVX2`pA4qy?_Vx zA}`Q8%8FM)G;W8*udyXC9j3e8|Hag2*Q6ID2FL?PS zFMpR8%2xFcc@d}&dAA$K|5LnJVV~px>`zT7mi#~FkLuM9+-Rd+hX3VU7Us$&P;sX{ zV*%Vjor0#fk^hLY{{NwBdW1sNb=+*H>cn9N#xH6v-aIIV#RP|babE(Bm-94!6FDmO zxMOb`#~t6?aon-AFnsSsexmr`N1G*tv0aXtbcQ&ieC(XdV)m5 z{^W=~)IY=gs9jj%Ly{*It}|kZaoCpb@L+zp8Aqr;C!pPk{h#B-PjbXQu2?ejjJm=W zqDlXZcfvdzMd~5v1PvVg;Dya5l;7N_Pf=Jy@|w+3*%i@0v%#OrQ(SbN(o2`NK0#_0 z2SKSSU(ukcPsKqGzvp9r7)dl!eX4OCrI)T4Zb?gn1Rj_+J;drLGR~rZ{ey;a{gG@_ zYh*Dh?l`A=cw(qAcX5912lzde`aW%&Ad411jl9i)Kcf1%X8-^I literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/response.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b2520022a1ea19f2128fcd15b1385add34c307 GIT binary patch literal 29688 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 VOz)whJ9c1f`sZ`$zw*@a{|(=o_GbV9 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-39.pyc b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/__pycache__/user_agent.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4933ba7e9eaa9c68e71124893a8e1c11a062342b GIT binary patch literal 826 zcmY*X&2AGh5VqHwbgA0%BO$I92cjS~6>tI}L?t9H&;tlniXvI=dK#QM-mUFTNYq;^ z^#o7AkxS1Uc>vzQS5AEexG+wlsvT*@GdtEd-+XJixw%fze*c=wpOlb4skm+oi`VG> zAqGVhHKb1$XV%Z&5|t@-Mie{E`b^P}q?=#jJ+fD(c-`_<;U8lH3ygjSY?LQgRAt}U zIXR??sr+oC-#RBb>9-ND6}LWlaJxgW;l2K%?OvC~T)Lr;?W5`PbPyV6OQe5giFOP9 zHoAX=A&?POG-QeJS4K%-r(~3$P)$yRN{ z3_k$wU|db`o3?x(+|eAGA%EI?(&L>EaNK|o9d4^BwoB6}@H~75e%RPD=*mi?!;CA9 zxWUYNml?9`(zxz}ERPIKz~J%)u4uKzZS$1Hdv8`m5MY1ViY?#N;9?sB}8eY_d;Bdzf!#z1XY#WL(>cm@Y+=)WWg)T$1`45m47?7oT_ZO+1V5Or*4>#pS>t%W)8KCs*t4Nm&)f!%ZKL~?5Sr7BWiK?{c8vdtb`DYmrE+I(gX8J&w>{0Khk&HX8-^I literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/accept.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/accept.py new file mode 100644 index 00000000..9605e637 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/accept.py @@ -0,0 +1,14 @@ +import typing as t +import warnings + + +class AcceptMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'AcceptMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/auth.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/auth.py new file mode 100644 index 00000000..da31b7cf --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/auth.py @@ -0,0 +1,26 @@ +import typing as t +import warnings + + +class AuthorizationMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'AuthorizationMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore + + +class WWWAuthenticateMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'WWWAuthenticateMixin' is deprecated and will be removed" + " in Werkzeug 2.1. 'Response' now includes the" + " functionality directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_request.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_request.py new file mode 100644 index 00000000..451989fd --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_request.py @@ -0,0 +1,36 @@ +import typing as t +import warnings + +from .request import Request + + +class _FakeSubclassCheck(type): + def __subclasscheck__(cls, subclass: t.Type) -> bool: + warnings.warn( + "'BaseRequest' is deprecated and will be removed in" + " Werkzeug 2.1. Use 'issubclass(cls, Request)' instead.", + DeprecationWarning, + stacklevel=2, + ) + return issubclass(subclass, Request) + + def __instancecheck__(cls, instance: t.Any) -> bool: + warnings.warn( + "'BaseRequest' is deprecated and will be removed in" + " Werkzeug 2.1. Use 'isinstance(obj, Request)' instead.", + DeprecationWarning, + stacklevel=2, + ) + return isinstance(instance, Request) + + +class BaseRequest(Request, metaclass=_FakeSubclassCheck): + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'BaseRequest' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_response.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_response.py new file mode 100644 index 00000000..3e0dc676 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/base_response.py @@ -0,0 +1,36 @@ +import typing as t +import warnings + +from .response import Response + + +class _FakeSubclassCheck(type): + def __subclasscheck__(cls, subclass: t.Type) -> bool: + warnings.warn( + "'BaseResponse' is deprecated and will be removed in" + " Werkzeug 2.1. Use 'issubclass(cls, Response)' instead.", + DeprecationWarning, + stacklevel=2, + ) + return issubclass(subclass, Response) + + def __instancecheck__(cls, instance: t.Any) -> bool: + warnings.warn( + "'BaseResponse' is deprecated and will be removed in" + " Werkzeug 2.1. Use 'isinstance(obj, Response)' instead.", + DeprecationWarning, + stacklevel=2, + ) + return isinstance(instance, Response) + + +class BaseResponse(Response, metaclass=_FakeSubclassCheck): + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'BaseResponse' is deprecated and will be removed in" + " Werkzeug 2.1. 'Response' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/common_descriptors.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/common_descriptors.py new file mode 100644 index 00000000..db87ea5f --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/common_descriptors.py @@ -0,0 +1,26 @@ +import typing as t +import warnings + + +class CommonRequestDescriptorsMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'CommonRequestDescriptorsMixin' is deprecated and will be" + " removed in Werkzeug 2.1. 'Request' now includes the" + " functionality directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore + + +class CommonResponseDescriptorsMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'CommonResponseDescriptorsMixin' is deprecated and will be" + " removed in Werkzeug 2.1. 'Response' now includes the" + " functionality directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/cors.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/cors.py new file mode 100644 index 00000000..89cf83ef --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/cors.py @@ -0,0 +1,26 @@ +import typing as t +import warnings + + +class CORSRequestMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'CORSRequestMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore + + +class CORSResponseMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'CORSResponseMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Response' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/etag.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/etag.py new file mode 100644 index 00000000..2e9015a5 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/etag.py @@ -0,0 +1,26 @@ +import typing as t +import warnings + + +class ETagRequestMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'ETagRequestMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore + + +class ETagResponseMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'ETagResponseMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Response' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/json.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/json.py new file mode 100644 index 00000000..ab6ed7ba --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/json.py @@ -0,0 +1,13 @@ +import typing as t +import warnings + + +class JSONMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'JSONMixin' is deprecated and will be removed in Werkzeug" + " 2.1. 'Request' now includes the functionality directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/request.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/request.py new file mode 100644 index 00000000..700cda04 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/request.py @@ -0,0 +1,660 @@ +import functools +import json +import typing +import typing as t +import warnings +from io import BytesIO + +from .._internal import _wsgi_decoding_dance +from ..datastructures import CombinedMultiDict +from ..datastructures import EnvironHeaders +from ..datastructures import FileStorage +from ..datastructures import ImmutableMultiDict +from ..datastructures import iter_multi_items +from ..datastructures import MultiDict +from ..formparser import default_stream_factory +from ..formparser import FormDataParser +from ..sansio.request import Request as _SansIORequest +from ..utils import cached_property +from ..utils import environ_property +from ..wsgi import _get_server +from ..wsgi import get_input_stream +from werkzeug.exceptions import BadRequest + +if t.TYPE_CHECKING: + import typing_extensions as te + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +class Request(_SansIORequest): + """Represents an incoming WSGI HTTP request, with headers and body + taken from the WSGI environment. Has properties and methods for + using the functionality defined by various HTTP specs. The data in + requests object is read-only. + + Text data is assumed to use UTF-8 encoding, which should be true for + the vast majority of modern clients. Using an encoding set by the + client is unsafe in Python due to extra encodings it provides, such + as ``zip``. To change the assumed encoding, subclass and replace + :attr:`charset`. + + :param environ: The WSGI environ is generated by the WSGI server and + contains information about the server configuration and client + request. + :param populate_request: Add this request object to the WSGI environ + as ``environ['werkzeug.request']``. Can be useful when + debugging. + :param shallow: Makes reading from :attr:`stream` (and any method + that would read from it) raise a :exc:`RuntimeError`. Useful to + prevent consuming the form data in middleware, which would make + it unavailable to the final application. + + .. versionchanged:: 2.0 + Combine ``BaseRequest`` and mixins into a single ``Request`` + class. Using the old classes is deprecated and will be removed + in Werkzeug 2.1. + + .. versionchanged:: 0.5 + Read-only mode is enforced with immutable classes for all data. + """ + + #: the maximum content length. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: parsing fails because more than the specified value is transmitted + #: a :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :doc:`/request_data` for more details. + #: + #: .. versionadded:: 0.5 + max_content_length: t.Optional[int] = None + + #: the maximum form field size. This is forwarded to the form data + #: parsing function (:func:`parse_form_data`). When set and the + #: :attr:`form` or :attr:`files` attribute is accessed and the + #: data in memory for post data is longer than the specified value a + #: :exc:`~werkzeug.exceptions.RequestEntityTooLarge` exception is raised. + #: + #: Have a look at :doc:`/request_data` for more details. + #: + #: .. versionadded:: 0.5 + max_form_memory_size: t.Optional[int] = None + + #: The form data parser that shoud be used. Can be replaced to customize + #: the form date parsing. + form_data_parser_class: t.Type[FormDataParser] = FormDataParser + + #: Disable the :attr:`data` property to avoid reading from the input + #: stream. + #: + #: .. deprecated:: 2.0 + #: Will be removed in Werkzeug 2.1. Create the request with + #: ``shallow=True`` instead. + #: + #: .. versionadded:: 0.9 + disable_data_descriptor: t.Optional[bool] = None + + #: The WSGI environment containing HTTP headers and information from + #: the WSGI server. + environ: "WSGIEnvironment" + + #: Set when creating the request object. If ``True``, reading from + #: the request body will cause a ``RuntimeException``. Useful to + #: prevent modifying the stream from middleware. + shallow: bool + + def __init__( + self, + environ: "WSGIEnvironment", + populate_request: bool = True, + shallow: bool = False, + ) -> None: + super().__init__( + method=environ.get("REQUEST_METHOD", "GET"), + scheme=environ.get("wsgi.url_scheme", "http"), + server=_get_server(environ), + root_path=_wsgi_decoding_dance( + environ.get("SCRIPT_NAME") or "", self.charset, self.encoding_errors + ), + path=_wsgi_decoding_dance( + environ.get("PATH_INFO") or "", self.charset, self.encoding_errors + ), + query_string=environ.get("QUERY_STRING", "").encode("latin1"), + headers=EnvironHeaders(environ), + remote_addr=environ.get("REMOTE_ADDR"), + ) + self.environ = environ + + if self.disable_data_descriptor is not None: + warnings.warn( + "'disable_data_descriptor' is deprecated and will be" + " removed in Werkzeug 2.1. Create the request with" + " 'shallow=True' instead.", + DeprecationWarning, + stacklevel=2, + ) + shallow = shallow or self.disable_data_descriptor + + self.shallow = shallow + + if populate_request and not shallow: + self.environ["werkzeug.request"] = self + + @classmethod + def from_values(cls, *args: t.Any, **kwargs: t.Any) -> "Request": + """Create a new request object based on the values provided. If + environ is given missing values are filled from there. This method is + useful for small scripts when you need to simulate a request from an URL. + Do not use this method for unittesting, there is a full featured client + object (:class:`Client`) that allows to create multipart requests, + support for cookies etc. + + This accepts the same options as the + :class:`~werkzeug.test.EnvironBuilder`. + + .. versionchanged:: 0.5 + This method now accepts the same arguments as + :class:`~werkzeug.test.EnvironBuilder`. Because of this the + `environ` parameter is now called `environ_overrides`. + + :return: request object + """ + from ..test import EnvironBuilder + + charset = kwargs.pop("charset", cls.charset) + kwargs["charset"] = charset + builder = EnvironBuilder(*args, **kwargs) + try: + return builder.get_request(cls) + finally: + builder.close() + + @classmethod + def application( + cls, f: t.Callable[["Request"], "WSGIApplication"] + ) -> "WSGIApplication": + """Decorate a function as responder that accepts the request as + the last argument. This works like the :func:`responder` + decorator but the function is passed the request object as the + last argument and the request object will be closed + automatically:: + + @Request.application + def my_wsgi_app(request): + return Response('Hello World!') + + As of Werkzeug 0.14 HTTP exceptions are automatically caught and + converted to responses instead of failing. + + :param f: the WSGI callable to decorate + :return: a new WSGI callable + """ + #: return a callable that wraps the -2nd argument with the request + #: and calls the function with all the arguments up to that one and + #: the request. The return value is then called with the latest + #: two arguments. This makes it possible to use this decorator for + #: both standalone WSGI functions as well as bound methods and + #: partially applied functions. + from ..exceptions import HTTPException + + @functools.wraps(f) + def application(*args): # type: ignore + request = cls(args[-2]) + with request: + try: + resp = f(*args[:-2] + (request,)) + except HTTPException as e: + resp = e.get_response(args[-2]) + return resp(*args[-2:]) + + return t.cast("WSGIApplication", application) + + def _get_file_stream( + self, + total_content_length: t.Optional[int], + content_type: t.Optional[str], + filename: t.Optional[str] = None, + content_length: t.Optional[int] = None, + ) -> t.IO[bytes]: + """Called to get a stream for the file upload. + + This must provide a file-like class with `read()`, `readline()` + and `seek()` methods that is both writeable and readable. + + The default implementation returns a temporary file if the total + content length is higher than 500KB. Because many browsers do not + provide a content length for the files only the total content + length matters. + + :param total_content_length: the total content length of all the + data in the request combined. This value + is guaranteed to be there. + :param content_type: the mimetype of the uploaded file. + :param filename: the filename of the uploaded file. May be `None`. + :param content_length: the length of this file. This value is usually + not provided because webbrowsers do not provide + this value. + """ + return default_stream_factory( + total_content_length=total_content_length, + filename=filename, + content_type=content_type, + content_length=content_length, + ) + + @property + def want_form_data_parsed(self) -> bool: + """``True`` if the request method carries content. By default + this is true if a ``Content-Type`` is sent. + + .. versionadded:: 0.8 + """ + return bool(self.environ.get("CONTENT_TYPE")) + + def make_form_data_parser(self) -> FormDataParser: + """Creates the form data parser. Instantiates the + :attr:`form_data_parser_class` with some parameters. + + .. versionadded:: 0.8 + """ + return self.form_data_parser_class( + self._get_file_stream, + self.charset, + self.encoding_errors, + self.max_form_memory_size, + self.max_content_length, + self.parameter_storage_class, + ) + + def _load_form_data(self) -> None: + """Method used internally to retrieve submitted data. After calling + this sets `form` and `files` on the request object to multi dicts + filled with the incoming form data. As a matter of fact the input + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. + + .. versionadded:: 0.8 + """ + # abort early if we have already consumed the stream + if "form" in self.__dict__: + return + + if self.want_form_data_parsed: + parser = self.make_form_data_parser() + data = parser.parse( + self._get_stream_for_parsing(), + self.mimetype, + self.content_length, + self.mimetype_params, + ) + else: + data = ( + self.stream, + self.parameter_storage_class(), + self.parameter_storage_class(), + ) + + # inject the values into the instance dict so that we bypass + # our cached_property non-data descriptor. + d = self.__dict__ + d["stream"], d["form"], d["files"] = data + + def _get_stream_for_parsing(self) -> t.IO[bytes]: + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, "_cached_data", None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + + def close(self) -> None: + """Closes associated resources of this request object. This + closes all file handles explicitly. You can also use the request + object in a with statement which will automatically close it. + + .. versionadded:: 0.9 + """ + files = self.__dict__.get("files") + for _key, value in iter_multi_items(files or ()): + value.close() + + def __enter__(self) -> "Request": + return self + + def __exit__(self, exc_type, exc_value, tb) -> None: # type: ignore + self.close() + + @cached_property + def stream(self) -> t.IO[bytes]: + """ + If the incoming form data was not encoded with a known mimetype + the data is stored unmodified in this stream for consumption. Most + of the time it is a better idea to use :attr:`data` which will give + you that data as a string. The stream only returns the data once. + + Unlike :attr:`input_stream` this stream is properly guarded that you + can't accidentally read past the length of the input. Werkzeug will + internally always refer to this stream to read data which makes it + possible to wrap this object with a stream that does filtering. + + .. versionchanged:: 0.9 + This stream is now always available but might be consumed by the + form parser later on. Previously the stream was only set if no + parsing happened. + """ + if self.shallow: + raise RuntimeError( + "This request was created with 'shallow=True', reading" + " from the input stream is disabled." + ) + + return get_input_stream(self.environ) + + input_stream = environ_property[t.IO[bytes]]( + "wsgi.input", + doc="""The WSGI input stream. + + In general it's a bad idea to use this one because you can + easily read past the boundary. Use the :attr:`stream` + instead.""", + ) + + @cached_property + def data(self) -> bytes: + """ + Contains the incoming request data as string in case it came with + a mimetype Werkzeug does not handle. + """ + return self.get_data(parse_form_data=True) + + @typing.overload + def get_data( # type: ignore + self, + cache: bool = True, + as_text: "te.Literal[False]" = False, + parse_form_data: bool = False, + ) -> bytes: + ... + + @typing.overload + def get_data( + self, + cache: bool = True, + as_text: "te.Literal[True]" = ..., + parse_form_data: bool = False, + ) -> str: + ... + + def get_data( + self, cache: bool = True, as_text: bool = False, parse_form_data: bool = False + ) -> t.Union[bytes, str]: + """This reads the buffered incoming data from the client into one + bytes object. By default this is cached but that behavior can be + changed by setting `cache` to `False`. + + Usually it's a bad idea to call this method without checking the + content length first as a client could send dozens of megabytes or more + to cause memory problems on the server. + + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + + If `as_text` is set to `True` the return value will be a decoded + string. + + .. versionadded:: 0.9 + """ + rv = getattr(self, "_cached_data", None) + if rv is None: + if parse_form_data: + self._load_form_data() + rv = self.stream.read() + if cache: + self._cached_data = rv + if as_text: + rv = rv.decode(self.charset, self.encoding_errors) + return rv # type: ignore + + @cached_property + def form(self) -> "ImmutableMultiDict[str, str]": + """The form parameters. By default an + :class:`~werkzeug.datastructures.ImmutableMultiDict` + is returned from this function. This can be changed by setting + :attr:`parameter_storage_class` to a different type. This might + be necessary if the order of the form data is important. + + Please keep in mind that file uploads will not end up here, but instead + in the :attr:`files` attribute. + + .. versionchanged:: 0.9 + + Previous to Werkzeug 0.9 this would only contain form data for POST + and PUT requests. + """ + self._load_form_data() + return self.form + + @cached_property + def values(self) -> "CombinedMultiDict[str, str]": + """A :class:`werkzeug.datastructures.CombinedMultiDict` that + combines :attr:`args` and :attr:`form`. + + For GET requests, only ``args`` are present, not ``form``. + + .. versionchanged:: 2.0 + For GET requests, only ``args`` are present, not ``form``. + """ + sources = [self.args] + + if self.method != "GET": + # GET requests can have a body, and some caching proxies + # might not treat that differently than a normal GET + # request, allowing form data to "invisibly" affect the + # cache without indication in the query string / URL. + sources.append(self.form) + + args = [] + + for d in sources: + if not isinstance(d, MultiDict): + d = MultiDict(d) + + args.append(d) + + return CombinedMultiDict(args) + + @cached_property + def files(self) -> "ImmutableMultiDict[str, FileStorage]": + """:class:`~werkzeug.datastructures.MultiDict` object containing + all uploaded files. Each key in :attr:`files` is the name from the + ````. Each value in :attr:`files` is a + Werkzeug :class:`~werkzeug.datastructures.FileStorage` object. + + It basically behaves like a standard file object you know from Python, + with the difference that it also has a + :meth:`~werkzeug.datastructures.FileStorage.save` function that can + store the file on the filesystem. + + Note that :attr:`files` will only contain data if the request method was + POST, PUT or PATCH and the ``

    `` that posted to the request had + ``enctype="multipart/form-data"``. It will be empty otherwise. + + See the :class:`~werkzeug.datastructures.MultiDict` / + :class:`~werkzeug.datastructures.FileStorage` documentation for + more details about the used data structure. + """ + self._load_form_data() + return self.files + + @property + def script_root(self) -> str: + """Alias for :attr:`self.root_path`. ``environ["SCRIPT_ROOT"]`` + without a trailing slash. + """ + return self.root_path + + @cached_property + def url_root(self) -> str: + """Alias for :attr:`root_url`. The URL with scheme, host, and + root path. For example, ``https://example.com/app/``. + """ + return self.root_url + + remote_user = environ_property[str]( + "REMOTE_USER", + doc="""If the server supports user authentication, and the + script is protected, this attribute contains the username the + user has authenticated as.""", + ) + is_multithread = environ_property[bool]( + "wsgi.multithread", + doc="""boolean that is `True` if the application is served by a + multithreaded WSGI server.""", + ) + is_multiprocess = environ_property[bool]( + "wsgi.multiprocess", + doc="""boolean that is `True` if the application is served by a + WSGI server that spawns multiple processes.""", + ) + is_run_once = environ_property[bool]( + "wsgi.run_once", + doc="""boolean that is `True` if the application will be + executed only once in a process lifetime. This is the case for + CGI for example, but it's not guaranteed that the execution only + happens one time.""", + ) + + # JSON + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = json + + @property + def json(self) -> t.Optional[t.Any]: + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :attr:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + # Cached values for ``(silent=False, silent=True)``. Initialized + # with sentinel values. + _cached_json: t.Tuple[t.Any, t.Any] = (Ellipsis, Ellipsis) + + def get_json( + self, force: bool = False, silent: bool = False, cache: bool = True + ) -> t.Optional[t.Any]: + """Parse :attr:`data` as JSON. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :attr:`is_json`), this + returns ``None``. + + If parsing fails, :meth:`on_json_loading_failed` is called and + its return value is used as the return value. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + :param cache: Store the parsed JSON to return for subsequent + calls. + """ + if cache and self._cached_json[silent] is not Ellipsis: + return self._cached_json[silent] + + if not (force or self.is_json): + return None + + data = self.get_data(cache=cache) + + try: + rv = self.json_module.loads(data) + except ValueError as e: + if silent: + rv = None + + if cache: + normal_rv, _ = self._cached_json + self._cached_json = (normal_rv, rv) + else: + rv = self.on_json_loading_failed(e) + + if cache: + _, silent_rv = self._cached_json + self._cached_json = (rv, silent_rv) + else: + if cache: + self._cached_json = (rv, rv) + + return rv + + def on_json_loading_failed(self, e: ValueError) -> t.Any: + """Called if :meth:`get_json` parsing fails and isn't silenced. + If this method returns a value, it is used as the return value + for :meth:`get_json`. The default implementation raises + :exc:`~werkzeug.exceptions.BadRequest`. + """ + raise BadRequest(f"Failed to decode JSON object: {e}") + + +class StreamOnlyMixin: + """Mixin to create a ``Request`` that disables the ``data``, + ``form``, and ``files`` properties. Only ``stream`` is available. + + .. deprecated:: 2.0 + Will be removed in Werkzeug 2.1. Create the request with + ``shallow=True`` instead. + + .. versionadded:: 0.9 + """ + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'StreamOnlyMixin' is deprecated and will be removed in" + " Werkzeug 2.1. Create the request with 'shallow=True'" + " instead.", + DeprecationWarning, + stacklevel=2, + ) + kwargs["shallow"] = True + super().__init__(*args, **kwargs) # type: ignore + + +class PlainRequest(StreamOnlyMixin, Request): + """A request object without ``data``, ``form``, and ``files``. + + .. deprecated:: 2.0 + Will be removed in Werkzeug 2.1. Create the request with + ``shallow=True`` instead. + + .. versionadded:: 0.9 + """ + + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'PlainRequest' is deprecated and will be removed in" + " Werkzeug 2.1. Create the request with 'shallow=True'" + " instead.", + DeprecationWarning, + stacklevel=2, + ) + + # Don't show the DeprecationWarning for StreamOnlyMixin. + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + super().__init__(*args, **kwargs) diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/response.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/response.py new file mode 100644 index 00000000..d365c4e0 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/response.py @@ -0,0 +1,890 @@ +import json +import typing +import typing as t +import warnings +from http import HTTPStatus + +from .._internal import _to_bytes +from ..datastructures import Headers +from ..http import remove_entity_headers +from ..sansio.response import Response as _SansIOResponse +from ..urls import iri_to_uri +from ..urls import url_join +from ..utils import cached_property +from ..wsgi import ClosingIterator +from ..wsgi import get_current_url +from werkzeug._internal import _get_environ +from werkzeug.http import generate_etag +from werkzeug.http import http_date +from werkzeug.http import is_resource_modified +from werkzeug.http import parse_etags +from werkzeug.http import parse_range_header +from werkzeug.wsgi import _RangeWrapper + +if t.TYPE_CHECKING: + import typing_extensions as te + from _typeshed.wsgi import StartResponse + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +def _warn_if_string(iterable: t.Iterable) -> None: + """Helper for the response objects to check if the iterable returned + to the WSGI server is not a string. + """ + if isinstance(iterable, str): + warnings.warn( + "Response iterable was set to a string. This will appear to" + " work but means that the server will send the data to the" + " client one character at a time. This is almost never" + " intended behavior, use 'response.data' to assign strings" + " to the response object.", + stacklevel=2, + ) + + +def _iter_encoded( + iterable: t.Iterable[t.Union[str, bytes]], charset: str +) -> t.Iterator[bytes]: + for item in iterable: + if isinstance(item, str): + yield item.encode(charset) + else: + yield item + + +def _clean_accept_ranges(accept_ranges: t.Union[bool, str]) -> str: + if accept_ranges is True: + return "bytes" + elif accept_ranges is False: + return "none" + elif isinstance(accept_ranges, str): + return accept_ranges + raise ValueError("Invalid accept_ranges value") + + +class Response(_SansIOResponse): + """Represents an outgoing WSGI HTTP response with body, status, and + headers. Has properties and methods for using the functionality + defined by various HTTP specs. + + The response body is flexible to support different use cases. The + simple form is passing bytes, or a string which will be encoded as + UTF-8. Passing an iterable of bytes or strings makes this a + streaming response. A generator is particularly useful for building + a CSV file in memory or using SSE (Server Sent Events). A file-like + object is also iterable, although the + :func:`~werkzeug.utils.send_file` helper should be used in that + case. + + The response object is itself a WSGI application callable. When + called (:meth:`__call__`) with ``environ`` and ``start_response``, + it will pass its status and headers to ``start_response`` then + return its body as an iterable. + + .. code-block:: python + + from werkzeug.wrappers.response import Response + + def index(): + return Response("Hello, World!") + + def application(environ, start_response): + path = environ.get("PATH_INFO") or "/" + + if path == "/": + response = index() + else: + response = Response("Not Found", status=404) + + return response(environ, start_response) + + :param response: The data for the body of the response. A string or + bytes, or tuple or list of strings or bytes, for a fixed-length + response, or any other iterable of strings or bytes for a + streaming response. Defaults to an empty body. + :param status: The status code for the response. Either an int, in + which case the default status message is added, or a string in + the form ``{code} {message}``, like ``404 Not Found``. Defaults + to 200. + :param headers: A :class:`~werkzeug.datastructures.Headers` object, + or a list of ``(key, value)`` tuples that will be converted to a + ``Headers`` object. + :param mimetype: The mime type (content type without charset or + other parameters) of the response. If the value starts with + ``text/`` (or matches some other special cases), the charset + will be added to create the ``content_type``. + :param content_type: The full content type of the response. + Overrides building the value from ``mimetype``. + :param direct_passthrough: Pass the response body directly through + as the WSGI iterable. This can be used when the body is a binary + file or other iterator of bytes, to skip some unnecessary + checks. Use :func:`~werkzeug.utils.send_file` instead of setting + this manually. + + .. versionchanged:: 2.0 + Combine ``BaseResponse`` and mixins into a single ``Response`` + class. Using the old classes is deprecated and will be removed + in Werkzeug 2.1. + + .. versionchanged:: 0.5 + The ``direct_passthrough`` parameter was added. + """ + + #: if set to `False` accessing properties on the response object will + #: not try to consume the response iterator and convert it into a list. + #: + #: .. versionadded:: 0.6.2 + #: + #: That attribute was previously called `implicit_seqence_conversion`. + #: (Notice the typo). If you did use this feature, you have to adapt + #: your code to the name change. + implicit_sequence_conversion = True + + #: Should this response object correct the location header to be RFC + #: conformant? This is true by default. + #: + #: .. versionadded:: 0.8 + autocorrect_location_header = True + + #: Should this response object automatically set the content-length + #: header if possible? This is true by default. + #: + #: .. versionadded:: 0.8 + automatically_set_content_length = True + + #: The response body to send as the WSGI iterable. A list of strings + #: or bytes represents a fixed-length response, any other iterable + #: is a streaming response. Strings are encoded to bytes as UTF-8. + #: + #: Do not set to a plain string or bytes, that will cause sending + #: the response to be very inefficient as it will iterate one byte + #: at a time. + response: t.Union[t.Iterable[str], t.Iterable[bytes]] + + def __init__( + self, + response: t.Optional[ + t.Union[t.Iterable[bytes], bytes, t.Iterable[str], str] + ] = None, + status: t.Optional[t.Union[int, str, HTTPStatus]] = None, + headers: t.Optional[ + t.Union[ + t.Mapping[str, t.Union[str, int, t.Iterable[t.Union[str, int]]]], + t.Iterable[t.Tuple[str, t.Union[str, int]]], + ] + ] = None, + mimetype: t.Optional[str] = None, + content_type: t.Optional[str] = None, + direct_passthrough: bool = False, + ) -> None: + super().__init__( + status=status, + headers=headers, + mimetype=mimetype, + content_type=content_type, + ) + + #: Pass the response body directly through as the WSGI iterable. + #: This can be used when the body is a binary file or other + #: iterator of bytes, to skip some unnecessary checks. Use + #: :func:`~werkzeug.utils.send_file` instead of setting this + #: manually. + self.direct_passthrough = direct_passthrough + self._on_close: t.List[t.Callable[[], t.Any]] = [] + + # we set the response after the headers so that if a class changes + # the charset attribute, the data is set in the correct charset. + if response is None: + self.response = [] + elif isinstance(response, (str, bytes, bytearray)): + self.set_data(response) + else: + self.response = response + + def call_on_close(self, func: t.Callable[[], t.Any]) -> t.Callable[[], t.Any]: + """Adds a function to the internal list of functions that should + be called as part of closing down the response. Since 0.7 this + function also returns the function that was passed so that this + can be used as a decorator. + + .. versionadded:: 0.6 + """ + self._on_close.append(func) + return func + + def __repr__(self) -> str: + if self.is_sequence: + body_info = f"{sum(map(len, self.iter_encoded()))} bytes" + else: + body_info = "streamed" if self.is_streamed else "likely-streamed" + return f"<{type(self).__name__} {body_info} [{self.status}]>" + + @classmethod + def force_type( + cls, response: "Response", environ: t.Optional["WSGIEnvironment"] = None + ) -> "Response": + """Enforce that the WSGI response is a response object of the current + type. Werkzeug will use the :class:`Response` internally in many + situations like the exceptions. If you call :meth:`get_response` on an + exception you will get back a regular :class:`Response` object, even + if you are using a custom subclass. + + This method can enforce a given response type, and it will also + convert arbitrary WSGI callables into response objects if an environ + is provided:: + + # convert a Werkzeug response object into an instance of the + # MyResponseClass subclass. + response = MyResponseClass.force_type(response) + + # convert any WSGI application into a response object + response = MyResponseClass.force_type(response, environ) + + This is especially useful if you want to post-process responses in + the main dispatcher and use functionality provided by your subclass. + + Keep in mind that this will modify response objects in place if + possible! + + :param response: a response object or wsgi application. + :param environ: a WSGI environment object. + :return: a response object. + """ + if not isinstance(response, Response): + if environ is None: + raise TypeError( + "cannot convert WSGI application into response" + " objects without an environ" + ) + + from ..test import run_wsgi_app + + response = Response(*run_wsgi_app(response, environ)) + + response.__class__ = cls + return response + + @classmethod + def from_app( + cls, app: "WSGIApplication", environ: "WSGIEnvironment", buffered: bool = False + ) -> "Response": + """Create a new response object from an application output. This + works best if you pass it an application that returns a generator all + the time. Sometimes applications may use the `write()` callable + returned by the `start_response` function. This tries to resolve such + edge cases automatically. But if you don't get the expected output + you should set `buffered` to `True` which enforces buffering. + + :param app: the WSGI application to execute. + :param environ: the WSGI environment to execute against. + :param buffered: set to `True` to enforce buffering. + :return: a response object. + """ + from ..test import run_wsgi_app + + return cls(*run_wsgi_app(app, environ, buffered)) + + @typing.overload + def get_data(self, as_text: "te.Literal[False]" = False) -> bytes: + ... + + @typing.overload + def get_data(self, as_text: "te.Literal[True]") -> str: + ... + + def get_data(self, as_text: bool = False) -> t.Union[bytes, str]: + """The string representation of the response body. Whenever you call + this property the response iterable is encoded and flattened. This + can lead to unwanted behavior if you stream big data. + + This behavior can be disabled by setting + :attr:`implicit_sequence_conversion` to `False`. + + If `as_text` is set to `True` the return value will be a decoded + string. + + .. versionadded:: 0.9 + """ + self._ensure_sequence() + rv = b"".join(self.iter_encoded()) + + if as_text: + return rv.decode(self.charset) + + return rv + + def set_data(self, value: t.Union[bytes, str]) -> None: + """Sets a new string as response. The value must be a string or + bytes. If a string is set it's encoded to the charset of the + response (utf-8 by default). + + .. versionadded:: 0.9 + """ + # if a string is set, it's encoded directly so that we + # can set the content length + if isinstance(value, str): + value = value.encode(self.charset) + else: + value = bytes(value) + self.response = [value] + if self.automatically_set_content_length: + self.headers["Content-Length"] = str(len(value)) + + data = property( + get_data, + set_data, + doc="A descriptor that calls :meth:`get_data` and :meth:`set_data`.", + ) + + def calculate_content_length(self) -> t.Optional[int]: + """Returns the content length if available or `None` otherwise.""" + try: + self._ensure_sequence() + except RuntimeError: + return None + return sum(len(x) for x in self.iter_encoded()) + + def _ensure_sequence(self, mutable: bool = False) -> None: + """This method can be called by methods that need a sequence. If + `mutable` is true, it will also ensure that the response sequence + is a standard Python list. + + .. versionadded:: 0.6 + """ + if self.is_sequence: + # if we need a mutable object, we ensure it's a list. + if mutable and not isinstance(self.response, list): + self.response = list(self.response) # type: ignore + return + if self.direct_passthrough: + raise RuntimeError( + "Attempted implicit sequence conversion but the" + " response object is in direct passthrough mode." + ) + if not self.implicit_sequence_conversion: + raise RuntimeError( + "The response object required the iterable to be a" + " sequence, but the implicit conversion was disabled." + " Call make_sequence() yourself." + ) + self.make_sequence() + + def make_sequence(self) -> None: + """Converts the response iterator in a list. By default this happens + automatically if required. If `implicit_sequence_conversion` is + disabled, this method is not automatically called and some properties + might raise exceptions. This also encodes all the items. + + .. versionadded:: 0.6 + """ + if not self.is_sequence: + # if we consume an iterable we have to ensure that the close + # method of the iterable is called if available when we tear + # down the response + close = getattr(self.response, "close", None) + self.response = list(self.iter_encoded()) + if close is not None: + self.call_on_close(close) + + def iter_encoded(self) -> t.Iterator[bytes]: + """Iter the response encoded with the encoding of the response. + If the response object is invoked as WSGI application the return + value of this method is used as application iterator unless + :attr:`direct_passthrough` was activated. + """ + if __debug__: + _warn_if_string(self.response) + # Encode in a separate function so that self.response is fetched + # early. This allows us to wrap the response with the return + # value from get_app_iter or iter_encoded. + return _iter_encoded(self.response, self.charset) + + @property + def is_streamed(self) -> bool: + """If the response is streamed (the response is not an iterable with + a length information) this property is `True`. In this case streamed + means that there is no information about the number of iterations. + This is usually `True` if a generator is passed to the response object. + + This is useful for checking before applying some sort of post + filtering that should not take place for streamed responses. + """ + try: + len(self.response) # type: ignore + except (TypeError, AttributeError): + return True + return False + + @property + def is_sequence(self) -> bool: + """If the iterator is buffered, this property will be `True`. A + response object will consider an iterator to be buffered if the + response attribute is a list or tuple. + + .. versionadded:: 0.6 + """ + return isinstance(self.response, (tuple, list)) + + def close(self) -> None: + """Close the wrapped response if possible. You can also use the object + in a with statement which will automatically close it. + + .. versionadded:: 0.9 + Can now be used in a with statement. + """ + if hasattr(self.response, "close"): + self.response.close() # type: ignore + for func in self._on_close: + func() + + def __enter__(self) -> "Response": + return self + + def __exit__(self, exc_type, exc_value, tb): # type: ignore + self.close() + + def freeze(self, no_etag: None = None) -> None: + """Make the response object ready to be pickled. Does the + following: + + * Buffer the response into a list, ignoring + :attr:`implicity_sequence_conversion` and + :attr:`direct_passthrough`. + * Set the ``Content-Length`` header. + * Generate an ``ETag`` header if one is not already set. + + .. versionchanged:: 2.0 + An ``ETag`` header is added, the ``no_etag`` parameter is + deprecated and will be removed in Werkzeug 2.1. + + .. versionchanged:: 0.6 + The ``Content-Length`` header is set. + """ + # Always freeze the encoded response body, ignore + # implicit_sequence_conversion and direct_passthrough. + self.response = list(self.iter_encoded()) + self.headers["Content-Length"] = str(sum(map(len, self.response))) + + if no_etag is not None: + warnings.warn( + "The 'no_etag' parameter is deprecated and will be" + " removed in Werkzeug 2.1.", + DeprecationWarning, + stacklevel=2, + ) + + self.add_etag() + + def get_wsgi_headers(self, environ: "WSGIEnvironment") -> Headers: + """This is automatically called right before the response is started + and returns headers modified for the given environment. It returns a + copy of the headers from the response with some modifications applied + if necessary. + + For example the location header (if present) is joined with the root + URL of the environment. Also the content length is automatically set + to zero here for certain status codes. + + .. versionchanged:: 0.6 + Previously that function was called `fix_headers` and modified + the response object in place. Also since 0.6, IRIs in location + and content-location headers are handled properly. + + Also starting with 0.6, Werkzeug will attempt to set the content + length if it is able to figure it out on its own. This is the + case if all the strings in the response iterable are already + encoded and the iterable is buffered. + + :param environ: the WSGI environment of the request. + :return: returns a new :class:`~werkzeug.datastructures.Headers` + object. + """ + headers = Headers(self.headers) + location: t.Optional[str] = None + content_location: t.Optional[str] = None + content_length: t.Optional[t.Union[str, int]] = None + status = self.status_code + + # iterate over the headers to find all values in one go. Because + # get_wsgi_headers is used each response that gives us a tiny + # speedup. + for key, value in headers: + ikey = key.lower() + if ikey == "location": + location = value + elif ikey == "content-location": + content_location = value + elif ikey == "content-length": + content_length = value + + # make sure the location header is an absolute URL + if location is not None: + old_location = location + if isinstance(location, str): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + location = iri_to_uri(location, safe_conversion=True) + + if self.autocorrect_location_header: + current_url = get_current_url(environ, strip_querystring=True) + if isinstance(current_url, str): + current_url = iri_to_uri(current_url) + location = url_join(current_url, location) + if location != old_location: + headers["Location"] = location + + # make sure the content location is a URL + if content_location is not None and isinstance(content_location, str): + headers["Content-Location"] = iri_to_uri(content_location) + + if 100 <= status < 200 or status == 204: + # Per section 3.3.2 of RFC 7230, "a server MUST NOT send a + # Content-Length header field in any response with a status + # code of 1xx (Informational) or 204 (No Content)." + headers.remove("Content-Length") + elif status == 304: + remove_entity_headers(headers) + + # if we can determine the content length automatically, we + # should try to do that. But only if this does not involve + # flattening the iterator or encoding of strings in the + # response. We however should not do that if we have a 304 + # response. + if ( + self.automatically_set_content_length + and self.is_sequence + and content_length is None + and status not in (204, 304) + and not (100 <= status < 200) + ): + try: + content_length = sum(len(_to_bytes(x, "ascii")) for x in self.response) + except UnicodeError: + # Something other than bytes, can't safely figure out + # the length of the response. + pass + else: + headers["Content-Length"] = str(content_length) + + return headers + + def get_app_iter(self, environ: "WSGIEnvironment") -> t.Iterable[bytes]: + """Returns the application iterator for the given environ. Depending + on the request method and the current status code the return value + might be an empty response rather than the one from the response. + + If the request method is `HEAD` or the status code is in a range + where the HTTP specification requires an empty response, an empty + iterable is returned. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: a response iterable. + """ + status = self.status_code + if ( + environ["REQUEST_METHOD"] == "HEAD" + or 100 <= status < 200 + or status in (204, 304) + ): + iterable: t.Iterable[bytes] = () + elif self.direct_passthrough: + if __debug__: + _warn_if_string(self.response) + return self.response # type: ignore + else: + iterable = self.iter_encoded() + return ClosingIterator(iterable, self.close) + + def get_wsgi_response( + self, environ: "WSGIEnvironment" + ) -> t.Tuple[t.Iterable[bytes], str, t.List[t.Tuple[str, str]]]: + """Returns the final WSGI response as tuple. The first item in + the tuple is the application iterator, the second the status and + the third the list of headers. The response returned is created + specially for the given environment. For example if the request + method in the WSGI environment is ``'HEAD'`` the response will + be empty and only the headers and status code will be present. + + .. versionadded:: 0.6 + + :param environ: the WSGI environment of the request. + :return: an ``(app_iter, status, headers)`` tuple. + """ + headers = self.get_wsgi_headers(environ) + app_iter = self.get_app_iter(environ) + return app_iter, self.status, headers.to_wsgi_list() + + def __call__( + self, environ: "WSGIEnvironment", start_response: "StartResponse" + ) -> t.Iterable[bytes]: + """Process this response as WSGI application. + + :param environ: the WSGI environment. + :param start_response: the response callable provided by the WSGI + server. + :return: an application iterator + """ + app_iter, status, headers = self.get_wsgi_response(environ) + start_response(status, headers) + return app_iter + + # JSON + + #: A module or other object that has ``dumps`` and ``loads`` + #: functions that match the API of the built-in :mod:`json` module. + json_module = json + + @property + def json(self) -> t.Optional[t.Any]: + """The parsed JSON data if :attr:`mimetype` indicates JSON + (:mimetype:`application/json`, see :attr:`is_json`). + + Calls :meth:`get_json` with default arguments. + """ + return self.get_json() + + def get_json(self, force: bool = False, silent: bool = False) -> t.Optional[t.Any]: + """Parse :attr:`data` as JSON. Useful during testing. + + If the mimetype does not indicate JSON + (:mimetype:`application/json`, see :attr:`is_json`), this + returns ``None``. + + Unlike :meth:`Request.get_json`, the result is not cached. + + :param force: Ignore the mimetype and always try to parse JSON. + :param silent: Silence parsing errors and return ``None`` + instead. + """ + if not (force or self.is_json): + return None + + data = self.get_data() + + try: + return self.json_module.loads(data) + except ValueError: + if not silent: + raise + + return None + + # Stream + + @cached_property + def stream(self) -> "ResponseStream": + """The response iterable as write-only stream.""" + return ResponseStream(self) + + def _wrap_range_response(self, start: int, length: int) -> None: + """Wrap existing Response in case of Range Request context.""" + if self.status_code == 206: + self.response = _RangeWrapper(self.response, start, length) # type: ignore + + def _is_range_request_processable(self, environ: "WSGIEnvironment") -> bool: + """Return ``True`` if `Range` header is present and if underlying + resource is considered unchanged when compared with `If-Range` header. + """ + return ( + "HTTP_IF_RANGE" not in environ + or not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ignore_if_range=False, + ) + ) and "HTTP_RANGE" in environ + + def _process_range_request( + self, + environ: "WSGIEnvironment", + complete_length: t.Optional[int] = None, + accept_ranges: t.Optional[t.Union[bool, str]] = None, + ) -> bool: + """Handle Range Request related headers (RFC7233). If `Accept-Ranges` + header is valid, and Range Request is processable, we set the headers + as described by the RFC, and wrap the underlying response in a + RangeWrapper. + + Returns ``True`` if Range Request can be fulfilled, ``False`` otherwise. + + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + + .. versionchanged:: 2.0 + Returns ``False`` if the length is 0. + """ + from ..exceptions import RequestedRangeNotSatisfiable + + if ( + accept_ranges is None + or complete_length is None + or complete_length == 0 + or not self._is_range_request_processable(environ) + ): + return False + + parsed_range = parse_range_header(environ.get("HTTP_RANGE")) + + if parsed_range is None: + raise RequestedRangeNotSatisfiable(complete_length) + + range_tuple = parsed_range.range_for_length(complete_length) + content_range_header = parsed_range.to_content_range_header(complete_length) + + if range_tuple is None or content_range_header is None: + raise RequestedRangeNotSatisfiable(complete_length) + + content_length = range_tuple[1] - range_tuple[0] + self.headers["Content-Length"] = content_length + self.headers["Accept-Ranges"] = accept_ranges + self.content_range = content_range_header # type: ignore + self.status_code = 206 + self._wrap_range_response(range_tuple[0], content_length) + return True + + def make_conditional( + self, + request_or_environ: "WSGIEnvironment", + accept_ranges: t.Union[bool, str] = False, + complete_length: t.Optional[int] = None, + ) -> "Response": + """Make the response conditional to the request. This method works + best if an etag was defined for the response already. The `add_etag` + method can be used to do that. If called without etag just the date + header is set. + + This does nothing if the request method in the request or environ is + anything but GET or HEAD. + + For optimal performance when handling range requests, it's recommended + that your response data object implements `seekable`, `seek` and `tell` + methods as described by :py:class:`io.IOBase`. Objects returned by + :meth:`~werkzeug.wsgi.wrap_file` automatically implement those methods. + + It does not remove the body of the response because that's something + the :meth:`__call__` function does for us automatically. + + Returns self so that you can do ``return resp.make_conditional(req)`` + but modifies the object in-place. + + :param request_or_environ: a request object or WSGI environment to be + used to make the response conditional + against. + :param accept_ranges: This parameter dictates the value of + `Accept-Ranges` header. If ``False`` (default), + the header is not set. If ``True``, it will be set + to ``"bytes"``. If ``None``, it will be set to + ``"none"``. If it's a string, it will use this + value. + :param complete_length: Will be used only in valid Range Requests. + It will set `Content-Range` complete length + value and compute `Content-Length` real value. + This parameter is mandatory for successful + Range Requests completion. + :raises: :class:`~werkzeug.exceptions.RequestedRangeNotSatisfiable` + if `Range` header could not be parsed or satisfied. + + .. versionchanged:: 2.0 + Range processing is skipped if length is 0 instead of + raising a 416 Range Not Satisfiable error. + """ + environ = _get_environ(request_or_environ) + if environ["REQUEST_METHOD"] in ("GET", "HEAD"): + # if the date is not in the headers, add it now. We however + # will not override an already existing header. Unfortunately + # this header will be overriden by many WSGI servers including + # wsgiref. + if "date" not in self.headers: + self.headers["Date"] = http_date() + accept_ranges = _clean_accept_ranges(accept_ranges) + is206 = self._process_range_request(environ, complete_length, accept_ranges) + if not is206 and not is_resource_modified( + environ, + self.headers.get("etag"), + None, + self.headers.get("last-modified"), + ): + if parse_etags(environ.get("HTTP_IF_MATCH")): + self.status_code = 412 + else: + self.status_code = 304 + if ( + self.automatically_set_content_length + and "content-length" not in self.headers + ): + length = self.calculate_content_length() + if length is not None: + self.headers["Content-Length"] = length + return self + + def add_etag(self, overwrite: bool = False, weak: bool = False) -> None: + """Add an etag for the current response if there is none yet. + + .. versionchanged:: 2.0 + SHA-1 is used to generate the value. MD5 may not be + available in some environments. + """ + if overwrite or "etag" not in self.headers: + self.set_etag(generate_etag(self.get_data()), weak) + + +class ResponseStream: + """A file descriptor like object used by the :class:`ResponseStreamMixin` to + represent the body of the stream. It directly pushes into the response + iterable of the response object. + """ + + mode = "wb+" + + def __init__(self, response: Response): + self.response = response + self.closed = False + + def write(self, value: bytes) -> int: + if self.closed: + raise ValueError("I/O operation on closed file") + self.response._ensure_sequence(mutable=True) + self.response.response.append(value) # type: ignore + self.response.headers.pop("Content-Length", None) + return len(value) + + def writelines(self, seq: t.Iterable[bytes]) -> None: + for item in seq: + self.write(item) + + def close(self) -> None: + self.closed = True + + def flush(self) -> None: + if self.closed: + raise ValueError("I/O operation on closed file") + + def isatty(self) -> bool: + if self.closed: + raise ValueError("I/O operation on closed file") + return False + + def tell(self) -> int: + self.response._ensure_sequence() + return sum(map(len, self.response.response)) + + @property + def encoding(self) -> str: + return self.response.charset + + +class ResponseStreamMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'ResponseStreamMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Response' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/user_agent.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/user_agent.py new file mode 100644 index 00000000..184ffd02 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wrappers/user_agent.py @@ -0,0 +1,14 @@ +import typing as t +import warnings + + +class UserAgentMixin: + def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: + warnings.warn( + "'UserAgentMixin' is deprecated and will be removed in" + " Werkzeug 2.1. 'Request' now includes the functionality" + " directly.", + DeprecationWarning, + stacklevel=2, + ) + super().__init__(*args, **kwargs) # type: ignore diff --git a/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wsgi.py b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wsgi.py new file mode 100644 index 00000000..9cfa74de --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Lib/site-packages/werkzeug/wsgi.py @@ -0,0 +1,982 @@ +import io +import re +import typing as t +from functools import partial +from functools import update_wrapper +from itertools import chain + +from ._internal import _make_encode_wrapper +from ._internal import _to_bytes +from ._internal import _to_str +from .sansio import utils as _sansio_utils +from .sansio.utils import host_is_trusted # noqa: F401 # Imported as part of API +from .urls import _URLTuple +from .urls import uri_to_iri +from .urls import url_join +from .urls import url_parse +from .urls import url_quote + +if t.TYPE_CHECKING: + from _typeshed.wsgi import WSGIApplication + from _typeshed.wsgi import WSGIEnvironment + + +def responder(f: t.Callable[..., "WSGIApplication"]) -> "WSGIApplication": + """Marks a function as responder. Decorate a function with it and it + will automatically call the return value as WSGI application. + + Example:: + + @responder + def application(environ, start_response): + return Response('Hello World!') + """ + return update_wrapper(lambda *a: f(*a)(*a[-2:]), f) + + +def get_current_url( + environ: "WSGIEnvironment", + root_only: bool = False, + strip_querystring: bool = False, + host_only: bool = False, + trusted_hosts: t.Optional[t.Iterable[str]] = None, +) -> str: + """Recreate the URL for a request from the parts in a WSGI + environment. + + The URL is an IRI, not a URI, so it may contain Unicode characters. + Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII. + + :param environ: The WSGI environment to get the URL parts from. + :param root_only: Only build the root path, don't include the + remaining path or query string. + :param strip_querystring: Don't include the query string. + :param host_only: Only build the scheme and host. + :param trusted_hosts: A list of trusted host names to validate the + host against. + """ + parts = { + "scheme": environ["wsgi.url_scheme"], + "host": get_host(environ, trusted_hosts), + } + + if not host_only: + parts["root_path"] = environ.get("SCRIPT_NAME", "") + + if not root_only: + parts["path"] = environ.get("PATH_INFO", "") + + if not strip_querystring: + parts["query_string"] = environ.get("QUERY_STRING", "").encode("latin1") + + return _sansio_utils.get_current_url(**parts) + + +def _get_server( + environ: "WSGIEnvironment", +) -> t.Optional[t.Tuple[str, t.Optional[int]]]: + name = environ.get("SERVER_NAME") + + if name is None: + return None + + try: + port: t.Optional[int] = int(environ.get("SERVER_PORT", None)) + except (TypeError, ValueError): + # unix socket + port = None + + return name, port + + +def get_host( + environ: "WSGIEnvironment", trusted_hosts: t.Optional[t.Iterable[str]] = None +) -> str: + """Return the host for the given WSGI environment. + + The ``Host`` header is preferred, then ``SERVER_NAME`` if it's not + set. The returned host will only contain the port if it is different + than the standard port for the protocol. + + Optionally, verify that the host is trusted using + :func:`host_is_trusted` and raise a + :exc:`~werkzeug.exceptions.SecurityError` if it is not. + + :param environ: A WSGI environment dict. + :param trusted_hosts: A list of trusted host names. + + :return: Host, with port if necessary. + :raise ~werkzeug.exceptions.SecurityError: If the host is not + trusted. + """ + return _sansio_utils.get_host( + environ["wsgi.url_scheme"], + environ.get("HTTP_HOST"), + _get_server(environ), + trusted_hosts, + ) + + +def get_content_length(environ: "WSGIEnvironment") -> t.Optional[int]: + """Returns the content length from the WSGI environment as + integer. If it's not available or chunked transfer encoding is used, + ``None`` is returned. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the content length from. + """ + if environ.get("HTTP_TRANSFER_ENCODING", "") == "chunked": + return None + + content_length = environ.get("CONTENT_LENGTH") + if content_length is not None: + try: + return max(0, int(content_length)) + except (ValueError, TypeError): + pass + return None + + +def get_input_stream( + environ: "WSGIEnvironment", safe_fallback: bool = True +) -> t.IO[bytes]: + """Returns the input stream from the WSGI environment and wraps it + in the most sensible way possible. The stream returned is not the + raw WSGI stream in most cases but one that is safe to read from + without taking into account the content length. + + If content length is not set, the stream will be empty for safety reasons. + If the WSGI server supports chunked or infinite streams, it should set + the ``wsgi.input_terminated`` value in the WSGI environ to indicate that. + + .. versionadded:: 0.9 + + :param environ: the WSGI environ to fetch the stream from. + :param safe_fallback: use an empty stream as a safe fallback when the + content length is not set. Disabling this allows infinite streams, + which can be a denial-of-service risk. + """ + stream = t.cast(t.IO[bytes], environ["wsgi.input"]) + content_length = get_content_length(environ) + + # A wsgi extension that tells us if the input is terminated. In + # that case we return the stream unchanged as we know we can safely + # read it until the end. + if environ.get("wsgi.input_terminated"): + return stream + + # If the request doesn't specify a content length, returning the stream is + # potentially dangerous because it could be infinite, malicious or not. If + # safe_fallback is true, return an empty stream instead for safety. + if content_length is None: + return io.BytesIO() if safe_fallback else stream + + # Otherwise limit the stream to the content length + return t.cast(t.IO[bytes], LimitedStream(stream, content_length)) + + +def get_query_string(environ: "WSGIEnvironment") -> str: + """Returns the ``QUERY_STRING`` from the WSGI environment. This also + takes care of the WSGI decoding dance. The string returned will be + restricted to ASCII characters. + + :param environ: WSGI environment to get the query string from. + + .. versionadded:: 0.9 + """ + qs = environ.get("QUERY_STRING", "").encode("latin1") + # QUERY_STRING really should be ascii safe but some browsers + # will send us some unicode stuff (I am looking at you IE). + # In that case we want to urllib quote it badly. + return url_quote(qs, safe=":&%=+$!*'(),") + + +def get_path_info( + environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" +) -> str: + """Return the ``PATH_INFO`` from the WSGI environment and decode it + unless ``charset`` is ``None``. + + :param environ: WSGI environment to get the path from. + :param charset: The charset for the path info, or ``None`` if no + decoding should be performed. + :param errors: The decoding error handling. + + .. versionadded:: 0.9 + """ + path = environ.get("PATH_INFO", "").encode("latin1") + return _to_str(path, charset, errors, allow_none_charset=True) # type: ignore + + +def get_script_name( + environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" +) -> str: + """Return the ``SCRIPT_NAME`` from the WSGI environment and decode + it unless `charset` is set to ``None``. + + :param environ: WSGI environment to get the path from. + :param charset: The charset for the path, or ``None`` if no decoding + should be performed. + :param errors: The decoding error handling. + + .. versionadded:: 0.9 + """ + path = environ.get("SCRIPT_NAME", "").encode("latin1") + return _to_str(path, charset, errors, allow_none_charset=True) # type: ignore + + +def pop_path_info( + environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" +) -> t.Optional[str]: + """Removes and returns the next segment of `PATH_INFO`, pushing it onto + `SCRIPT_NAME`. Returns `None` if there is nothing left on `PATH_INFO`. + + If the `charset` is set to `None` bytes are returned. + + If there are empty segments (``'/foo//bar``) these are ignored but + properly pushed to the `SCRIPT_NAME`: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> pop_path_info(env) + 'a' + >>> env['SCRIPT_NAME'] + '/foo/a' + >>> pop_path_info(env) + 'b' + >>> env['SCRIPT_NAME'] + '/foo/a/b' + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is modified. + :param charset: The ``encoding`` parameter passed to + :func:`bytes.decode`. + :param errors: The ``errors`` paramater passed to + :func:`bytes.decode`. + """ + path = environ.get("PATH_INFO") + if not path: + return None + + script_name = environ.get("SCRIPT_NAME", "") + + # shift multiple leading slashes over + old_path = path + path = path.lstrip("/") + if path != old_path: + script_name += "/" * (len(old_path) - len(path)) + + if "/" not in path: + environ["PATH_INFO"] = "" + environ["SCRIPT_NAME"] = script_name + path + rv = path.encode("latin1") + else: + segment, path = path.split("/", 1) + environ["PATH_INFO"] = f"/{path}" + environ["SCRIPT_NAME"] = script_name + segment + rv = segment.encode("latin1") + + return _to_str(rv, charset, errors, allow_none_charset=True) # type: ignore + + +def peek_path_info( + environ: "WSGIEnvironment", charset: str = "utf-8", errors: str = "replace" +) -> t.Optional[str]: + """Returns the next segment on the `PATH_INFO` or `None` if there + is none. Works like :func:`pop_path_info` without modifying the + environment: + + >>> env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b'} + >>> peek_path_info(env) + 'a' + >>> peek_path_info(env) + 'a' + + If the `charset` is set to `None` bytes are returned. + + .. versionadded:: 0.5 + + .. versionchanged:: 0.9 + The path is now decoded and a charset and encoding + parameter can be provided. + + :param environ: the WSGI environment that is checked. + """ + segments = environ.get("PATH_INFO", "").lstrip("/").split("/", 1) + if segments: + return _to_str( # type: ignore + segments[0].encode("latin1"), charset, errors, allow_none_charset=True + ) + return None + + +def extract_path_info( + environ_or_baseurl: t.Union[str, "WSGIEnvironment"], + path_or_url: t.Union[str, _URLTuple], + charset: str = "utf-8", + errors: str = "werkzeug.url_quote", + collapse_http_schemes: bool = True, +) -> t.Optional[str]: + """Extracts the path info from the given URL (or WSGI environment) and + path. The path info returned is a string. The URLs might also be IRIs. + + If the path info could not be determined, `None` is returned. + + Some examples: + + >>> extract_path_info('http://example.com/app', '/app/hello') + '/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello') + '/hello' + >>> extract_path_info('http://example.com/app', + ... 'https://example.com/app/hello', + ... collapse_http_schemes=False) is None + True + + Instead of providing a base URL you can also pass a WSGI environment. + + :param environ_or_baseurl: a WSGI environment dict, a base URL or + base IRI. This is the root of the + application. + :param path_or_url: an absolute path from the server root, a + relative path (in which case it's the path info) + or a full URL. + :param charset: the charset for byte data in URLs + :param errors: the error handling on decode + :param collapse_http_schemes: if set to `False` the algorithm does + not assume that http and https on the + same server point to the same + resource. + + .. versionchanged:: 0.15 + The ``errors`` parameter defaults to leaving invalid bytes + quoted instead of replacing them. + + .. versionadded:: 0.6 + """ + + def _normalize_netloc(scheme: str, netloc: str) -> str: + parts = netloc.split("@", 1)[-1].split(":", 1) + port: t.Optional[str] + + if len(parts) == 2: + netloc, port = parts + if (scheme == "http" and port == "80") or ( + scheme == "https" and port == "443" + ): + port = None + else: + netloc = parts[0] + port = None + + if port is not None: + netloc += f":{port}" + + return netloc + + # make sure whatever we are working on is a IRI and parse it + path = uri_to_iri(path_or_url, charset, errors) + if isinstance(environ_or_baseurl, dict): + environ_or_baseurl = get_current_url(environ_or_baseurl, root_only=True) + base_iri = uri_to_iri(environ_or_baseurl, charset, errors) + base_scheme, base_netloc, base_path = url_parse(base_iri)[:3] + cur_scheme, cur_netloc, cur_path = url_parse(url_join(base_iri, path))[:3] + + # normalize the network location + base_netloc = _normalize_netloc(base_scheme, base_netloc) + cur_netloc = _normalize_netloc(cur_scheme, cur_netloc) + + # is that IRI even on a known HTTP scheme? + if collapse_http_schemes: + for scheme in base_scheme, cur_scheme: + if scheme not in ("http", "https"): + return None + else: + if not (base_scheme in ("http", "https") and base_scheme == cur_scheme): + return None + + # are the netlocs compatible? + if base_netloc != cur_netloc: + return None + + # are we below the application path? + base_path = base_path.rstrip("/") + if not cur_path.startswith(base_path): + return None + + return f"/{cur_path[len(base_path) :].lstrip('/')}" + + +class ClosingIterator: + """The WSGI specification requires that all middlewares and gateways + respect the `close` callback of the iterable returned by the application. + Because it is useful to add another close action to a returned iterable + and adding a custom iterable is a boring task this class can be used for + that:: + + return ClosingIterator(app(environ, start_response), [cleanup_session, + cleanup_locals]) + + If there is just one close function it can be passed instead of the list. + + A closing iterator is not needed if the application uses response objects + and finishes the processing if the response is started:: + + try: + return response(environ, start_response) + finally: + cleanup_session() + cleanup_locals() + """ + + def __init__( + self, + iterable: t.Iterable[bytes], + callbacks: t.Optional[ + t.Union[t.Callable[[], None], t.Iterable[t.Callable[[], None]]] + ] = None, + ) -> None: + iterator = iter(iterable) + self._next = t.cast(t.Callable[[], bytes], partial(next, iterator)) + if callbacks is None: + callbacks = [] + elif callable(callbacks): + callbacks = [callbacks] + else: + callbacks = list(callbacks) + iterable_close = getattr(iterable, "close", None) + if iterable_close: + callbacks.insert(0, iterable_close) + self._callbacks = callbacks + + def __iter__(self) -> "ClosingIterator": + return self + + def __next__(self) -> bytes: + return self._next() + + def close(self) -> None: + for callback in self._callbacks: + callback() + + +def wrap_file( + environ: "WSGIEnvironment", file: t.IO[bytes], buffer_size: int = 8192 +) -> t.Iterable[bytes]: + """Wraps a file. This uses the WSGI server's file wrapper if available + or otherwise the generic :class:`FileWrapper`. + + .. versionadded:: 0.5 + + If the file wrapper from the WSGI server is used it's important to not + iterate over it from inside the application but to pass it through + unchanged. If you want to pass out a file wrapper inside a response + object you have to set :attr:`Response.direct_passthrough` to `True`. + + More information about file wrappers are available in :pep:`333`. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + return environ.get("wsgi.file_wrapper", FileWrapper)( # type: ignore + file, buffer_size + ) + + +class FileWrapper: + """This class can be used to convert a :class:`file`-like object into + an iterable. It yields `buffer_size` blocks until the file is fully + read. + + You should not use this class directly but rather use the + :func:`wrap_file` function that uses the WSGI server's file wrapper + support if it's available. + + .. versionadded:: 0.5 + + If you're using this object together with a :class:`Response` you have + to use the `direct_passthrough` mode. + + :param file: a :class:`file`-like object with a :meth:`~file.read` method. + :param buffer_size: number of bytes for one iteration. + """ + + def __init__(self, file: t.IO[bytes], buffer_size: int = 8192) -> None: + self.file = file + self.buffer_size = buffer_size + + def close(self) -> None: + if hasattr(self.file, "close"): + self.file.close() + + def seekable(self) -> bool: + if hasattr(self.file, "seekable"): + return self.file.seekable() + if hasattr(self.file, "seek"): + return True + return False + + def seek(self, *args: t.Any) -> None: + if hasattr(self.file, "seek"): + self.file.seek(*args) + + def tell(self) -> t.Optional[int]: + if hasattr(self.file, "tell"): + return self.file.tell() + return None + + def __iter__(self) -> "FileWrapper": + return self + + def __next__(self) -> bytes: + data = self.file.read(self.buffer_size) + if data: + return data + raise StopIteration() + + +class _RangeWrapper: + # private for now, but should we make it public in the future ? + + """This class can be used to convert an iterable object into + an iterable that will only yield a piece of the underlying content. + It yields blocks until the underlying stream range is fully read. + The yielded blocks will have a size that can't exceed the original + iterator defined block size, but that can be smaller. + + If you're using this object together with a :class:`Response` you have + to use the `direct_passthrough` mode. + + :param iterable: an iterable object with a :meth:`__next__` method. + :param start_byte: byte from which read will start. + :param byte_range: how many bytes to read. + """ + + def __init__( + self, + iterable: t.Union[t.Iterable[bytes], t.IO[bytes]], + start_byte: int = 0, + byte_range: t.Optional[int] = None, + ): + self.iterable = iter(iterable) + self.byte_range = byte_range + self.start_byte = start_byte + self.end_byte = None + + if byte_range is not None: + self.end_byte = start_byte + byte_range + + self.read_length = 0 + self.seekable = ( + hasattr(iterable, "seekable") and iterable.seekable() # type: ignore + ) + self.end_reached = False + + def __iter__(self) -> "_RangeWrapper": + return self + + def _next_chunk(self) -> bytes: + try: + chunk = next(self.iterable) + self.read_length += len(chunk) + return chunk + except StopIteration: + self.end_reached = True + raise + + def _first_iteration(self) -> t.Tuple[t.Optional[bytes], int]: + chunk = None + if self.seekable: + self.iterable.seek(self.start_byte) # type: ignore + self.read_length = self.iterable.tell() # type: ignore + contextual_read_length = self.read_length + else: + while self.read_length <= self.start_byte: + chunk = self._next_chunk() + if chunk is not None: + chunk = chunk[self.start_byte - self.read_length :] + contextual_read_length = self.start_byte + return chunk, contextual_read_length + + def _next(self) -> bytes: + if self.end_reached: + raise StopIteration() + chunk = None + contextual_read_length = self.read_length + if self.read_length == 0: + chunk, contextual_read_length = self._first_iteration() + if chunk is None: + chunk = self._next_chunk() + if self.end_byte is not None and self.read_length >= self.end_byte: + self.end_reached = True + return chunk[: self.end_byte - contextual_read_length] + return chunk + + def __next__(self) -> bytes: + chunk = self._next() + if chunk: + return chunk + self.end_reached = True + raise StopIteration() + + def close(self) -> None: + if hasattr(self.iterable, "close"): + self.iterable.close() # type: ignore + + +def _make_chunk_iter( + stream: t.Union[t.Iterable[bytes], t.IO[bytes]], + limit: t.Optional[int], + buffer_size: int, +) -> t.Iterator[bytes]: + """Helper for the line and chunk iter functions.""" + if isinstance(stream, (bytes, bytearray, str)): + raise TypeError( + "Passed a string or byte object instead of true iterator or stream." + ) + if not hasattr(stream, "read"): + for item in stream: + if item: + yield item + return + stream = t.cast(t.IO[bytes], stream) + if not isinstance(stream, LimitedStream) and limit is not None: + stream = t.cast(t.IO[bytes], LimitedStream(stream, limit)) + _read = stream.read + while True: + item = _read(buffer_size) + if not item: + break + yield item + + +def make_line_iter( + stream: t.Union[t.Iterable[bytes], t.IO[bytes]], + limit: t.Optional[int] = None, + buffer_size: int = 10 * 1024, + cap_at_buffer: bool = False, +) -> t.Iterator[bytes]: + """Safely iterates line-based over an input stream. If the input stream + is not a :class:`LimitedStream` the `limit` parameter is mandatory. + + This uses the stream's :meth:`~file.read` method internally as opposite + to the :meth:`~file.readline` method that is unsafe and can only be used + in violation of the WSGI specification. The same problem applies to the + `__iter__` function of the input stream which calls :meth:`~file.readline` + without arguments. + + If you need line-by-line processing it's strongly recommended to iterate + over the input stream using this helper function. + + .. versionchanged:: 0.8 + This function now ensures that the limit was reached. + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is a :class:`LimitedStream`. + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, "") + if not first_item: + return + + s = _make_encode_wrapper(first_item) + empty = t.cast(bytes, s("")) + cr = t.cast(bytes, s("\r")) + lf = t.cast(bytes, s("\n")) + crlf = t.cast(bytes, s("\r\n")) + + _iter = t.cast(t.Iterator[bytes], chain((first_item,), _iter)) + + def _iter_basic_lines() -> t.Iterator[bytes]: + _join = empty.join + buffer: t.List[bytes] = [] + while True: + new_data = next(_iter, "") + if not new_data: + break + new_buf: t.List[bytes] = [] + buf_size = 0 + for item in t.cast( + t.Iterator[bytes], chain(buffer, new_data.splitlines(True)) + ): + new_buf.append(item) + buf_size += len(item) + if item and item[-1:] in crlf: + yield _join(new_buf) + new_buf = [] + elif cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buffer = new_buf + if buffer: + yield _join(buffer) + + # This hackery is necessary to merge 'foo\r' and '\n' into one item + # of 'foo\r\n' if we were unlucky and we hit a chunk boundary. + previous = empty + for item in _iter_basic_lines(): + if item == lf and previous[-1:] == cr: + previous += item + item = empty + if previous: + yield previous + previous = item + if previous: + yield previous + + +def make_chunk_iter( + stream: t.Union[t.Iterable[bytes], t.IO[bytes]], + separator: bytes, + limit: t.Optional[int] = None, + buffer_size: int = 10 * 1024, + cap_at_buffer: bool = False, +) -> t.Iterator[bytes]: + """Works like :func:`make_line_iter` but accepts a separator + which divides chunks. If you want newline based processing + you should use :func:`make_line_iter` instead as it + supports arbitrary newline markers. + + .. versionadded:: 0.8 + + .. versionadded:: 0.9 + added support for iterators as input stream. + + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + + :param stream: the stream or iterate to iterate over. + :param separator: the separator that divides chunks. + :param limit: the limit in bytes for the stream. (Usually + content length. Not necessary if the `stream` + is otherwise already limited). + :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + """ + _iter = _make_chunk_iter(stream, limit, buffer_size) + + first_item = next(_iter, b"") + if not first_item: + return + + _iter = t.cast(t.Iterator[bytes], chain((first_item,), _iter)) + if isinstance(first_item, str): + separator = _to_str(separator) + _split = re.compile(f"({re.escape(separator)})").split + _join = "".join + else: + separator = _to_bytes(separator) + _split = re.compile(b"(" + re.escape(separator) + b")").split + _join = b"".join + + buffer: t.List[bytes] = [] + while True: + new_data = next(_iter, b"") + if not new_data: + break + chunks = _split(new_data) + new_buf: t.List[bytes] = [] + buf_size = 0 + for item in chain(buffer, chunks): + if item == separator: + yield _join(new_buf) + new_buf = [] + buf_size = 0 + else: + buf_size += len(item) + new_buf.append(item) + + if cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buf_size = len(rv) + + buffer = new_buf + if buffer: + yield _join(buffer) + + +class LimitedStream(io.IOBase): + """Wraps a stream so that it doesn't read more than n bytes. If the + stream is exhausted and the caller tries to get more bytes from it + :func:`on_exhausted` is called which by default returns an empty + string. The return value of that function is forwarded + to the reader function. So if it returns an empty string + :meth:`read` will return an empty string as well. + + The limit however must never be higher than what the stream can + output. Otherwise :meth:`readlines` will try to read past the + limit. + + .. admonition:: Note on WSGI compliance + + calls to :meth:`readline` and :meth:`readlines` are not + WSGI compliant because it passes a size argument to the + readline methods. Unfortunately the WSGI PEP is not safely + implementable without a size argument to :meth:`readline` + because there is no EOF marker in the stream. As a result + of that the use of :meth:`readline` is discouraged. + + For the same reason iterating over the :class:`LimitedStream` + is not portable. It internally calls :meth:`readline`. + + We strongly suggest using :meth:`read` only or using the + :func:`make_line_iter` which safely iterates line-based + over a WSGI input stream. + + :param stream: the stream to wrap. + :param limit: the limit for the stream, must not be longer than + what the string can provide if the stream does not + end with `EOF` (like `wsgi.input`) + """ + + def __init__(self, stream: t.IO[bytes], limit: int) -> None: + self._read = stream.read + self._readline = stream.readline + self._pos = 0 + self.limit = limit + + def __iter__(self) -> "LimitedStream": + return self + + @property + def is_exhausted(self) -> bool: + """If the stream is exhausted this attribute is `True`.""" + return self._pos >= self.limit + + def on_exhausted(self) -> bytes: + """This is called when the stream tries to read past the limit. + The return value of this function is returned from the reading + function. + """ + # Read null bytes from the stream so that we get the + # correct end of stream marker. + return self._read(0) + + def on_disconnect(self) -> bytes: + """What should happen if a disconnect is detected? The return + value of this function is returned from read functions in case + the client went away. By default a + :exc:`~werkzeug.exceptions.ClientDisconnected` exception is raised. + """ + from .exceptions import ClientDisconnected + + raise ClientDisconnected() + + def exhaust(self, chunk_size: int = 1024 * 64) -> None: + """Exhaust the stream. This consumes all the data left until the + limit is reached. + + :param chunk_size: the size for a chunk. It will read the chunk + until the stream is exhausted and throw away + the results. + """ + to_read = self.limit - self._pos + chunk = chunk_size + while to_read > 0: + chunk = min(to_read, chunk) + self.read(chunk) + to_read -= chunk + + def read(self, size: t.Optional[int] = None) -> bytes: + """Read `size` bytes or if size is not provided everything is read. + + :param size: the number of bytes read. + """ + if self._pos >= self.limit: + return self.on_exhausted() + if size is None or size == -1: # -1 is for consistence with file + size = self.limit + to_read = min(self.limit - self._pos, size) + try: + read = self._read(to_read) + except (OSError, ValueError): + return self.on_disconnect() + if to_read and len(read) != to_read: + return self.on_disconnect() + self._pos += len(read) + return read + + def readline(self, size: t.Optional[int] = None) -> bytes: + """Reads one line from the stream.""" + if self._pos >= self.limit: + return self.on_exhausted() + if size is None: + size = self.limit - self._pos + else: + size = min(size, self.limit - self._pos) + try: + line = self._readline(size) + except (ValueError, OSError): + return self.on_disconnect() + if size and not line: + return self.on_disconnect() + self._pos += len(line) + return line + + def readlines(self, size: t.Optional[int] = None) -> t.List[bytes]: + """Reads a file into a list of strings. It calls :meth:`readline` + until the file is read to the end. It does support the optional + `size` argument if the underlying stream supports it for + `readline`. + """ + last_pos = self._pos + result = [] + if size is not None: + end = min(self.limit, last_pos + size) + else: + end = self.limit + while True: + if size is not None: + size -= last_pos - self._pos + if self._pos >= end: + break + result.append(self.readline(size)) + if size is not None: + last_pos = self._pos + return result + + def tell(self) -> int: + """Returns the position of the stream. + + .. versionadded:: 0.9 + """ + return self._pos + + def __next__(self) -> bytes: + line = self.readline() + if not line: + raise StopIteration() + return line + + def readable(self) -> bool: + return True diff --git a/Rahul/task3/pyvenv3.9/Scripts/Activate.ps1 b/Rahul/task3/pyvenv3.9/Scripts/Activate.ps1 new file mode 100644 index 00000000..e06da144 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Scripts/Activate.ps1 @@ -0,0 +1,399 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" + +# SIG # Begin signature block +# MIIc+AYJKoZIhvcNAQcCoIIc6TCCHOUCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAwnDYwEHaCQq0n +# 8NAvsN7H7BO7/48rXCNwrg891FS5vaCCC38wggUwMIIEGKADAgECAhAECRgbX9W7 +# ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV +# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBa +# Fw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy +# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD +# ZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3 +# DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/l +# qJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fT +# eyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqH +# CN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+ +# bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLo +# LFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIB +# yTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK +# BggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9v +# Y3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGln +# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHow +# eDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl +# ZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp +# Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwA +# AgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAK +# BghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0j +# BBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7s +# DVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGS +# dQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6 +# r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo +# +MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qz +# sIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHq +# aGxEMrJmoecYpJpkUe8wggZHMIIFL6ADAgECAhADPtXtoGXRuMkd/PkqbJvYMA0G +# CSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ +# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0 +# IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcNMTgxMjE4MDAwMDAw +# WhcNMjExMjIyMTIwMDAwWjCBgzELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU5ldyBI +# YW1wc2hpcmUxEjAQBgNVBAcTCVdvbGZlYm9ybzEjMCEGA1UEChMaUHl0aG9uIFNv +# ZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMTGlB5dGhvbiBTb2Z0d2FyZSBGb3Vu +# ZGF0aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqr2kS7J1uW7o +# JRxlsdrETAjKarfoH5TI8PWST6Yb2xPooP7vHT4iaVXyL5Lze1f53Jw67Sp+u524 +# fJXf30qHViEWxumy2RWG0nciU2d+mMqzjlaAWSZNF0u4RcvyDJokEV0RUOqI5CG5 +# zPI3W9uQ6LiUk3HCYW6kpH177A5T3pw/Po8O8KErJGn1anaqtIICq99ySxrMad/2 +# hPMBRf6Ndah7f7HPn1gkSSTAoejyuqF5h+B0qI4+JK5+VLvz659VTbAWJsYakkxZ +# xVWYpFv4KeQSSwoo0DzMvmERsTzNvVBMWhu9OriJNg+QfFmf96zVTu93cZ+r7xMp +# bXyfIOGKhHMaRuZ8ihuWIx3gI9WHDFX6fBKR8+HlhdkaiBEWIsXRoy+EQUyK7zUs +# +FqOo2sRYttbs8MTF9YDKFZwyPjn9Wn+gLGd5NUEVyNvD9QVGBEtN7vx87bduJUB +# 8F4DylEsMtZTfjw/au6AmOnmneK5UcqSJuwRyZaGNk7y3qj06utx+HTTqHgi975U +# pxfyrwAqkovoZEWBVSpvku8PVhkBXcLmNe6MEHlFiaMoiADAeKmX5RFRkN+VrmYG +# Tg4zajxfdHeIY8TvLf48tTfmnQJd98geJQv/01NUy/FxuwqAuTkaez5Nl1LxP0Cp +# THhghzO4FRD4itT2wqTh4jpojw9QZnsCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaA +# FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBT8Kr9+1L6s84KcpM97IgE7 +# uI8H8jAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0f +# BHAwbjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl +# ZC1jcy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEy +# LWFzc3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYI +# KwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQB +# MIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj +# ZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t +# L0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB +# /wQCMAAwDQYJKoZIhvcNAQELBQADggEBAEt1oS21X0axiafPjyY+vlYqjWKuUu/Y +# FuYWIEq6iRRaFabNDhj9RBFQF/aJiE5msrQEOfAD6/6gVSH91lZWBqg6NEeG9T9S +# XbiAPvJ9CEWFsdkXUrjbWhvCnuZ7kqUuU5BAumI1QRbpYgZL3UA+iZXkmjbGh1ln +# 8rUhWIxbBYL4Sg2nqpB44p7CUFYkPj/MbwU2gvBV2pXjj5WaskoZtsACMv5g42BN +# oVLoRAi+ev6s07POt+JtHRIm87lTyuc8wh0swTPUwksKbLU1Zdj9CpqtzXnuVE0w +# 50exJvRSK3Vt4g+0vigpI3qPmDdpkf9+4Mvy0XMNcqrthw20R+PkIlMxghDPMIIQ +# ywIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw +# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEy +# IEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADPtXtoGXRuMkd/PkqbJvYMA0G +# CWCGSAFlAwQCAQUAoIGYMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG +# AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCwGCisGAQQBgjcCAQwxHjAcoBqAGABQ +# AHkAdABoAG8AbgAgADMALgA5AC4ANjAvBgkqhkiG9w0BCQQxIgQgBrni4mcRv7sM +# JHsxpROjRopOz2wuQVrJnn+lD7X7y+gwDQYJKoZIhvcNAQEBBQAEggIAKBxtIIh2 +# APcTqLi9A0nTuTBMVUsNOQNQzSI9fW92jLmXUh0OGygpOMC9GiVVRnHNGmCWt9FV +# pMkolylPuI7wj08VFv5xvsnWo9EKM2+M0zZ1fN+/zNDvrRPKmhUTQ/fGIP9OWF3x +# qbUCGSXrzVf/wSvYmhdBXa7pTrivIx8JOS8fhK5dqSiCmtJOPQ45ZEFNzfgB5i9e +# 9lfNQ0wXKfKHo2zdqS19VEbuIUN8GjSlos7rGHP20aMjb0ZgKWBkYHHm4yNAgJCU +# AJ8K+mL2+KRJDyxwH1oFjgkFKAvEHMVo8by3TigZIxmIkNlYBYx3oh7S3wgKKtNf +# wZqX6/iDYOBmj49CxOEfoN4jtg5kg1slzbham+EPAE2pkNmg+RMkF0j9lJ5KTWrt +# tUZvWJI17UQV0bRlbp4bYiI7OxGDD3LNU1iQo69J3q8rFc+yyplD7lJzKb7h/mH/ +# oMBa6TVHNBuSBSMGLN6xOoshcwWMo0hhfdOqyjFNgdMHO8cEwXGhwJFPimXXt+NW +# KeKaW9i7dSzt1uNnqNXqXauk5A4upOxLceMFhmnoUwcsyxRxSFrti+uyUVMXOs1a +# Q8YyQZFfjy5CeOjq7ohDbBRarX5JwJrkB/BYya6TA9SKfRYwIxfiwYFf6yGLrjAy +# E0Qjhz5Np39AYpfcaWk31MeLse8NVtgVPPmhgg1+MIINegYKKwYBBAGCNwMDATGC +# DWowgg1mBgkqhkiG9w0BBwKggg1XMIINUwIBAzEPMA0GCWCGSAFlAwQCAQUAMHgG +# CyqGSIb3DQEJEAEEoGkEZzBlAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEF +# AAQgUVAItwy7RQCrM4tGC7KCANd0O7DgaULOpzirVGSU8QMCEQDLPomRSCQZjdG/ +# GAILYuAXGA8yMDIxMDYyODE1MzMxNVqgggo3MIIE/jCCA+agAwIBAgIQDUJK4L46 +# iP9gQCHOFADw3TANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UE +# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYD +# VQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4X +# DTIxMDEwMTAwMDAwMFoXDTMxMDEwNjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAV +# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3Rh +# bXAgMjAyMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1 +# DQikRcpja1HXOhFCvQp1dU2UtAxQtSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4 +# /2cLnGP9NmqB+in43Stwhd4CGPN4bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT +# 0dHTWjaPxqPhLxs6t2HWc+xObTOKfF1FLUuxUOZBOjdWhtyTI433UCXoZObd048v +# V7WHIOsOjizVI9r0TXhG4wODMSlKXAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j +# 6BqrW7EdMMKbaYK02/xWVLwfoYervnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4 +# Gdb+DUmEvQECAwEAAaOCAbgwggG0MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E +# AjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9 +# bAcBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAf +# BgNVHSMEGDAWgBT0tuEgHf4prtLkYaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6 +# sGa+vCgtHUQ23eNqerwwcQYDVR0fBGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGln +# aWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0 +# LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5 +# MHcwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEF +# BQcwAoZDaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFz +# c3VyZWRJRFRpbWVzdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzc +# temaI7znGucgDo5nRv1CclF0CiNHo6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZ +# O73+RAJmTe1ppA/2uHDPYuj1UUp4eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO +# /PT+t2R3Y18jUmmDgvoaU+2QzI2hF3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUI +# AHa8gQ74wOFcz8QRcucbZEnYIpp1FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahz +# Q1HavWPWH1ub9y4bTxMd90oNcX6Xt/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5n +# ePk2mOHLKNpbh6aKLzCCBTEwggQZoAMCAQICEAqhJdbWMht+QeQF2jaXwhUwDQYJ +# KoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu +# YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQg +# QXNzdXJlZCBJRCBSb290IENBMB4XDTE2MDEwNzEyMDAwMFoXDTMxMDEwNzEyMDAw +# MFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UE +# CxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1 +# cmVkIElEIFRpbWVzdGFtcGluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +# AQoCggEBAL3QMu5LzY9/3am6gpnFOVQoV7YjSsQOB0UzURB90Pl9TWh+57ag9I2z +# iOSXv2MhkJi/E7xX08PhfgjWahQAOPcuHjvuzKb2Mln+X2U/4Jvr40ZHBhpVfgsn +# fsCi9aDg3iI/Dv9+lfvzo7oiPhisEeTwmQNtO4V8CdPuXciaC1TjqAlxa+DPIhAP +# dc9xck4Krd9AOly3UeGheRTGTSQjMF287DxgaqwvB8z98OpH2YhQXv1mblZhJymJ +# hFHmgudGUP2UKiyn5HU+upgPhH+fMRTWrdXyZMt7HgXQhBlyF/EXBu89zdZN7wZC +# /aJTKk+FHcQdPK/P2qwQ9d2srOlW/5MCAwEAAaOCAc4wggHKMB0GA1UdDgQWBBT0 +# tuEgHf4prtLkYaWyoiWyyBc1bjAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd +# 823IDzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUE +# DDAKBggrBgEFBQcDCDB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6 +# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMu +# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0f +# BHoweDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNz +# dXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29t +# L0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBQBgNVHSAESTBHMDgGCmCGSAGG +# /WwAAgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQ +# UzALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggEBAHGVEulRh1Zpze/d2nyq +# Y3qzeM8GN0CE70uEv8rPAwL9xafDDiBCLK938ysfDCFaKrcFNB1qrpn4J6Jmvwmq +# YN92pDqTD/iy0dh8GWLoXoIlHsS6HHssIeLWWywUNUMEaLLbdQLgcseY1jxk5R9I +# EBhfiThhTWJGJIdjjJFSLK8pieV4H9YLFKWA1xJHcLN11ZOFk362kmf7U2GJqPVr +# lsD0WGkNfMgBsbkodbeZY4UijGHKeZR+WfyMD+NvtQEmtmyl7odRIeRYYJu6DC0r +# baLEfrvEJStHAgh8Sa4TtuF8QkIoxhhWz0E0tmZdtnR79VYzIi8iNrJLokqV2PWm +# jlIxggKGMIICggIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl +# cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdp +# Q2VydCBTSEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBAhANQkrgvjqI/2BA +# Ic4UAPDdMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B +# CRABBDAcBgkqhkiG9w0BCQUxDxcNMjEwNjI4MTUzMzE1WjArBgsqhkiG9w0BCRAC +# DDEcMBowGDAWBBTh14Ko4ZG+72vKFpG1qrSUpiSb8zAvBgkqhkiG9w0BCQQxIgQg +# U63BaTxWvK6IjoVixdUxR2Ka9ngnAWl8TjG38EljW2IwNwYLKoZIhvcNAQkQAi8x +# KDAmMCQwIgQgsxCQBrwK2YMHkVcp4EQDQVyD4ykrYU8mlkyNNXHs9akwDQYJKoZI +# hvcNAQEBBQAEggEAmed9c1/5eDuMSWHIIs7oR1RWaY6OR4PjxqCkybJRvoGl8wO1 +# WmUE58PVZfTNtho02cKeP+HNsyohxFp78bBXwObFNC97vbmKR3U7ANBnu3iEE/hD +# V3M5RD1BN4SE8yzfRlN4DB5H8rgvArWpjO9JedbVrBKrEe4FwtU8vbQhdAyFMGv5 +# ITWLQgiDJOvAOjfC014JKRgnTMgY1JntNHO1ny2dgkYYql7kO7Jbgu3h/lox/lF2 +# 1Sfonu9hDsv1121CatHRMU8B3kDeiF2P9/ifu5e0UULd0mTsMF7CIUs1/TNX0bAp +# A6DuV3o0VVOjsfOSgQUiz/nMxVmQoWFv2sNc3w== +# SIG # End signature block diff --git a/Rahul/task3/pyvenv3.9/Scripts/activate b/Rahul/task3/pyvenv3.9/Scripts/activate new file mode 100644 index 00000000..502af928 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Scripts/activate @@ -0,0 +1,66 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="D:\TDoC-Glugle Project on my Computer\pyvenv3.9" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1="(pyvenv3.9) ${PS1:-}" + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r 2> /dev/null +fi diff --git a/Rahul/task3/pyvenv3.9/Scripts/activate.bat b/Rahul/task3/pyvenv3.9/Scripts/activate.bat new file mode 100644 index 00000000..10e66f83 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Scripts/activate.bat @@ -0,0 +1,33 @@ +@echo off + +rem This file is UTF-8 encoded, so we need to update the current code page while executing it +for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( + set _OLD_CODEPAGE=%%a +) +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" 65001 > nul +) + +set VIRTUAL_ENV=D:\TDoC-Glugle Project on my Computer\pyvenv3.9 + +if not defined PROMPT set PROMPT=$P$G + +if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% +if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% + +set _OLD_VIRTUAL_PROMPT=%PROMPT% +set PROMPT=(pyvenv3.9) %PROMPT% + +if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% +set PYTHONHOME= + +if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% +if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% + +set PATH=%VIRTUAL_ENV%\Scripts;%PATH% + +:END +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul + set _OLD_CODEPAGE= +) diff --git a/Rahul/task3/pyvenv3.9/Scripts/deactivate.bat b/Rahul/task3/pyvenv3.9/Scripts/deactivate.bat new file mode 100644 index 00000000..1205c618 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/Scripts/deactivate.bat @@ -0,0 +1,21 @@ +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= + +:END diff --git a/Rahul/task3/pyvenv3.9/Scripts/flask.exe b/Rahul/task3/pyvenv3.9/Scripts/flask.exe new file mode 100644 index 0000000000000000000000000000000000000000..f397dd85e9125f111827c9d389c0bacb3a1e08b3 GIT binary patch literal 106366 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 F{V#we2#f## literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/normalizer.exe b/Rahul/task3/pyvenv3.9/Scripts/normalizer.exe new file mode 100644 index 0000000000000000000000000000000000000000..a7d5fb6bb9c3cc278fdfe66e1c57b3f8eafbd50c GIT binary patch literal 106402 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 z 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/pip.exe b/Rahul/task3/pyvenv3.9/Scripts/pip.exe new file mode 100644 index 0000000000000000000000000000000000000000..b06826f214b2be071ac163c27654885aa89e7944 GIT binary patch literal 106379 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 Pk4iGW9dt?Wd{+5iG1v>r literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/pip3.9.exe b/Rahul/task3/pyvenv3.9/Scripts/pip3.9.exe new file mode 100644 index 0000000000000000000000000000000000000000..b06826f214b2be071ac163c27654885aa89e7944 GIT binary patch literal 106379 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 Pk4iGW9dt?Wd{+5iG1v>r literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/pip3.exe b/Rahul/task3/pyvenv3.9/Scripts/pip3.exe new file mode 100644 index 0000000000000000000000000000000000000000..b06826f214b2be071ac163c27654885aa89e7944 GIT binary patch literal 106379 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 Pk4iGW9dt?Wd{+5iG1v>r literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/python.exe b/Rahul/task3/pyvenv3.9/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..7885ec4fa9f470f967a2445c36924fecd95b9ca8 GIT binary patch literal 543464 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ֺ@G@vMG(bx!L#Y%NXZ~=moD8plfR;{+RmHM+) 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 z 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

    LS;f( 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/Scripts/pythonw.exe b/Rahul/task3/pyvenv3.9/Scripts/pythonw.exe new file mode 100644 index 0000000000000000000000000000000000000000..5ffbf4dbc0de6fef7706f73f84e6702c5e62a547 GIT binary patch literal 542440 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%0A}g<87xGoc*e7)^}^Kj~MW}-S8nb z>48y(mL-jMeVu;pwqx4?DW`p}2G{RBrfANpE-Zr|4r+2|@YnU7YP`z&F!a&R_G3@% z3c4|1UCGN{O`~tMJwL*{@sg7df0z)y`}ybBAE)z8SmNfFBh8PrUE5$uOZTGgk5gYZ zNuS>ShOz66AIc7Xx^eHTbAz)?WV{xWoX3?v2(h1a=E=2#x1w64`%Jvo^@GD3ws$DJ z-RJDX;E!SwUx%h1{v`VGtt0itLWSeV2{mJG1av(;^z*$}j`Sa~q3G7MRUgTPI`{KW z4Ff+K^m^Ow1&@v%vY&tA==keBCOo?19zMCC|DcBRCg1&ZWskFi&P{2&u-=rX^UuCl zKGx{$1?!$edj4>CUrFwREr-Hi+je>~KH}wzr>mYfIcgH}t-5#puHl(Cg2un-dF$Kn zc6L6neduHD=k<48XxF1&&yn7jqP?c>P2Q!nxqIhUNmO{dD3=E|x9Ywh=IVLt)Cb$* z)5;DcOt~2Fjq8whKMiklfbv8?pZTLAOIJCc6KcepAuj>%b}3>$}!G9Xn~;)3ntu&&-Yw`m;s&C9~2;6F-YC zXtZUuk$qggk19i96*2Nu$@}|0Oc-b4Uej!hX`2xnY&LB6iFX*$An>O)&FysG=FFLO zsNAvRk4_sWC7wPt;rf)%hR$D~b*k{i^>y8^j4)fWJKr=QX;Q6dQ(9uzas2f!&bB#mszv?lhu04-+rF{Il|SYr z*Uf+Sv_{GNjjw0>w+oome?*7!nTMBs^+yle&p$D>zA@>fYm+(cGR_ zx3%rFH7vX^bXilE2R=E;9j6TmYkTa}zQ=~y&(BO7;CFSKYl};pr#~C|(V%sA+BpA| zVHK}6R{!zpL~Q3<2L5wiPM>dQ{qXs-2REDVT{C%E$;7=+yWKf))MvvE)sR6idR>|k zx*&YcrTezyukH$c@btT93-=Tay5U~y`F1A$*d+({jGOjsjA!=&OtGy}WF1t6B~zQ>Wj$5gXrc{k(|F zr!!)2b)5U)vbcM0@~*XaMw~03wEBba)Nc3ZiLG_}{CW9Rdc?+IWuNR_buzNHJs+=9 zV!9t3F|)|8-?&lnVV_y(b|gZ%+WP zdcF7i?*EnFd++}(Og3kCW_EUVb9QIWoOA44&;edak5TKhvB|E2&eS=Z^QShsz}@Th ztyP+1MVrccOLOZ;5m}}?W~8$fDyK8lN_3Q19%^M~auwT-jd3N+>=(N4fIw&`F=45xA>yAL%gE045i)dOb*IZQHHU89nFHanKN za!OTeRd)An2EK^=g8_DLT2Z#s8onr$>=8wwqK1AK5mZJ|+h_c|ER`-JP;*8rvFQ}- z+K9T>FrR4T!Ej=p?af?pDXZ2xjRJ-}UtPrDrK{|4iNrOw(=~*rt2;9K9~{CQv7n6` zc@ZS^KQXgj8J_qiS=g5~=Ko zQ4Q`+uh{ag$ZNrlh?{)TcUJrs^%K788=b-XQLOyEh2T_zJYRk)nzoq38E!5lx`Lxw zgS0hd0f7{~rDV_7JZIr7oAv-Bn_RkJd4k|rZhxe%_e((^MsxPOsz?#n>uBaoG?p)a z;V4e1Q?<8DQL^_Su0~%x|LSOIib+0*%CN;2`Kq!WW3{`J(0KVU8|w0eTS`>c^fnwH z%a%_Wbc+Fk96q^=?ejWqlWfllJ?7UM$L-!y^5jcuXLifhBGkZ+NSRDOfnfAo_0Ozg zqR#Vm*=HqZo%WaB*uWr+B8*)De?C@!qlP zqQ3?y$n4VV@}Jx2!I!c%>QHnZ@0q4RI_Wi@k4#wLowNHR17F%+%@k?{Gts1mFIDMI zD*G4}3{dXJC(O^w+?rA2dqq>>&De=G>Hz+68JJh8p_1<_zVMe6f_PJU9W$E(@9K_1 z4~8jPWvV+{Rjwm;0o)e8TVyaTaS3`qn&9lXaO*)&=eJW<8&2q=6vb}VFu00l_7o>` zweAG+rDN4a(rW48NbF1zsZTv&3##B#XdDi79@zBNi|}c6;Ft^3-Q63gi^lrl;veB4 zB}CBT^c88>6Ln@iV$jR_#!JVTVbo^5U(l_gb_1V*E#Zo{I?Uge)JmT8dKMX~K{Hz6 zQ!XE+L-Q&XTu!Ag7%lgpr`M*A2IaS+{k)+G291hUq^V)m2N)-952=E5)yRp5;+fVH z&l%$p_`C~DB0BciftUna~+4IQgrB;@OH&!q36Z{sXd2k z9xD>xHAh^FH=58fWpFy+XZEVMxVpw=qoSiXF*S?pN&e17uhomYd?yV)9G7}jRns%J zSkrkJ?Jl^J2=;ByKX_S>m&4OY>@mJ2rBROFeSx4`g%+AlJ~)YIe_&HI$(#|1dNwj5 z?|em!3$=P~R+#v0sD4&wq+TfZcG|-#Y||V5DiXsfLv(1~M-xs|{jl`L1)nl39r0aL z72!7HEoyF>%bA8Y?&Hma^zt(aHz#hIxo?aM*E&+0%b?irDq~xEZqdyW{d%}B1RqAg zYkd{PVp1I!sG6!1ACAt4T1}saGySOBCEHfp*Z?nStqMWnq&HKc)xB7O2I|;5js41D z`}(J(djpxNO_e98_%2tFiI%=)Se`IwrtUctpie@KjhphbtVJFLmb$nSjaezV(?)Jw zY$$h|?Hjl*Y`~u9>FkoMPcF(|AncDVOsc&Z;N>&Z)PeJO^^{qjzbl(=QF)~46_avpdz`ez3fj6E zih>{X>^Nj_u07Qd#ZllQZ-8nYlb7aSj}GqXQ;V+GrXA|kFrDeiXw{3uvA%g5$J?dZ z?lSMC)Ou4}R6t1~Dyo%b<`I>f$*U+XXZ*2&T=tVSXhN#{cnk}i`u7T=uVdGV9tgIhayR(IwagrKx$Gqp`>HO78p4R9q?5csb)}C!s{$x0as6|I? zb%Dm191EfDEIT2(R5Q6CXTjER!I6c}_IAnh3tI}F3)E(iE(@3$PD>gR_|7S8_VOXZ zt-I(HRkvsHMqI|JbBy=;r-pZX_JskvJkv03x|S-%MPbF^bfU)rzSZW(@dI)fve8D~ zqC~~XTMD@g1!y#L>xg`mWWlxhnf^B|S|7Uwf;nAPc`JnC_}MG450hv1-`DHW>@8GG z{SenJ{q!a8;jJ}O56dLao8?SohxVM!W%r=2@;N*rT#OsqD(kW9>dxG> zM4Mv6fta=92MoN2`Yng*Ew`n{u-Fc(#N$yZd>7A2ily(w6wi|`vp?w>^X{0a-nPlp zCo)k}i(ItZd&<{}v82#9;QMI4rAg zq3PnsBK`Tedg_aBS&6hd7-%+~RJs))8UBLEj=>5&onE|QtPngUAVc)Cxz3w7Gh8(_ zyxKQlGH+ZT9zhvuh zig^08GLz&Y2QB;v+J;ASG))>fxOSShGYrV!Pq}MK=8F~CU$wn4V^o%SA%u6`#Qw&G z;ccXy=UYWZsC23n4uqN|(;W43Gx9$0_PWCC=EoiBcuyN^pP+O-(6i@SDjM0|!v|7T ztsl0PgS}ta;=Og&@T;@-eec&K3)XdO2??KNg}PI(F)U0yqGgmTx#602OFnrzw^5To z==GFjo<3>hPE*)cEZS>1vdY+j!^N!d#-n#7GDN3@gRNoc-9?qXdYFY*6E{a^&bk*7 z=bKs^%BbN^^3JvMe4^|^d$})O_Gaxip89mubVS9?XGepK?`@(Uuf%#OnKYhWDb;byV-$mP3UcE ziWI)Do4n|JU9oaHB0ydvGQVbTVF&RvX>lK-&6WqSZ~FTBX{73#EMga45s#Oe9cZrz z^g1n5#H4t^NUTI+(#dgQ9WF7iFcYrmkzJab4eW++=PL8kKxr4_xLkAF20w_rzY|vTRM&U6OZCZGui1 zi;os=Az?;Xx;VJH#{GQ5;v2=OHaVAB{0GsNmR1|*xcS%d3POw>HNi&MJ*z;r0B); zWcoKM((Qwr?$yisb9>OGL0`2NwlvJK+lfY%YxvlEv=K?k54E^j0eaOMyqX$siq8S} zQWicDqKzg_>mx7r{A-*sWBkrym3l8l&CW|Vd0iF;iD}J6=d}sfCoUSl+@x}A=VPp$ zWS%B9%Qpr>gO6Edn#Us#>QMnEVV`s}>fPn zQTO(Fg#jCe@o$2A$R5|duL=5OC`K-j-%surdd_{IJ7Md|)OK zz3G{$BwEdx|I)Ynl10Koc86|-^p@9}S3!DkhcLGcC{DrCV ztNr)WiMzpvMB*E`9y#gpMmk!q?{Kd z*NiDon&7-9y+piD4nx$Lb)IwNHwIRLX@Wj%(+!h5&tChyZBRb$+e~48&FLQWWenYk z{WYgEFgY#b>@#> zQYJHJ+~tLa7|(RYSr;g}KdULEIz@jDzwmbS<@Uv$d@E=%%;9qby%os0OFtW7GK#7`#)>K6LVK*6K0yj8CtNJB>Dgv zxO>~Hxmi>5&epf%0s{=|uq{{eg61b_+(XczbEi!N4CbfXy)K_+F_GjooSqgbylh*X zg*{Z6%&+BL+~}h%YUH>GO`FHFuksg~{9KCrK3dIq5Bf&V_WR14=%Oo!99{3#K%YY* zZ$nRok{k&mt22;&i(3Ee)IM-iQ{t43JR?d$sW>_prJcP6CCWxfDeLzwKFvD&h>F9# zqxonDa9=?G5Y zu16>Eh6-Y36hL7A%+==>pIBG2O3Ge(EqIlS z;%I1&L9=5EQsgJ|3NX!wWu7yHq{y#%rZ~OcRJy9Bk^_~Q7(CXtM`qz3yHKuf8(s{1 zCp@(|tO#0V0%Q;3L96o9yhrorh`B*<+jGbnkKdac2cj<3bg74!acy61?!UXqD|w=I zqsN4JadK@%Q@PQJ*-3UYXAfJ4NG5MpDSpgs)BLOanoX_)>*y>3aV}~${OzimGlS>h zdkaUASb$)mQOV;~*tOe?v!E|{@TNDnf(NNswYNQTWKSs=9{;Xj&aoN$tUqPwV=cN@;F(>y?aF4>=XIh z89-n$Z)jVH1^#o^FF$nTbJE=r@yziRW2 z#n_7tx!}~t%h}j7+4lMHg|7a4vtoI-Z=U5qZDS*jS=x6o_k%;}yRyPJ*n=hE#RdA)|@e{NNYi-zpX!kbD;&hf(A@%)EO=yYn0fz;N21VX% z=m*BkvDX?b5G$48iT`M$IMab#@=WuM%27<__)AQ3nf&e{?8VHUOqqIJ+rq(po)aSZ z<(d;Q?%r|)=QmquhRlNIXB`7=Utux1coim(<9MQMm*yiy<|A8!4GZ&VnIP8>5r!M9 zsZpLjsuvTA264_kVP=>zNsfuLr76O5_7VEH7{T{VOcI^%6g&^x>nR+hQ?9~en8T|# zM7=R3M{IGa1{RwKcGJAI=W|^@fgVlC$iF1lDqUqjxY3sR{CGlx89k~ttS<(GiyvEc6kc7!g_0iN(&itBcE1}h zs2-V0m1Sk9)Ojw+c$uxM(L@!kr-O6WcJVcJ*&<5J1L&5R8k3tZL|hz#X=n*nLh_A^ zHTqt&F8h>fR(Ydt99~zl@c|cY+sVWi0iHQr=7G5WSVBX3`>V2GpGWYN>;-m|7B371 zPE;w_XOI}+_=J$ltwv8!Te(N7c4Vr=O`KG>5#1xv)h|bIec@fJXy#BnLgr1KX84rr z#W|L1*ToXz`;mTnVPJIW=iN*;7t_a9wR5zQ3aXd;1=~O>egk<;_*34Nt*Sc^@nh-BixUaY9cxR>zF|V}P;@QpM zB1_GyQI~Xr)h!lnpV)rkA8;G5WAxApExy$o>^Eb+wp8bHMZL#M`e#{pW%CqyS*CVk zd-}NMb`)nmMtv#->?HFIcB9jR@apRowMd4vwC5okyXykfuD7};1RQ$SNpnu!wGr=C zu;J(-y$!@t>--EVgZPHO#;gH9u2!lj8@*1c&)wuKi$rm-k(YdO zXdeEE#VyIAscj=gU(yzJxdv!H)wyq0@%P9a_G)a$+-++bZH*I0<(>&1NK73JbL{KI zZjtr9`a>kpxVGPbxOd#BJMtB2x^T)DcV5elbhhr-atsK!~%YN17< zPK3h-GBH{5oaSyX`it_BUM5@v+BFH(wi#0@BHkSh?K^6@2I9sXa92(EWbSNt9>3v( zwjLHu?Shd2PyP28{Y7+0tMZ{Ej%`O z%M1Oi^hz(ggSp5PTS$ggsaC4ENsRHc!oE*vn)5H?1N6sGNgnt4cxwj3{n7b^N3H#D z<;62A!ks6iQKNEw$9wAN@H)@?$KKd$)rY>dukK0`dWq#U z4V6mg@Pm7!o_6+d9i692SW_}4oP8nL+sj*a;sMhowyI?H$*&>3ufDKB>>P>aHs+zg~PGCYun^qOmx<8ZmnNAfaue~AYv)8;o#C3xrn|CX_&-?@?b3(%(jn<>~+ChvE7HwE%>B=g& zCrq}?P!IZ6>ff|)b0*Rjr(9G(!Bh6DzWsCrAL3TWZtBY@cVBleS;&pvd z`uzp~ou~SCpXcDMU$e7;JYqsKUDssX@-#QMe#RiX+8FZfR%nq}u$s5hZ4}!Pm;C0j zh3?GcE~za8^|?eJ`7bp!_DXS?MIwaMzWK_bdR7f-jAj(eht-8)tz!9;(;9kOT%4p2 z3{8a}Q6j~6OZ8UMXusIuTIES(s7n%ylcv&o&+D_dJyfp;uBsdsdJL}R7`^mf*%NYp zWKSOW{BsrFg)*xNZ^^@d(hFndKO$7ayrjo{z~g!5yp3Z4_u~2RZ%W<5Y6< zywEKx(dJos<5P>-U7Y0?uLJL6Hpd2f;lj{zrx);g1()~bRSCDsu#};l*9#La(gauc z>M__31P%2xEQakSIaqy`QPO1eM`21A5?N*jP3!3vKz?ub9k+^d$?%#%`B$ll*Ts7X zRasF(PN(t-K)>G0Nq+zP7)2KEjfstOMua+(I)^+$a7GBHmuy~*S&wM3HJ@s+ue{Cd zF`O@sdlzPy+RLroeIS0gF>b6wcprnWkvEF=OxYgtVLbXRE1g})hd>$_ch&5u>rT!R zX;&RX-A^dwj}}z^>U_7}oo!dE1tu?AGZW{@U^Y~=Tc{9P9Hb{n^3aj9nSZ_ryTz-G zqq7vN`N%B$?k3PQdc;)k+!%=l{>B1~QrbggtJUXsM*5f~m7_a{QSK?TfM>l$4F?ha za@lrFC}!Q^+LJ%+7VhEXTVyVkg*!Jp-5FAZ){uKOkvL7~Dm2bF?DhDBLI~Mt9rU)d zNt&f|wpN>2YR(H8c~C8k$!~@+C$v<9ZZ|IG>QP5z&q->%hz{t8K0kp=3@xWBk!Pc`TVH7eZz9wj`FcNTma1^J-^RPK zk#SJ%xM zRkmOSiEn5JvZI5IatgM1?U;BejoR!c>Rs$x)L@w*<*|#u3!aZPM+eiD-9ZB{t> zslDH|pC;T!_-e8rJRy9GGxNTl)hrO%*E&3n_RF04!bz~pF2v2~ zd`ZWZ?6dRYT;cfy82r;iB@bQw1;Cw$-dAc08k#&Kp#E4BnBSlrBOigPeEpB-xlpON0VL)UwEH}Cc5;_a$R3S*q>*in4>w0pG9v9oA7 zaWlm6CTgx@oS|~xnoWnl6`ht}AQ?PeF{*-1Zk3=ue|$R{xRxH zi8a>?zs*uRX|3a(M$Q(l>~m?i-^5A^o>@Ic^|jqyxtP;y@dzHjAXY$=^DTQdlXv7S z!#P>phf4=G<{nm-B9Aa*x=lP%-piSJu+PiSz-!`P9nsKAcf44bnzGQi(f5!t8+fbLwXcbnwSw2Wtc9-}XxZAW&>kVE zu;?5b>T9RrP3vPvFDU7o#iT>MxYv+=SEy64qZ~`6MQ~tAs8(LgelBvN3G=5S&nOs# zP|6ZPM>mn7kWV<;d!RExWyq1!6H@0E zPu!Kx>BZ#YvO?NA3{E=qgGGIBWFNprOC>*fTeEW-O(w?M#@xS!8 z0y|C0&TMMNtvBymT@{)llE{Wa zM9;{{xuuDkdYCg_v@j8pT|g&^^_>1%NM$m)*7|8IHTs*gN~d$KXS)<9yQjQM@Wm}O zehl3{d|VCNn57%BFRI2_zQm-yc0RY-JhK#@vYxC8;*s*x^z7!q&BQ6(ZO?bKnC9n6?edel)Gr-O!#k&ycrF{+*i4;hb#WV&k4o**%O2}%oNP68Ox^pA z)$`E0654bqp2v70*L;VEShdW!>_}TKN2sa0kZ8fgq20T8oA;F8^=jl;qul%{Wwz0Y z*SSyRbzi?<4SIU}y)Eyx-iSz=k9|mlk$=UHT*QrB^eXqzq4hJVUB^AJGBe@qgtPYc zY=MD+G=(nX9feXN${UPpPc;<@PmJX`1)Hq~5^G5SvIP?>r)LqN5jU8=hC?F_W;S zB`RZJPmm+Lkl^?9)K^iQTWZ1;PoraEj4;|zk*w`9O_-#))aB9-T$GB-6)Nb^_YOpv zt6F+lUzg?4_BZ1i5UzReF(K5c_a?qV!dDgZw&EF$L=kiI#D$Wxnd^kHK!dcwu1|Pw zT($y+GB?{}s5Un-C_3Y<^KnjPas~G+p(kKhN$7TBTW_i!NNoYZtGL(zE5+?DFB zFb?dhQ%DZFbj!1e{?pS!)_G1GuB#sQ>d|GaIa`E8*RgKZvDi6>fSm*k?WH%3zsMy|?L^IU1EOiE~p4sUU&S11`9qbW<0 zH|t5{aBX-S&SMf_YvW_`XxK*ZGzmu78Sx;YXzm|O#{A{p_R8U@7WV|DwH9W}a_}~0 z%3D;8(ipJ7mmPFgZYu9G)hD_*wp}M)ahm4fUsXxH>cU4ZsxHUAX_c2_EfSM68TTz~ zlk!XZE6z1qA7X*)LxmP*OxWx$T^?`9SWWSTxjd4*;~F-)J-zz#i8aMp zlG(uzWo{%I?9NvBq{wTrYgi6{Y}#WVT8lx0Xisw9gtd~B8!H5GrX1RmVLKp~#aJZm zmOap5az@;@=-c$}{CQK{!<@G4RTU^2a$}qJo(U zwQpO_P?f3L^jo)k5zMFr$fch02kCf7tI}`=3xzZ#eKJ$2Pl4Jz)|(tZuEb4~l>GK| z5fu;l@yKxAXsKJc>+$5g0IP55bv0v!L$M_{B+E1AKRWu5dD5o#Onm7N@Tw;0(X^5S zXCEB1BU2rtS*@b)LX$=sEm23)eSG#NoaF@u|9offOAeHI+7_?GOHFmsv;}sSKZM`kAmZ_=Stj7A=LUhtOQ`DNG&slAXnSC*8a`ksBhmR%PPN zKtGvdhZ^vyo9dtKaoJVY>U8(@e%sO2onI7o9iY1SAPI?wZeknpN*Uca)m5U>Wb%6s%3UKCOcIVNySX=ELr~AA@H0<@Y2&_lXb2S*9FvVX z)6QIS-ka4!mhS0+VV0vCPwuJ3ypQT!XE)_dt!@^89v;HqmQ6(Gl6D&{ws4lvDSUOg zU$bL1B^^o^jOqt*nY7AP%=7!K$( zUXP%qU9R4#vWNLl4ZIa>4YR21!xw8_o*0mVCu(se&R6!@tLk^pz%z2Gfkne=C0f&9 zL13|CfYyOqO^LQpfuvy3_V}pubrc`GGZY+C(NIn~WbOw9;ejFq9|-X7QTPed5BL8s z-&RT~hWBp+8yg$=K8!se+-e_)fDmbO07Tdx1ZX>P5NR(1p4&@+7{`O)1%y~e<&P@@dcqxK7)Cu^EWJOR7pJq|x#|oOC%7WKE zhrk=Z!w{4~mcI(fxp4%%_E!gaH;;n6TSwt@4Ud7MJL;hL&T)`_<0O3Vy)MYUs}G7F znSi`U7eK+|3-H-~$HCWdMez3CNl^A!50pQ<1WLlK!P^KM@IKNOR7S$%NC)`7N_$ZL z+#Wu!-w}L#;RHUtyb7w~+(Au(8>o!;2A>kVK=&Iv_^v!Mkb|JqL|Ov9Dxs zqJ<1jLO2aUtBnkF+sVM7gA7a|n8V}q@Ytl23@p0H;9NHuT=+%?R`B=|%&mLLz`lnJ z?E1*S3+8SxcNic8CkXC?WDph>1|lOPL3DI9c>Ve{C@wArB{4qWU92xCd+7^GU;2ac z_-o)p!Zq+Y(GOIm-UXl2gTa@yYXFmd7c}OEfQI}C&|L5Yd@YUygXIrEM|m7*D@y<^ z<;kG4A`Wy{C4=6Y*PyRHAM`imK_~?NP_95I%N+>*Lu3#zOa^xm7$JiP{ScsRk0FGN zk>Pvq$RKK*3|@?qK|HLFo`ByWButV)7K9x5y|lCxR8&*|3TW^QzN}#cB~J~jt_vji2;C{90a)OF@T>L1Dz1Jmp}#s5XKiE5XoSA zdK%2mOn|w$Ie?#?1o-(Guz;HdM8Z6ng!QvT62Rl}@E8Xci3HON5)5kV~~T0_b3p9nyHeeyV@Ul!punH;I4{7(cR zN1ZxJ;ehl(#fwZ1P*VDb^vet=B6xa1Exi5*3Lrn%J$337lz^gyrE&PReX8Fkvj>#< z@>~~TK;Zy+P*m}nQt^ite@9NeL`^0?*VjcjoIH7Ind*mZdG1hA<@_m;$+=eqn3-3f zdv3hM0MP;*2Q}3rN0gDtr0Vs3BK?M*OimSIWo2e&hV;h96bT>$3Wuf11Sg}$N)LWZ zFVD)#x^|iVJBMX8s!%4AQou5U-_a-V@E{Dx!f2!C#$Ouhu^5ebAdm+6i5^_K?n2N7;A3Gh4mT|7KI+z5k& zJI2QP6do{Sk}{Y6V4(Zg^pG5C05Xus^h2l-76=0hhn3l=_LuZ2+qY9VKpk8n2jBEt zN#4fDWc;qizobvvwvCSussPcUpi@FlE=+lOIXSuH=Y9zNvKs%AK6m>zJ|4(`GK#Fs zt6`$2r-6y_T+SVe1c(-vXVCBTw;d*goT5WGkq~->13e8_s^5wl_5ZScvN)uNA}lk2 z6OqCIk$~oG?DBj*?*G^H*8JPIBN|v51mu^n!hoKhY_i1QRM3y}=gbf30ofhWZ{PNP z5PoDplK@AQGLW%Umg*aPNe6;SBmWH@EABtH1F{&L7r0LXwc zh)bim!T@RzX&;$Ok;~`7-_Sz_u6uT@Fj)F6epdlP4>{afZvJ=e=RgLDSFL1_Bqb#Q zpLKLVcx4diU)}M)apO+Z3ih#KN=3ZI%F_8e`BzSe{a85sm-IE!A9ky5u1knmgjABO*juL%8t zQ2QT7kzw^erB5J}6_$UC6dk1gw*8eJ|D2P<`1zOUk*T~ikI4UoK6lUdz3z6DA2a2* zxR&|yKcXjJMJ6&bkC%UoyO+rStpA?{UpXR^pC}-|#pSbsfGu3vD0P1tzZHsKayVJ? z!rZUg+u7MWJ$?$0mh1mS|MT$w!6lC}-Bv!}NpLCsO8>*4!>=n?f1Uq5Ju>(HKK)An z_t<}~{SW;wzyCk0=x#@$m1*|3{P(r1Y=;sDC*BJcu_lGc|h<4{<5*ApX%` zk$o@!xqWjpb8{%ba_x7dzid7J!B6xQf+gx@TG)ZVOAq4zpy&8)TKC&hj!m05Hf-9o zkz?Zqjurj?9`X038$>s8h$MM=-^%f? z?XSqSBIo}%Ic0$U!3W|e-UGoL!goLM56^}D(NBEt+&OUd>QxYWQHM?LDpU9I}X$bh4=Kp>)>q*d0OoD!55>RR+0c8vcs6#l?OajLsoM<7zch-==sWuYy6O({ZD+!oFFz6rwV+fZa zn0At&ub2eRcawlM#ZL_LUJ`JG{$u-o67YoO4g)0UBPIcF2vJc{;N{DgAUQc1q^GBY zqM{;Dl@b6NGH!#W%s^24`VMHy4h9t|_rQnLd*EaGeemh^ebAWm7&I2gfTmK!7n}k* zK4pQ<53fLHRXXVU{04N_LnP+3_CzJC1*IyySQ;MaFx zpydM??f3)+v0uPgR~;DYX$Av*STH?=1@EWGpnQe|K2DRt$5}G?JWB$#5ZdNRpaVw& z{r&x5XlMvb4RwK;k#6Yw?FS>TKX_}}m(Ft$Jf)9`q9 zb{630CIMmD?>hm@r=Z_=ZrSg8v4)^!= z^n03~m9!}@u9y;h>Q&CfX{4WWz{GdPVD5OwQOHbE4 z_OJ0>H8qzAG_$f!Dy9F8}Z+z~#TJ^8x}$6A&M10Jebm>Rv951%gh|&mD`EloTu^v}2_UD=jcY>mizT`;Py| z1j@=fCnPAiLO^K%wh)aB#%YQ;KkGj!DI>$~02FDZ4@(k78yOiH|8~A11X&r$8P8#Q z^!)j*B_+kcbuTI4xAQqEIT`+E$-*upeO~H9Ojc5c*|K4X=<^T#EbA#tR!~$54jb>< zwMZXgGLn*h#Q#G-%X-R^-|;-_3T2#GApzw76aF9iS^k!FUholukBl=bBUjch{Qr!9 zS75KyidI=|Ap5`PpPc0+A-FtlqPAJ-{|Y||o)MnkcXG6M40@iGl>}Ax6aOFd^IfzI zNCF`VicU#?p`Y*gzkc}<|JS--j+2q&e}GRR|F`jzDP8z!KK#=DZx6roH;sPw@BEpr z%r}!e(2H>AU#9Q)rgzNE{{cSD?t}kU+O@oW=loY`^S({{_U+rOuzBhCML}Qp_e4M9 zFH!wB`Gk8Q_*_>2U|vGAl>1OE<*<-a{^#6#xg6%5h@Rj}Unn_zj|L@&6X&NKqEL?i zY5pspmE)Cm7?%0|UzjhMsuVp@wwZr*jM%As5ELPNw^M(3U&)VlDiY81Yb?``_UTIe z(yL!$ml8Yrs!?oFiXD232h`u$0h%5k_->14Ui%|{Df_0{a{SUU7{8m`Oo`h)f)Icy2m_eH2+&fN2wKaNK>LSe&`@0fdOoLvp1NGn3*&{Z!I&i<$m<5= z69DbRS1|r31;zxWLCAu(U%~{m1tFwEyRW3A1k}`*fjZ1*(AwI%Z2Oggq1H+;)bmJFU>wjKwEbW_5EjM(A$H%)Xb*&5fP?Wp zy)c$%5XSZ_*>qEsSRMk5<(YuC+zhnoC~-Us1VE(NbpQS0c;HXsKM87pasv6YCVY|f z=i=oOUjqe^T_Oqwe}UnvBOJE-T6R2n(a>VOeR2u^(wfSQnAud%dqZ(`s0MSW$5W zVVBiU^#V*xOd5wN2v7CjhARjVWB2|a>)pAzxtW+$Ev>AsSY0tZ zEP?d&$9i8r3Ien=XlZHL%@iSm#834*`FOZFn3$lgLrYD~ZVV9+CBpV${0dC=M`1nE z1Oo#dM7X4=C}a4e{4P%Xe6R`F2}Yy^SbrGN@pt)M+}+P=X`RqiSKp3^;B0Mu5mx_D zkLb|>HUT+61XmY#s^xl0^GhENJZIIG5Zql{R_a#<0OqcIXVef5j9YzwTkos6174Tq zX4-b)_w_Emz77}8UT}c5f6ydj45%fgeCM%Ff5cV)xHpM+ zSE9sIBeB#U0>wb>LrLftKMFE@kvQs~W2tj)9s}98H9^7cW1ukT6v(+}1_~Y+gY-M* zAoJc?kn`|7CB6N-+5RIv9LRy9eqr?*mNUBT$e|0eRv!SecDeTJcISo5MDyR zb}IB;rw>nq%qbGcnIuy7ElBM0=g*%(U0od|ei`vw4>Xm)yU0I+v2V?wq<;`pKp%BA z^h-Y^irX$ zJSCkwp>|nP{D8ipzM-)(!s?tWlDyOy=(MCH#Ss$WUDB}eAo3@2g8nYj4=ePSZQ zkYK6YlbxM`*Hm9yTU+t~B(eEk&Iv16w`}3zk<*2|DCKrAxeBneGs9JvhK5Q3HjnUe zgm&3^M-6Uv_BC+9r=dC|C8_^i9#>aO4K?WdWum1yWM*zpDM$DqNpn3nLZRYy7U|g% zAB2~s>cur{=;@BS!uOx8$b|bR+N8=K*`S_@~mZni4XZ$N?W(@+=i6%{hD?N@gwE`ERl)4 zfIPwS9ZKM$QUY208IW=WX#OpL3mIh}jjUs=5cnXhtYh%YAL)m6EbPiY%6&uO))JI! zz%Q>#gO@I{lxx1P+~9p%9?1Pc3Lq7(Uuh^MxNaSy-20PtO9Q-y_xK>!YI7f)1$m)o zK~b13W&J6CW=^>#`~Eq+Ci@azhfVSZ%^9BH2(*=v`*V&$K<>>!Y~<7MJ{&`68yiF0 z*aCtL1jI%@vuqd@KXWUp|4T_HJ+u(mfm^f)|50xSqgkpU?(Qg4aYdp*@^Cfrsk}nX-P2 zzd6#)?#5exJyWY zpO;s0seUaJtC*OGqyVo1*n9NwVO7qxO!Ux1lo2?xRIj{m12;P@^&wfv57xtUU;|ui z)b}p)KYmU;R_-87D{y(e$kh+0@{*G2M3vL1HvwqA`NE{HlDm6$OlJTtiEH zh;PTedxbK`;^tdj67W48j<&kbq;>n-JgQ9yBza9~FB^F1Y=a)p9wH9yhOf?~{a^8~ z_4bu$*L17vs!_gG(d;(dNow!X(^`~Rm8X^H6Xx|FkPaJXEii9&&!dmlcmNz%5z5o|S5A)>kFdXuTo5kSkfF>#?a-CZesoCZr`ovr2>BH9h?}Am^ludcm&MszOy@-)p z9276N9w%1W7g&zU8lx_VjkUaH*Xtaev=(;dyj9`p&Dk%HgjX|E025Y zSNZT6a_<9v7cC(3=<7%)*56nI3!mhfF*(gd0Tc>j?>_m_(V7t4qc@E&f^@Qtt+Jn`2*ws zZG{bsy-^bI6*7k7{K_9YJNddNT?@mN-UuF`{*A~#sNn{he#ZsgJLw;)`XbZ^hb*HN z-)$=C>@+V7XBEnr-3ZFL&!i*&+-JXN%5_DAqNebkgK@f-Txp&pQ$Mvnc!o;_d+Qee zjx9z(Y~LJmL-zUKkOa~8w<~&XRrD~6xE3EQe|&UDiIl2DxQb|K_-x$Tb3mDo`|Qyj z>=5CEn7bJK&i@epf9Q4iaBg2l(<(SpW(T7$W@_)VeDv`1h5Mf`SUzKeiahfM%{7y>y&zCW|~#i@ka8-y6`4I>KjzSjg^?va(a+f{dIP4I~xoa;sbf&JX!k#Ciy zjqIoL^tR|TTqKJ#W>U-Gu@v08N8cHfR_iBIFlo~Pz-rg4EI$%#nISPoYqxR6&+oS1x~JO#CSK9MQ-nL9c`v9 ze`y)u9&%ln$<+9C8H?uRH5!h=4RD+a=A^Hfhv!vlTeg4|Jow3&h?8tM4z=zJU#eUL2-R`TDdb(8!dc&Ub z+NP!(PoF-087Z-YhHpoNMKSM%*KV?eFRY~5+{3OmSVp^x%6Ge8haME~=JL?hBAyH> z%X?J%nC)<`Xr`xKP>evFUBz~>?x344-EA0=(wkV4dy-L$ZM$~`?UzBP`Y^BoXq8G; zWZwU5PaJwmlQVqV>)_tK*QTP3c|zXtX`C2O;ZV@?7hbH1jV`OZ?is)rEck*d|AN!x z`;^13-LZ#Vhc~V7Q7|r|qA7fql}eMK^Xif&!v}DSz4F|bjT0V|wSq-%X);^r~;wL4~vFfVttHL~M@r1g7#xFB>GodQPRcWF%}nAbM&I%_AUeF~?e=b|XKo)TJ7*p|)*MWpi>XN3 zP8EJ%0=DlzxvO~a_*yLPb9Jf68;xjJEsaT+#(J;r^&z*4(St=(mwb&wF3p_TpLR3S zi&=8fUFP_~d9?#fkTQLq43{8#&of81Yp67oy$Oh0aAG6hi(7aTw?5@+IP-`qOQBE2 zRUV()7xww|T@qqreA(q4=}06zy;ekh0jO@<@~+JGAf2sYV{qBD^!x8loi+iVDCxbV&1<0PSYk!Wi3mxhiJ+c zQjsMh5eiYX)22dbnMBe;h|;2I-#3v&HQJ=85Jl3Wl+vbcw0-~Q&NPf(c|7m^-uwN3 z@AkQUXTJ0O-h0lu=bn4+z31FhNHywtwaY;D#PSs-ZRu870wCIy-z<{lEU5H2iBI8D ztSnYdqMdi=*f!ec#OI?<@5{U9zdW$b_}q@HXMINZKR-U3Sl3fct1K-!(wq?})fQcC z?wd)?NUBmE{%Yn0=gpNJT*u2b-ETyFe#x`giBK?C)=AT|v#hV~eC1_}ypMqnl}!&+ zV&2w{PR(|-6|#IMS95@JM{aa#y|>zj7KP+n?lim2oq{7a&r{(~y-b))y*SmH@H}(n z_@j$+4KP6{Y$D;~3JK2LJ$223@)_j%7}awLfxYCWhRqdS$H$*~GI4V!oCW`4e+)_5 z=K;~?)!{c~IwXPwdHlo0Y{fQ~+vi)0YaDBNt?aTYHODj4OgzzFeZ`y!E)-R}5LENs z^%JJ4$28vydBUk7QMBH#Wv~2N$48j`hLGIp^ZIrLRD0#A@+IaC-z6qG-fz*^vfmJViNLpK_OsnpKB37XY-8P>rYidArtV%}-S&AO zA7}5L7Wayq((7g@eH@l~^G(2TCtB{@JuNG>!>YFiEh=8NxbCj+6B3&qZ8te;@12+T zhQ(jIeYnU!Ku*Rozv|Po6E_w3G7EQ1r>(x>{E&ScKygj9qcIPkxH>2Kp5E9x6PdvJ zac)6H_Uq#gK2w$siNU! zT25}3nW@8?qh5~gwvR%_znNu{?{w91-9^Qq3JxDOzL8I|vmI(y)cAQP=zUIDm2O*a zb+A(@%z3n;Si`Ko0;6Wz!&514)knoIsaYR5VL9)e&BIB264)B2m6E}{9=#{Kt(~`? z%0Cw|S?GF(T>jJohvyJA2g{mHy}dZz z^+|QhRds1Q1H~!+CBfZVJGt&Yc<4)e^4w|-|HPK=SFKq=6?Wvc$#Gndg{&(`myg)z z_q0zcxK^OvBLO@xp~;#jzj4*Bx7$ajs-~nYq$>2J9owncxmr|iWq`0&>vA4FEf^z- zM%pJi9$VvYR!hZq3cNLY%j0d6CHvuW8F9|+mfGRxTCT`6KB(17^4KdFGW_VHRgt3d z8xQku>Ey5x);9x{L}1ux(xiz#SzA&|ZEaHU6EhEvIFWZL-)!CMnI9L#DLG=uRHhyqmHt_PxChf!o+T?dXDt%5%GV z4wRP9&~bC(&r~$ooAMcs>PydTH&okVcWi2!M63?zZv`_( zo=A7NcF!$_Tahn*yEOz{IhZTAjC5k{)5jno_uM*NaK23C*8LrB-uX)|OeoT?>s(T* zVx(Bi`F@{u>l#j33uVJw_q`W=0vs1^^!5|*IMDX2YB59#*|zG1+Qr7XigLHqUP)HM z&&!Qk<_n${^e}9z93xX^le}Ma6K6q{T*mZUY+D^~PQh;|#ZZ&iHCd~@|# zD!Za0imq87DVkmBxsPi@bL|D?qUaPwd^n6v(@voG1-ygkQVQ0L5+{RZ|P0OytR6d>3ZRMD{zG(hh zvR?UwedgQd!or|HNrGYeyNfax($Ddp+de^1cFZODnXd9PC-#khUK{$6b80fpZ=6kL z(fmSkU!S$X+xvoE%Z#(oIe2g;+?_g!x!lF&q%7CXvtc{IR!ibl8jMX-4=pNH*>9Y* z-%luV@10Ra>Ncw+Ys%hvcdG0eB`8b0B0m$9gO@v+Je_XThIFGr-;Qskl4JOoshrKC zH9ZTi8f@OMi$ zDgVCHdw1iyt1EHyn#cQ}TiGA(@ww&P7QUcUI&^!?hjyMImk?V&u@5g*HDn{FXc)>` z3h_$Re3T}T8B8sJ;?e#XVH8IZSvN`&#YYMOKU7SB|sfct&+nO z*c$3>^X?GNpAC+BhZ(*1&OhK>T6<@c1etUCC3)fNg{en&Rb^z1Xnfl-vC-zeaInO3 zd9H+u_3!L9XXah1NZ^t*6AV<|Sq7-;>^dykK}PUv6k+ zmxbmnHU3nQ?Aj5V#rl*+h;C0*QW5g7WS4Kk-tW_#H1bWxa+|Z_9V_>a9LsKi^*G=K z*<+=T*F2}aO+PiZrTeaQiY3+4zuIsA)ck78L!VziU3Zl;ctYw;eGks@bJe<}H_5!3 zra`Nh&7$p3V<%5Nk{8uvID;6vsKw&VyuO-I-Wj^aHashN$L*J^9v?Ej?x5$AJqz8& z*R{87+IPsPx7Pn8v2|jy?Cw#S)ad~t<_jI(>YuxkHOE$S8R6B8;M1I#>Q-VlRwpky zKAy8Dp;6i%hv2QGU6viza;ruuj6E0YGEe^Qao(p?sf-U2%fc3no2VL8F$T zQ|6B)I*r{{Td7<7+`IbYf%2--gtXM0<(*Om0L7Vx@D#fl%Ct|(+AZhCEQpcPn0>Wk zmbJpI`}<>>c%D24mkkkjO<(YkbXuGpjXFHbI;wgUvTi#tt7db!KJI}P(KxhF3W zvl4aMFr!aCxckhriLLGXTqH^#2K62{p^ zu2{L!fj#dd3;$czT=j!8EIf;bEIs86JM4(?S%Kb@5nc zeB(&3Z|CIaP7qoA8F_d0Q`5Kwj{NdzmotqeNMbEcN7rd zxN5&i9tZbqzbDn<$98gs+o{%8eT(6Rv(5EBaq9<7S?aO6!=Yie-*CyA(!6u_siQPZ zOk&?|;pR|ov(Yo3n68;;J45JkBQe2k-jw14YjYLWJ^H-EtbpV3tx6DTZ(K}9K3;K> zzf<(g0bGCh`|M$NHI-5$Zpxn3F74Xx`9|@MplZVPx5La&Ns9@ODtEzzFi$E*Uy@K- zlAzl?&Zu?V+J?Fpj=nxJ_orLWvNIT$pm$=qZYE*T9Z8PWNoM+;ekX~~uZkJzkYaf@ z&Z<;hN>WjLEEJ|xTW4*Oe$3vGYWrcIZ0FuBTV!~j9K_-YUWEH5&4Kp(salNET-_K|2dy=qOLRK?L{)ihyOwgNFI{M7l29SrwQlcoG4t^voJz#V z8DzVFoYfyxdaiEBoj=S&Ff%_>B4Al;EVQNlog23|Z>-2%*=p{;fM=<*tomHu#no8$ zWDzMbs@JmRMMPIZA$EnJWqRVHw8ZS*)wcUMFQ9nH%sNzB1^r<`b3 z>H^Q*rM(=3bIsMY$pGNd`6 zTIrf@x4Ew|G2(JAr^$aW%m~4-0LTvBuvsJXknK$SK>Ahf+$siPchtFgUjKX``ReS)E#3BC$Ct& z>E=^MW%1d%clQwEo%g$?^-fadR_jf;t(qWzzHh74E~%zn9N_}qbGMXc%`(uPq%g5Y z_N1@jvX>YtcM{>_q#MmJc0k)Jc#{)-f}Ia~>QW5R|MIo&>b=^3eOi&NK3sON9h8pS51Y!UBz<2I~OPJg(9O>*hN$wAP7 z+7H~_6-S|M)eNyc$=+T4#NB*P6)>*FVqP`eJ>qf|uiPzH?8muFt() zS?HL0Bt|9lT7ni^8LcWv^@OA8)`yQHs5HAY_sVHXVo$G0%gr!X&9S{3{dii5QIwxD z*+E>8dj7m%m6MHB>eEkak`#Na*>tpz?pRhjC*wPyq#u^q~yFys&(9nZ=Y&3CF&T92NJKffE z5aJyJs;{o?S->3Acg>1fd7D?gn>I^TqF{bZ`K!}3vvkjsJ8gON)pj?HPKbAz^fJ$@@6`8;?`t<~54%7=4jb{uyw}P@W1~y}KB-UeV_q6sk%JA;LoA z%rQs8E@(J(^9ePCv9Bl@U0eS__Kn2O;S>}7hL$F_yYHH3DIHBNyG5~;j#->%`^MQY zh7)N&v%SP@OwN~WrEZ?1h(9%*6ZM93OMc`yo4Xeh)=oCwdwj)GW3>w-=X1I`=ij_u z-7}Na)ta`F#@3lJ-geIhUg@)q+VkFAKiHwQP*Coeq0)%d4B}bs!_Y?Kk5cm8uKC_-(B>7CouaR>B3au7 z=?UT28}IeF%r|M!t{2~6C9D&luFKQex>cI6*?2>RV7K*|MrF!2_Aa${r+S~M`4_UA z9rsK(-G1IfRN99o=h3LlD=U87^+QTZ<0#7mxu1(;4^mUir1n}!3;EhtYmei9@TA^? zGkYuXv$*i7M3aV|$MdzHa@9THx13b(ke0r<&@i&yYlEK_#(&W3+T}d=0FTD`HEy}f zE-cL9a`UK<)E?d(#A~od{Z7$ym)5gy7bO$3KhDd84HFs5)7(4U$173Ri*t%>DACE3 zHP>Gn(2~L*$`0s#kk3rc6wESLcXg1_Qm#m|G2S09fLpY4=sn+Zv1J6QeU8Sb)xyUm zsBh10DP9#?W*W|?m$|0%mCn>pvxyFTCEOZDx?cOe$0>F`I>dX@?xINFr%%B}Vp%pg z^{hkYV!20c@n^YDSQjSxKHVNwu%KkgNlN|>#Wy_*c`)x0lnZU0w;s&On-|<2e(%AC z1yfb;m`kU`RjY4}ryaJr>x?<-+GS-lrk;G3A9WrV?0x60 zm4XVXxs{!0W;V5lbLzI9x(CA^H*BhKYAQQ(>}av?RIc?Y$`+W;KJj*#6-C`?^V+p- z`RWmC?rgc*eJPgn@Kz9J4(($p^Uq2WZ)!KJnB;hNY*853`Xkq!N`|f17%Ou|Gu&I< znTES}-ZmGnNVlAYyHhuTvhT!^^IrSL5*-BUxiu(U`zvFr zIHv~C?#{D*r6(YeaKE~}P6*SK>AVx~7qC2*(EA{|VFABrl)vfygw~Sx^E%V(dt_b` z0u|43NRUJ0E@0!^96UQ`^~HvCd#}h_X~sXkZC*0ow&)2U@8ohS;u(zE{aF42vV7E?KgI3Jon+Ge0~{C>Lm3$ z@~Uxo-@JwVA?89xUatNY_8B`=m%K zDaL!-#C?$h9!_tgm)w^bJNU(@AD(Aj|Lp1vqdARSRhD@v z@nZ{azwHQ;8C8&sEt%$SZnJl$#`J|{~3X!xh- zmDK!6I&!jR8pJNUeIZDAO)w`th|d9SPONsEtoMUTXkAHR7L04uIrVqLKP zHhZ>NX4<7I_joHjbW`ZbSzCF%STm8TiTSVHb2p)_o4GX&V1+Prn77$slF2(q zYj;|NSEKSNhqRlDJ>{~x_ap?I*YAG`Zq8bC(54KXKnXb?y{b3fqfn{#@IY zQMcq)vmeSOTJ`R{ekFSHk(EbeglpojD>u!u?h{BgK^pH2)4P)^k6fIfh*`V~C)}E) zDW6|8cC{1NnT`WwvipXw$)X%}fR*Ri-K+b0%9xp(@qS=leX#{OQ7eRzqW zW{l)iJ$9uT1~bSoFnaA0o9Cn|6`Lq($hEB}Xsmna$O&UskD6zHQN@@$@zfG=Udn{f z^@}^IwiA6_VgB#0HzjASKIKrxe{`;x`-R~x_k9((T-~Ov z9ZupdEPAj%$|2LVutUWErRSzu(_el(m*kt0kM|~Q@H4#Y>tvJQm~KNJK?yD%K^8B! znh-rYqiI3$&Cs(3mubl}`l>5u@Yx94)_roQruytUbR-Cx!#1Ta{P9MW3yD67Q(aqk zmqb2LZ^HL2K|q=0Ma?#O^h&{`tH(&vruL9=^AV>qsie@!Piz}zy{05by6d^Hoy|AB z|2p7syhm_JzA$ISGy|38N_9o9wZ!-P-zTR~CCMx46K>5#WDDntEAG)8<+H5yGV{+~ z^`}iUnBk;uHStKZ)m-D+X-XFA2Fe#=-&iiMqm1^qK4ocA zCj;lMEYEKe)ZALX3uambnE*2E!dkY}wepDZaVU*8+PK62#=e|$`bk@JqB<;ho#xr$ zzCo0$@z(ZJ^TvfP`s3Px?M9c5Bv z8xnoF>-y%bqR*YMr*md+OtL`kgpM`iBg;NWFR6^VzO8vC)%K%;YC#qMv%>aq?KdY9 z?$w=E8WkRsTU5L5%Iw=ux%SmyxyEdjrPii4x%F?#fC(>{AAxmwapcQh}JoD&7xvT=3Yi(aeXf_I1eohc{hrKdC%+ zZLy)(mhK8W3o%mXXbRpd>tEKiYd5x6K=b9f6|RKE*!9hv&f@PH(xxZ-7}5$#ipu4T z)$LR+dS`T~TsYY2$NzDvPt6V-p<=mO6PE zrwFEgeqvl#>NY)`=5|STADh(~E_Filkt|iphUJ$Civ_&RdOqsPq~A$tU*LSO=ph2(~-u!w~jnnQdFQmYkJbXdo9t&lZSgPHIztE zojF>f+tx3J`eN_ie0+(1(o;E#;93#iT)FTP7CF-j-$N|AFH-Wy?OXSZZ2+ZDauwys#?clvyu z?bp+(kJR<+p1p`U96vkiwSG=v+DQSb944gY+^cz;1F#`*jhaloliF+e=4jDANxY{u z?#R3KqPuSfaxUo}8@h1Id{5!z6bP`A8+ZE^X?x3FMMIPQ&nG)JPszqS9WGtse*^J> zP(Yr7qM~zG=c^q2{Ha>?mL7jsclXnh5~q%iW29Z}*Z0|aa__jaC7W%ez=-*o|C{bg9!1XcCsyr);l<_puWNF>btb?bnC&6^obh%JT5TGW z!bJ4rmI}WdR<)jN`7*%!)m%$1DBMeDc-v?3tE!VoO{Hgx^gG+jdH&0wJCfOa+p!SJ*v_2VKYb2XC>4W0^O5M_Z*5RSE2&O@k z7rJTY5|8(87pkoXWm!qmeo_v11wf2cb zR`BVaYJ0)F%DXT)>(ra%NMFCC!unGN??T+&rRCyXJUE+7skT*VKRMwk;BWleF^p{#`()Sx9`0m^Eu|0 zG`z+e&^&MMvdEFOpXVQs*>g#DNwTGft+eJo%-)zQtGD(Nkt>z$@nn*&!UE2d3rW@4 z1e)DNo_ZcIK}Z)^IjWqHKO)(Ef)4xrll$Cd4+sw1aX=vYshzU>>@A08U{$tOzQhY< z`&3_ET1EKSEk!a-ttr}euwu@EOZn-}abr48*9~8l=Y-Yt$YFgky7sVnwIL<=LzGkM z7JcjJ83oq@CUU!(F4m8(CrIh-<$PQ^;+F3=?ka72+w*hCm&({6a!vwPU^XqbDmOuG z>OtpT>V8!#Fhip*Hzqbu#G1}GY06-VZ{HdCHMJ9m?Rb+H>k<-H`%E;A*RE>1M&=#c z3^nCwP3#&e%QA7Jm7g-k<{Y<}jB7t$j1y%$&t9uY_Lwbt_*`db`7N0Hxs4ZZ*{|`T z$e@yo9J9oZMgaT1b&@qxuww+(k3RExC->@VeB{mB)p3d3AhFMIkL&Z{ao*e;+XxD& zqi)6As+M9eACaX>J@K$hb_T|VDc#rUZF+q7Ae90bMJu_0NkvTZY}m?Iy>wPyNuHt3b#ud#5UjwN-TSEZNh`TM3r<;O zkozKRZ7&i;Kj_-s6Vy~$Um8vVa?F&hNyZY`R1NdJIWLqFoO?!>@77zlPh^MUBA!xB zukCvloZ+RIO)<$S8>hq56URke?i^>IN{~M@f^70&xy%^qJM8`E*TQD(lGZCpUBc8w zigTq;T3uXR?=XGM>wJt;db>wmtJuW@nDGJUWWIgr{dSyndw#&7}WZJ0YLD`9=X&1`^EYOW_W8SAn$^dQW>!JZ|= znKhMYs?0sRZBJX5IOQ;rR5M*8Z?El{)CU*R_{g~enp^GPBzl51oIr)QFQHro+qH9- z>_m^^QJbYWHcNACPCcE((RJC0+_;)zMl9&f+O)1Ib_})JInG_~(7t_OU=cZ%XjevP zZVVruE5tSX4pCW*O?f5k0c7SH%Qd!ZHprInP^`uk+)XGbiMU9N@t%s&b}ZV`c>=1W z*_&C9Bu^r=*{d89l5gVD>0n!Qj{JC<#(QB`LAFn0ILxxQvYn`S<(X$jJ2>U+!(+3$ zZP(gVRQQHvay$(gKjU<++66Y+2+fZV4@^)K0}C@*lf12j=8;%a)bYKCDB%9h0}d!>qZ>Z5Cx6 zE4(MZO=54K##)~WZ!xasZP-*!4a@C1#Q2faAN&QTLe_!o2l*vr8f0c_fe!_c(HYYkkiVQy z`%lN~_uvCuWFRL){+ZMZ58r{j{P)WLr~VGGqXT2FL8d2&%Y#GAAROWk;Ri}_d~-35 zL+mA7<^|)k4%~wnL^zxYf_L>X-=bgL;6KMd70;pI0+@pk^v!@b#8tw#mf$$VmBPV) z4PRS?;}CC(jys$ML#G3x1v77e->=o;cn9JFMhYCNo`2$f0C_6{yQ&MvwaRfE;%CwE z-~1ZKHvtX6mmG()Z}2scWq}T>fCrekvtIYZdl1u!nYRBEaUBdM0Qf#)VT)=US9y!$ zaE=cSzKXaK@W2+x3P1<>eqNC4=LKn?!B(J4emjmsJS-eyjL~TV@xz!Yd9b?viT42D zHi*lGLwq!RZyAoO0u8`V6IX_ectH_pfOrA*2gD1gKdb>h2>QrG701&*G4Mxpp)vYF z$3GF*!C*pI-zC3E^J=`0G{SxHiy06KJ4;c%i>PAYRzj&kH{y8-Epl@J+}6?5wM+ zi$e@Uytud+2R~+n@;B)j;C~p}645{hXn=U(KtC^_{(yJ^^#^shs=;*+@PrEFUBDB{ z&^O>5G+Yt-1=15Bw%=e0N?{!M0#~;0F~y&aJH*SxA?D#=Fnzg)@HYlNHUJtNf~?!m z3#dOJUO@dp8?Jv+N`i8DhN1xze~5>O{~5Wrx0en!#8$*1E+r1JI`QD+D{+Vqiu;=` z!y%3(4)GjuID-y12AO6EbU-v<@&f7)KPwy2IEi!xG#((ipa^_{bV=}~XQr_K1pZxJ z3}%G*lQ_gC#o>$t9Acs3A;(tWaJC>0aZ>TjkkfSh;p`h6yAL3-v=?yVdaX8ljk2om}G?2m}CM*tTKj3hV(Qoi)(qJGj z{2|#0?LJU%L}O)tO8hJFXUe&@hAJG+vcRLQWNX?%T(%{c(|L*Q?dM%|{;dmT*4bVXLTN+p}Xpj|5#*0Az zW5t{GGwKh&CmZ*c{kYyJ19Bm+jX?nTfB3J$zo&;GY#=5t4(D&-aW<=QIM)P^hJJwf zARO@l&>+c88*hP@fOx+{(tuSqvhuqf(__Jgq#9n5mH-8oWr~-%=jNduC9=~n34rm}pr$KB#AF$E@ zVo>AlJ-ztFh99HBugXRh(3$#E_g{g3XD28$kRawVo@l?Jp9X6gG(fTd(ZEXfn=t|6 zSL2^yyi9{Rt$QQPZ$M6eFGDrM_{a^kCWfg8wbipG?!wgzY_nBrWzdLmG{$N z9q_?gJRb2uKMkVkH269uKn!ynVshinwQupy9iM(bcede3h(j!F9MNMiz441|1ihJc zPTfBSupG?7pv0dc|C#OI)!vNXJHN4?2J3N%(}1BPBO3S`f29GOqXjfz;LoH( zi1ija4IoB4qd$B{Z-jXB%#`<6;m_3jAKlQ$;jC-?o`XD2rvb=A#0O|h_};jPXn=I& zKywBSDE&0>L407a2=_evl?RwKpazg}hzbAA9AYrN(GBEAfAacK{2@*}{xg}W{}kPE zq4U6f$BkcTfW`zS4Tc;Sp)WA!3Cy_?#e~5JKBylUNc@Hd-o{|E(cOiggz+8CA&{;x zm~2cyJ1C4qKM9wW21E7#)YMe`XY#vu3?{27yoaYcZw4A{!r`n@JPGl^moee{L*N5e8hrX#O&>Rr&NP_bcoOvKe%b$eAnxD8 z|BtK%Fz3HDg-JNoWix{YAPeYx@Dt-AlLm}20nuRSF@Y8T!Su$oue!g<05lR7z}?z2h<-ZFh2IT{WD-r&i@4dhz88L5Uu3{Uj8ry ze->+pKM6UGKMp>I=LDJKIf3SQw!azv(BBl#q8!09d?DX3#?yR^@CV*TIMvG#zkgK+ zA8K4=9TO1#VIbeGfey*c{xG-51C_KNcUU#Vrw@kvpUwZQeFm)upfQ0tFY1>+^h-|{ z4ew~KWn_?F5Wnu*+*pIxmp`S?7r#F)O5h0p!BRE&iQK$-6a6%5DBS-_{8?$i{LIu7 z>t1Kkb%Q@+T>R9)z#o;3GP5qGT>l>K-^2fB#{Qpq7BvXM|IZp1TUqdD;*PGrivQ1y z{Xg?86Mv>|km+*>uPsW)U#0qfcfQCR6VMtW>$uq30E!PJ*0%qr;-8k5Mu)Y&o%loswBLXy4KEqRxegri5^r4ha z6Z9`P3j3VdslVw?k>i<6B=v(TkuD6 zim4NPEPaIMhn=9$mzeT!u(=X*Eg7vL-aMm#7vA&6kq&_pqUS)|(f5C9`y<#84VZc| z!l4J+vAOC6UQ?Kizs(APvET;&GRYl(arY{HTzHcihF2F-@uuomcwaALogL8-;yVqB z`=5dT&y4A;&koiWL)~NQh^(|g^cX53oYAwW%?FNm1MB$J_WzkNo%LBni-EBG%y)#> zVEJdtK+pcS;{UUF4)y%6;y+Zm|1J0b#h+o<^GD}D|1Ir26rBII|G({zc;H|D|2_qn z{RG*pm6etKzsXFzzK{La^?xS*o}QjKYlgU`|CKcPqxk##`{S(ne+~ctFMZ%g+yC)N z4F7M+dDh(cD=%5R__`Dw?)=ky^zY~%`uzA50nZ~3r)PxM@Ad!xCfpIM1Mx?ASKczA zXY@JGW*Gh<>oPr~&;Q@>AJ|_1>-hgF|NkC;{QLXA6!@0{|5D&z3jF_|09sq7VK($7 z=5lN*{Yu8TzPUoEYx?)!UJ3p8zh0XeWZ~++5(iuf{ok2atpEF8b!FBw@XCaX2`6tq z9RKxKdV~DLKNP=}1X%+z0TYJ*5Q}gY{qnc{1MsIqJ_M=WNTIU`IC{@pkL3>RAgb`$UyME>*0XBzp9GySEJ z&p0|i0-YJK9zJg>V)zH9Fl=Gb#<9TPi38MM8v-_Kd&<80ej}e}rr$R@3j+ByD!{c7 zT&p?(SLDmJ1-|z(4BNE-X83U@;B(}^jeK^IA3xLY0{QSW&oS5qpOFtD0{H;ohuWha z@PXv;cf*ft=aKI*)8}?i8N>G)`AsMR+{|+bbm6`s;E4DM`Iq+lT)X}#{IC||`U^Q< zM@J{$%gZb8!Gi~RSy@@RC?f*80{l!ra^yRV&J)-Ru%fm=X9+ORQ(&H}fqXzXu zS27eq&rCc3#z6zyqP3($hYsP$xA|xD$&)8>rfoQanKfMj`N;JDMSkE+UwFh%Ss*u& z-S%5Bb3nPYKfi%%H)5s%3GIv5*Vo%Iabdk8_`&und#Jsl@7+gx?p>X&_@nSMc%;pS zFMhl)AB52DO_@GwOg}xuPso>jKj47)iFvNWV0|041>&haz-!s9Ul3AZg&lqVqwq8B zPpMu8bYEQLe@OQ+02{iZGzR=kn`z`@X29ZG#XOsV-nRjd!TL7S=NOF-vXIN6Z6E;` zemhS8QTP$hmJl*#R`GQ7SGJL;6p&g#z^TEAAS73!7eP-J5qq6~iwr|S=E}t2F z!;O`P{s{cYwg#mK?gzj6?STIp)0g#uk13ws{#*E&_#j{Aq5AgjGKQQTY}_t@G9eZI zD*SZb@9n1h;?e!^!2b&QAtE0Q{`aC5VfA{GV zehzdFp=Nqv4EFpg#PZr-r zzhi6g_wV20*1%gs_3e8M{j}m&;b->WY;P^PeI>Ft|Kg7bKB>qblOdDPISpUsDzYv9 zf&<<6?puGO7$frVn8Y_zZP`o`7;EWS~)ZUS1yRi%SN={;Tw7wgc-G*>|Fp8+4RK zuJ-%M)Agk9%OvFUg8CNI2G-5ZtrYPHWWFDP|3~D{P;!ZRAHn}5Jl9JtRVQAG`W2Fa?Q`c|D*C}D7i$XQW5xIdw!Dco7wXI75)43 z+pY|``sK_D#x2J^EQvAXm}6 z2PG!&qq6=E_?h~}`=<$bwwKmdxk~r-{;gb%KerVxeH2HBot5@~7yPJRgaeYPDA7LE z;|=Bc;EQt~ugHzX%N|AHmHBt@n&M25v8BK>z4T|%JLp~3{Im4`8TkX@RKKZ=E{$H$O$k(B4u^!mwjYoT-uy4K@mZH#J zEV9`#ECYiu*v|ob7j($U!XXR!g&$z{pK}KGD$)KnviU%ED`-y`#b7xI_9}XBaoiH% zg7oMYsu}Xt+HS^q=V+fD*$SXNQDg&z?3j>Ez)M(HMm95Grv;!6eumeOh5x`0@4yxW z?L{Hm3uLo^_GXdo2(qVA0a%dz4zg3|KT93)0~IoPVA1{SmtXwuhx+c|;DA?DAQJ&b zss{Yg+CSQ}NBb|x76-LQIJA2x*oUCF9|5qh(Z4Uld=0_y&0008@Au}7Xw3}m={*Xw z#lv9F3++)nDSAxbOF?_RXwO{-Xo2=e(HZ>6jt0e|K=w>11_j;T0eJH?JOhmZ(BWg5 zboi0_(b`N&W+?q!Y_#Ww)+C=4J^8YigZ4s@{Q_zaw7-dLtM-%)&YSmOPZ!e3pQ#_M zb)|dh)6Zo_=Tf6Hsh{Pid{aMy0qrRvdls};jLza8j5kj(`otHV`$zEa11rhIa~tXF zB;z`4muZyCdO0ohie4*4_m@9q9fUnfO-PiQY0oo|EANk?nc z$TkO^0gLut(b=zPuL+&`>Tj_Y&wo{bn*t21yr~XwKx!GRe%A9ySU;oof9R<}-w$TO zfNToTJ}`m-*`=U9!Grh2}_ znTY7T8?>j6Y%|dL$mo1%6fc0jcL;mXXzvs4S21BgZNti&Q4Ib+HyHjy$pORzpIblT zIXATFFrf3d(4IJg0qxtMGy9qS677Sdy-RcsF*<9JSwDi|6pTjAJ@goLU(OX|#eb;! z(S7<}Ue{;5;cYHn^ZXuO{WK9Te-w?s&5puLA4Y`l4d{D!XdfHx+oAp6cd!nO z_84+DS}Y&Z_EBWA6iwavfx8Lch1!ueasHURBOqch8y{SxgrAUi9x|B23EMdwp9 z_Z(1NOu93#to0Ao{)63bt1F}TiT7~!&x^Zm^!+DhzeKhnXx|CJfa+(`_4n#$KKCQn zu8wB<9t>Ldf0=lB(0&Wc={C;`d%D5{|VVQF#9EnBl5AL zkiNdp#OL?w|6ZFj%V52taj6H!#kP+Xum_Tde|VLNe=IM6@9*e%58ONWz4`}hXXZTw z8*AMIKO-Jv=7GO4zyDtS%;)~9>%a96-v80w_}#mA>AAGD6fZ0LYu09mqCcu1?QNs{ zpRWIV>t(<4+jEzh_%kQrFFx)?*OuZ%*OvT7{{BiGKk_c}vqpKS`kCXvzt{gP1wa#% z0WEZDf98cNkqS!&kg*@g=sEQKPi3ThFcVs*K#nxXr;NEyp)m};{9=OgIU&ck^x&P( zVMQVz`~m7LNHnKM>k2oZz7UwtdNYn}H5phwl54-0;cS|mn3$N%M^HYR8=<)>nvGe%?8%Z<|MEd?^ zfF05662R^b*$?LA!GKFuGu?54ey%<$zqYoPHrTj}bch%CJn3^jG}pObQT}DVhvvM< zrWeiq_mnZ>mLT67v<`C|?m;R*IDD^sq(>!R+D)I^qPfh2;`}e=Bb^=DqoXwjw9bL% zvna+QTH`?TdT8(N-z&ch&TK_H9X!~4Ucu)jYrw5;`c+&;qD)MzG?fHFeeyTK05!K zH6!{zysl2yG0~g{+0UYRADZtV9UIO0&^!a#$)={oe$)04pP4qWe5O9fyf!p6;1$^+ zbX^+FtI&J`&2N#tJ(^3Pc_o@pAv;iN^rbIta~Ws`DScr1gYys#uPdVBZ&JPRqPth{ zr#Bt({1^xPanw0H;*>1C4m4lNh;hYZVfFGZu;z=(svanx9y6Ske^_ZV@H4W{L2)dS z9Kc@p{1*D$5Uo`pzD4uGN6{{Hdz#G5%q~WXZ?UM9HUwZ-X-`6uuc zeGU$5LIrm`=<`I-XJ|u}KNx*j@6lQt@FxLAcvMnf^I+u< z2KTSr8%Y0ODQmEIS1dM%FXnaNE9_Uqh z;2U@w%HUuv1M%b#c>;{p6f{nQF3=2d!BapFNCw^P8(j>&JFrjZ-?~g6%WhOP(#IC0 zQy{$s=@V#Q2Xu)#sX}}rf@84vlN=QpYhU2of%FBG(O8ajto?uw(yzdeR)4Vf+ge-b zYglyuAp6buokR*AcP|u=y&H^&y?RaGS3r6i(AJ9eeP(|xFE0lh+Jp458LdU4wNSJU ziq=5AVNAYI*F#^E2inqoLkEMu?oAHFSviB}1|NrbDkgZ+rTz3ZL^K}8)VJg2HGMY# zCwdGR=KIY0S+9k+obZQW%Z~H|e|?{|URK%P+T4IQzAwd_>Z;(~_95RNtp1_y4XpoX*Ctrs{}Gur z*fUK02m9?u?lIs0l`9T=-pD(bj4~ATn+$vC!uO5ve?5FgDVe>g4?!~wU~VUJ3NWuS^j{I|=+^-WXh?wa%rR3;A2Y&q zp)`HW0Mmw&jW8X|7#@GahMpmP`CE(~q|cRifsq6OlY?grF%#?nJbwb9IRM|Z>6IwK zcXLb+em4S|D8p3;z8{AtOyLP(sL2>R3cqQ=9doD^J%`d#pdH~09BbiOGfa~XpUF4R zv6heC6NMJ|`ra;h&lKMLTJ9ojA+{XyQg~JtMj8SgM|1jfMgW5W3-qjI3uBw%R|Kgh zV1r79wE}`YyuTT~>C)dsR4@U25fydeDRX${xA%mxFu+@aPDycW0sWH%CJy($t?$QZ zwGiI>ejOxuVhzB!6=2f__!j~OsI|WLrZ~`OIku!9Iuac^IiSpTpw{odhp=LnfZBWu zK!}VU7;U<>pFW7w5WShahQ2Yl2GMXKz-j>*rG<1}P=fc2flrPC{N^mJgndId^gM~q z1K&PBkP}$>U@g2ufL?`ok_pXM&d0Es^j@ed82p|&! z90FVeJOU^Iu>siu1p&nYmqje1QUivVrn}8i6K(dtHLxJCJg_+s z3*rkB4k87~1}Oz;1epYpgIt3sL9s#9pn{9OfEE35yM*h82XBhc$;` z;e6r3;iPccaHVjKaFcLyxNA5iJT{yfUJza$-W-la@I?qmkRoIwlp-`DFcS{oBMi$1 z=!yZpT7ZxSFmeNw0syB7Kq?8a$^*2j0IwcEYymJk0Ms4;cPK#q6)pjQEHolEA~B*k zqCBEDf;&tJ9m3AoDx_NsutUZ@37zyWCB0aOSDI%J0yht>ie zXg~?>FxPMoz%CT2l@8FM7IOuD_+yQ(60s+DSCIMvNX~fY~;OKJT zW(>GlIFJPVtn?q@=bz-}SPo1B&{hR%SpcOxfJ%u#p<Zj*t;pgDz z;TP(c=$GwR>{knI!42&o0&O4<^w$I0JNSF}hx#Y_XZsiX*ZR}^xq8HHSR7azNDJf+5(p9r zk_?g$QVr4zvIuer@(2nIN({;lDh{d*q6KjW3j~Vf!v(@c!X?Ay!&Sre!Y#rb zpx=c;pUZ~+RttTNJ3=5rBtkMmK0-A@5Bi)#1kk>K0~-sp|NEqy3G{te==ZS^ROs>L z5zWxo`JkVZppPp-|2BcX?F#)mmfok!p+95LmxZAp%R(R4fc{H{zDt3AONBmL4*eB_ zzA79|ik6L5iq?oWi6%$8MpL3=qp8sa(dE(2(O3*$jBpGoMm9z%MkB@~h8*J>Ly3uv zp~e)%l*cs3VC5WG29O4$@KJ;*B#JCWiK0O!;+W;b-DU_H*^4_{I8B{R;fb{hC2G@PS+)flN>Wd0+yvz}27PAL~!`FYqt-Z}!JP z9ta1J0%QY}0yO?)sem+lc|hT}ZSDaQHW8$2G01)zUHXfFJe3Dost0n^0c2<>$j|IZ zB>kWOVNUu!lK@?AQoqPVES3}W3JjB^r~=;E(Eqrh@5w{2bA?_ya9|`gPM-Ok z1a`vdWo!g?iXv$470PM1)K#qx zO<%j`;ofPs1rKir67wjhhue@&bC5`<*##&>HUb+PANw$YN$M}|=^Ry-yKQ_`i5r#K z4=G_dz@sfboHUG+xRaf84BJj+@o}Uv=nK!75o`5z_2slp&4o7_X^IO1lyH0a7{24j zk1y1MpETj8g__2O;xkFp(NDxNlfJyM+RW^zskWBz#iOjw?Q$HAC6*I9H#I?}{HBG2Z7W$tCa>XqV?^XoqGRH@wCbo+z(`}utaxz^^(myUF8s=BQh z7*=00% znwfmVRwTJEPqEoA>wik~0OC5cZypq5Hg|tRZ(NI5PHy!=O;dA{tt|p@D*H*21!)B+ zZA;_0#F33Kelh~g z3`jAsgNey0DIW&bp8lM+*XdfM=N}7s(p203a z8c!a(uHHYU?Q-sE@dewQLPDnbv>Im91rmz@0G20U(jQ0enHk?Y{pq-DQOj9#kA+Uz zH+jK|i5X3#14Y)uHG0!m@n*z0^)}5b6W+NjwxZ+d<)ggYZW#q#*i*TGrmZ4hV57{D z3!0*1Vvese`8t~esX zCbjTV0Cg6BrT5qkekb+xV!T4sgwiFBHC1ISIWewj&> ze$hbDewz4bO3&wc242OiQUb}$ze89d0V*jjAufr;CqsaWi%WcwrzBguZzbq>(pX>w zcJ47F6}68G%O5Z_G1JpG)fOL3;zRej#tc(2Hqg;NXl!aMK7%w3-QyWEQR#%ap0Saz zvayc&@dKvX!t0HX8fhIc*Ecp|K1BT9L!{GezZI!$NTjlXNCk-zo*bxf^XOfp+F6se z<6dWM=FT~Er*^7ac60mXt-+H@#?(^!nx;rk*WdX`>~iZVmCtXyS2WDCzUPx@d9|!; z)45&K#%F!F`D&c~v*Xj1b*(*e;xFtX@1DJ7ftm|_* z8hXkmF5g#m=Ej*+zuHepekabAn}=SIo*8Yu<6djM@6Ii;<7a10yu5jL=1z~my|lSi zqZN2W3Zx#V9N>?WdXlWPdC#Qe6^ZAU^152?_U(*(q1bf%h;KyGn7M|QzQPrbXUzVu zJTni6a{d1}Gn4E_S;sa;cJd4vrIICt?3zSkkTuyE+Z+aCDP$+rK}3?W4M~(#B8EeX zjv|8`p)66BzK;&hbn-pl^Zos<>-_%sUGvxT+;d;geb0QJ_xtt!+z6e~(0G9iF`+@R z=P|6uzJ%^bo*f#A?nA_K@}M4dT~&zEI2u2#EVpQtc-5WL{*`s*!=1dnP${fe%i`F) z>uPxUW$JU-aWPMh9&SEPd6l~#XUPM#>GU5?L0e7b6no7H2M)PSg=dYAUVeMWv^7QI zJ?GO562@reb@AM96W)t{-Nks+LW4yS@60VanUr(y9JM2k$#|wrb71-DZJI`vr_RHJ zwBxQy#nRo!U(X!jG`;X9z08Thh+WC;fURF(tV8p({OW;fmC?%(n}rr(ah9*$<`!)q zz3(!I-`R%tBJbcU?~DdrdHf8}3lIF(7|H?+!plQ=e*NABynARPYb!}7MC;$SUTYS%w z->k&IKTp2eR;N6!h>|3s)_|2surD*4e#tY+gVe8!a0+M#Ej+c3lr$NJNU zlhQ9%=<}2BLljr-hV2aV%-$VlYzSU0?XK*odFvsxLt^%hdF$ALCLy^8Nm%x9{V zPrqDYzId}eXv)G67}G76m@||0_jt=u)gUD;7Mzr&;+p)GFxWQJ<;&(%G8w~Gr8`VT znWKqt3P6OnLFmE%jP!qD6%hDV{za2PawD<;{>>D?1VyvbBoG)NNOQ%4W(R0TxdAzv zQC74tAef5?=lkxo076p3+$EE42%SRy~m& zGaO5uqPL*>v=s&NIE)CPJ4fZkHkUdoWq3ISEYvOkJl_&)(+LkzvP;#rd8$E7$xva0 zFgfb(jy9CHxP6%(c;UOVDLwDK!jt!xxuuRbNa=V}YF1&;-@JX{AQ94CxeGrfGX@fG=Eb`Fy5d>3 zzX7xBN+yLQ29IqPZI*rcVSKpLRWX)Lj#D_z`O5ea3kJ7Zuhuc`_)|&vdWp&iyF5Rt zuCka`TYzPWjFjz*OFrbNycOomvZ&0dPzNmOHS7A(CWvp$yvNg zcXV7(M%6Ej)(BT6v5L5YxQx@>Y>l> zVSM!urLo`Gc@ zd70o~>UM=W1E;|kbW@eL({B;Bf5PBL<|_x(GX;*!rTU_=eH`NwMQMmEWf5E~x9-Cz z2q#^)9Sk{96q zofp|R!k64ymtZ#<2?(zZKzH(P3?Mfjh5Yu@{HM&_G>VIIeiT2?##o@;>fmnrLX}hV z9<#r{VOkZdNwoxgRj9=?*_}0G3~}4l5Y9h%eHM1F~Mx zuOWQ1c#rz9&rdv<4mP+2#Ei$^Ta2<14tPp^91x&t-qqD@g-LpRbx1)#wFcMg``*Yy zDL&LjTi&4DWK=^{1xxxhRV-n_MEsrO=s{Qx-MyD!h07mKf@Z`#1k z2xzR`N5WKry#R)`#H9hr4H^Igr@%T5Y?(J{L*yKJ2r0BGUG@tVS6GoRUeUs+7 z6>+W4iHP3V90*83K;Yj5B;$=)ARuXNEb?yy(q?soFVZ?8ZNWrG1b?j_zbIBeh8RP# zCpzn_X!@A?F^lP5y^->Zc(d1u2Cm!@$%sNjE^hwqK_9wc4@rId@2wt&I2lg57I1v3 z^`h9nn>W?R2VsIGYi7sHeoif#)VdNfRyCl3id%}w*MS->&#l%t20GY^nYl(1zaY#f zFFZ@g#EF_P7dOBi5pkEc`9A(t7Y1M&!JbuI%i?GfbmYD1${PeLT1g} zp{R)m!&mk4zH}5dVkvbe0&sD*grcfMXZ&YO)=-;Nzje&Dcm*(8qd^tqUspipJn`OM zMFD~abz46svx)o93iuDUBr%}Mscg0+zlq+)&I?A1Dy8eb_V^+Pt) zV}EogQ}>ij%S9H8;bJCl_dyB@&f!n-_Az3<`9@v!WR2-iUJ%z~!(C#4P5t`=c5bB# z+n=p`_)WJj*5uTR(^)J|QaUcmbd)%zW3rMaBUeQASF6k7i2CVgG*|D<=QECNA;Q}_ zqxgMzKk_n6A8hY6oMzBm$v2lVjuvVbI&h29UkaZeC@meweoftw#|}^)TWLgSOO2ux zu`N4c|HGCh1XtoI3@YkT z(*{wEtrRF^A2R6kB&+v;02oR`dTamDlQ8TaQbUD-lg=*#a&`PXDSM5E5* zT7%LECzj8140~47OOVeLPQ{ptQZ4Or>R9DvJ@T6gcbmm!bs>zQdSyGwL!p|QQjhtt z6pcM(CmXU~$UIgFrGUaz8071xzns68Xoe<2NMPR#?3(>!LGn*(1c7hGs^104E&#E~ z;9!ts`;N20B)OUXwxKz`G3Fm=49L=a8N!Md1P}n&w1#mFy&x73B{xjFxAG)cmsF)) z+m$o>Ly#e0r!#M-QenK*$Gpg*sZj;>l7rDPxQ3@-%jFN`hbW+>00{s* zse&OZ;TIU{nfoHQCm)v{JPg%1896L1i!+wUIGUjB{eJ#Btr>kwp!9UOw)n#39)ln& zv0)&j%)>b#(cIEM{b3RAA&&<>*WK^}&uny6LN||#7BiLrA(vz&JWzPm|Kuz`$*H55 z{zh4!bpb<~y6kI?J5wD`_QXmFq6nj9J3Pe1{Z)9z*fmWip9pF=n))X5h6P9lXFte1 zJNlq(|NW=8C6O<(yC$QD5^fYS&b{ zbYsDdK}Y>o?gVMaWtki)3Re&Uq&i_Zz2mLn;@UC+$!+vYWJHS`u>PU literal 0 HcmV?d00001 diff --git a/Rahul/task3/pyvenv3.9/pyvenv.cfg b/Rahul/task3/pyvenv3.9/pyvenv.cfg new file mode 100644 index 00000000..b62cc8f9 --- /dev/null +++ b/Rahul/task3/pyvenv3.9/pyvenv.cfg @@ -0,0 +1,3 @@ +home = C:\Users\Asus\AppData\Local\Programs\Python\Python39 +include-system-site-packages = false +version = 3.9.6