From 87204f86272faf3abcebfbe3c25413c8f14e1aed Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Fri, 18 Sep 2026 21:32:46 -0300 Subject: [PATCH] gdfgfdgdfg --- .../pip/_vendor/pkg_resources/__init__.py | 3676 ----------------- .../__pycache__/__init__.cpython-311.pyc | Bin 176828 -> 0 bytes .../pip/_vendor/platformdirs/LICENSE | 21 - .../pip/_vendor/platformdirs/__init__.py | 917 ---- .../pip/_vendor/platformdirs/__main__.py | 66 - .../__pycache__/__init__.cpython-311.pyc | Bin 29106 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 2497 -> 0 bytes .../__pycache__/_xdg.cpython-311.pyc | Bin 15391 -> 0 bytes .../__pycache__/android.cpython-311.pyc | Bin 15392 -> 0 bytes .../__pycache__/api.cpython-311.pyc | Bin 22722 -> 0 bytes .../__pycache__/macos.cpython-311.pyc | Bin 15467 -> 0 bytes .../__pycache__/unix.cpython-311.pyc | Bin 21743 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 711 -> 0 bytes .../__pycache__/windows.cpython-311.pyc | Bin 23301 -> 0 bytes .../pip/_vendor/platformdirs/_xdg.py | 171 - .../pip/_vendor/platformdirs/android.py | 300 -- .../pip/_vendor/platformdirs/api.py | 463 --- .../pip/_vendor/platformdirs/macos.py | 223 - .../pip/_vendor/platformdirs/py.typed | 0 .../pip/_vendor/platformdirs/unix.py | 321 -- .../pip/_vendor/platformdirs/version.py | 24 - .../pip/_vendor/platformdirs/windows.py | 395 -- .../pip/_vendor/pygments/LICENSE | 25 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 3832 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 781 -> 0 bytes .../__pycache__/console.cpython-311.pyc | Bin 3051 -> 0 bytes .../__pycache__/filter.cpython-311.pyc | Bin 3498 -> 0 bytes .../__pycache__/formatter.cpython-311.pyc | Bin 4981 -> 0 bytes .../__pycache__/lexer.cpython-311.pyc | Bin 42459 -> 0 bytes .../__pycache__/modeline.cpython-311.pyc | Bin 1725 -> 0 bytes .../__pycache__/plugin.cpython-311.pyc | Bin 2937 -> 0 bytes .../__pycache__/regexopt.cpython-311.pyc | Bin 5465 -> 0 bytes .../__pycache__/scanner.cpython-311.pyc | Bin 4886 -> 0 bytes .../__pycache__/sphinxext.cpython-311.pyc | Bin 14019 -> 0 bytes .../__pycache__/style.cpython-311.pyc | Bin 7469 -> 0 bytes .../__pycache__/token.cpython-311.pyc | Bin 7504 -> 0 bytes .../__pycache__/unistring.cpython-311.pyc | Bin 33847 -> 0 bytes .../pygments/__pycache__/util.cpython-311.pyc | Bin 15804 -> 0 bytes .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 70 - .../pip/_vendor/pygments/filters/__init__.py | 942 ----- .../__pycache__/__init__.cpython-311.pyc | Bin 40166 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 129 - .../_vendor/pygments/formatters/__init__.py | 157 - .../__pycache__/__init__.cpython-311.pyc | Bin 7780 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 4220 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/lexer.py | 965 ----- .../pip/_vendor/pygments/lexers/__init__.py | 362 -- .../__pycache__/__init__.cpython-311.pyc | Bin 16434 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 70550 -> 0 bytes .../lexers/__pycache__/python.cpython-311.pyc | Bin 43954 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 603 --- .../pip/_vendor/pygments/lexers/python.py | 1204 ------ .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 74 - .../pip/_vendor/pygments/regexopt.py | 102 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 247 -- .../pip/_vendor/pygments/style.py | 203 - .../pip/_vendor/pygments/styles/__init__.py | 61 - .../__pycache__/__init__.cpython-311.pyc | Bin 3109 -> 0 bytes .../__pycache__/_mapping.cpython-311.pyc | Bin 3668 -> 0 bytes .../pip/_vendor/pygments/styles/_mapping.py | 54 - .../pip/_vendor/pygments/token.py | 214 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 324 -- .../pip/_vendor/pyproject_hooks/LICENSE | 21 - .../pip/_vendor/pyproject_hooks/__init__.py | 31 - .../__pycache__/__init__.cpython-311.pyc | Bin 874 -> 0 bytes .../__pycache__/_impl.cpython-311.pyc | Bin 20440 -> 0 bytes .../pip/_vendor/pyproject_hooks/_impl.py | 410 -- .../pyproject_hooks/_in_process/__init__.py | 21 - .../__pycache__/__init__.cpython-311.pyc | Bin 1154 -> 0 bytes .../__pycache__/_in_process.cpython-311.pyc | Bin 17468 -> 0 bytes .../_in_process/_in_process.py | 389 -- .../pip/_vendor/pyproject_hooks/py.typed | 0 .../pip/_vendor/requests/LICENSE | 175 - .../pip/_vendor/requests/__init__.py | 214 - .../__pycache__/__init__.cpython-311.pyc | Bin 6587 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 584 -> 0 bytes .../_internal_utils.cpython-311.pyc | Bin 2262 -> 0 bytes .../__pycache__/_types.cpython-311.pyc | Bin 8724 -> 0 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 31813 -> 0 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 8304 -> 0 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 17156 -> 0 bytes .../__pycache__/certs.cpython-311.pyc | Bin 730 -> 0 bytes .../__pycache__/compat.cpython-311.pyc | Bin 2441 -> 0 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 30622 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 9609 -> 0 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 4436 -> 0 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 1883 -> 0 bytes .../__pycache__/models.cpython-311.pyc | Bin 45866 -> 0 bytes .../__pycache__/packages.cpython-311.pyc | Bin 1344 -> 0 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 33936 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 6450 -> 0 bytes .../__pycache__/structures.cpython-311.pyc | Bin 8203 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 44893 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 51 - .../pip/_vendor/requests/_types.py | 183 - .../pip/_vendor/requests/adapters.py | 748 ---- .../site-packages/pip/_vendor/requests/api.py | 180 - .../pip/_vendor/requests/auth.py | 354 -- .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 96 - .../pip/_vendor/requests/cookies.py | 625 --- .../pip/_vendor/requests/exceptions.py | 162 - .../pip/_vendor/requests/help.py | 127 - .../pip/_vendor/requests/hooks.py | 48 - .../pip/_vendor/requests/models.py | 1180 ------ .../pip/_vendor/requests/packages.py | 25 - .../pip/_vendor/requests/py.typed | 0 .../pip/_vendor/requests/sessions.py | 920 ----- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 130 - .../pip/_vendor/requests/utils.py | 1155 ------ .../pip/_vendor/resolvelib/LICENSE | 13 - .../pip/_vendor/resolvelib/__init__.py | 27 - .../__pycache__/__init__.cpython-311.pyc | Bin 755 -> 0 bytes .../__pycache__/providers.cpython-311.pyc | Bin 10444 -> 0 bytes .../__pycache__/reporters.cpython-311.pyc | Bin 3667 -> 0 bytes .../__pycache__/structs.cpython-311.pyc | Bin 14153 -> 0 bytes .../pip/_vendor/resolvelib/providers.py | 196 - .../pip/_vendor/resolvelib/py.typed | 0 .../pip/_vendor/resolvelib/reporters.py | 55 - .../_vendor/resolvelib/resolvers/__init__.py | 27 - .../__pycache__/__init__.cpython-311.pyc | Bin 891 -> 0 bytes .../__pycache__/abstract.cpython-311.pyc | Bin 2795 -> 0 bytes .../__pycache__/criterion.cpython-311.pyc | Bin 3532 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 5055 -> 0 bytes .../__pycache__/resolution.cpython-311.pyc | Bin 28074 -> 0 bytes .../_vendor/resolvelib/resolvers/abstract.py | 47 - .../_vendor/resolvelib/resolvers/criterion.py | 48 - .../resolvelib/resolvers/exceptions.py | 57 - .../resolvelib/resolvers/resolution.py | 627 --- .../pip/_vendor/resolvelib/structs.py | 209 - .../site-packages/pip/_vendor/rich/LICENSE | 19 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 245 -- .../rich/__pycache__/__init__.cpython-311.pyc | Bin 7494 -> 0 bytes .../rich/__pycache__/__main__.cpython-311.pyc | Bin 10734 -> 0 bytes .../__pycache__/_cell_widths.cpython-311.pyc | Bin 7884 -> 0 bytes .../__pycache__/_emoji_codes.cpython-311.pyc | Bin 208520 -> 0 bytes .../_emoji_replace.cpython-311.pyc | Bin 1932 -> 0 bytes .../_export_format.cpython-311.pyc | Bin 2351 -> 0 bytes .../__pycache__/_extension.cpython-311.pyc | Bin 633 -> 0 bytes .../rich/__pycache__/_fileno.cpython-311.pyc | Bin 975 -> 0 bytes .../rich/__pycache__/_inspect.cpython-311.pyc | Bin 14120 -> 0 bytes .../__pycache__/_log_render.cpython-311.pyc | Bin 4767 -> 0 bytes .../rich/__pycache__/_loop.cpython-311.pyc | Bin 2113 -> 0 bytes .../__pycache__/_null_file.cpython-311.pyc | Bin 4179 -> 0 bytes .../__pycache__/_palettes.cpython-311.pyc | Bin 5249 -> 0 bytes .../rich/__pycache__/_pick.cpython-311.pyc | Bin 794 -> 0 bytes .../rich/__pycache__/_ratio.cpython-311.pyc | Bin 7758 -> 0 bytes .../__pycache__/_spinners.cpython-311.pyc | Bin 13682 -> 0 bytes .../rich/__pycache__/_stack.cpython-311.pyc | Bin 1128 -> 0 bytes .../rich/__pycache__/_timer.cpython-311.pyc | Bin 981 -> 0 bytes .../_win32_console.cpython-311.pyc | Bin 29948 -> 0 bytes .../rich/__pycache__/_windows.cpython-311.pyc | Bin 2828 -> 0 bytes .../_windows_renderer.cpython-311.pyc | Bin 4019 -> 0 bytes .../rich/__pycache__/_wrap.cpython-311.pyc | Bin 3855 -> 0 bytes .../rich/__pycache__/abc.cpython-311.pyc | Bin 1925 -> 0 bytes .../rich/__pycache__/align.cpython-311.pyc | Bin 13399 -> 0 bytes .../rich/__pycache__/ansi.cpython-311.pyc | Bin 10513 -> 0 bytes .../rich/__pycache__/bar.cpython-311.pyc | Bin 4547 -> 0 bytes .../rich/__pycache__/box.cpython-311.pyc | Bin 12818 -> 0 bytes .../rich/__pycache__/cells.cpython-311.pyc | Bin 6543 -> 0 bytes .../rich/__pycache__/color.cpython-311.pyc | Bin 27777 -> 0 bytes .../__pycache__/color_triplet.cpython-311.pyc | Bin 1873 -> 0 bytes .../rich/__pycache__/columns.cpython-311.pyc | Bin 10644 -> 0 bytes .../rich/__pycache__/console.cpython-311.pyc | Bin 125346 -> 0 bytes .../__pycache__/constrain.cpython-311.pyc | Bin 2465 -> 0 bytes .../__pycache__/containers.cpython-311.pyc | Bin 10811 -> 0 bytes .../rich/__pycache__/control.cpython-311.pyc | Bin 11725 -> 0 bytes .../default_styles.cpython-311.pyc | Bin 12797 -> 0 bytes .../rich/__pycache__/diagnose.cpython-311.pyc | Bin 1853 -> 0 bytes .../rich/__pycache__/emoji.cpython-311.pyc | Bin 4648 -> 0 bytes .../rich/__pycache__/errors.cpython-311.pyc | Bin 2329 -> 0 bytes .../__pycache__/file_proxy.cpython-311.pyc | Bin 4033 -> 0 bytes .../rich/__pycache__/filesize.cpython-311.pyc | Bin 3268 -> 0 bytes .../__pycache__/highlighter.cpython-311.pyc | Bin 10989 -> 0 bytes .../rich/__pycache__/json.cpython-311.pyc | Bin 6544 -> 0 bytes .../rich/__pycache__/jupyter.cpython-311.pyc | Bin 6404 -> 0 bytes .../rich/__pycache__/layout.cpython-311.pyc | Bin 23311 -> 0 bytes .../rich/__pycache__/live.cpython-311.pyc | Bin 22406 -> 0 bytes .../__pycache__/live_render.cpython-311.pyc | Bin 4973 -> 0 bytes .../rich/__pycache__/logging.cpython-311.pyc | Bin 15018 -> 0 bytes .../rich/__pycache__/markup.cpython-311.pyc | Bin 10762 -> 0 bytes .../rich/__pycache__/measure.cpython-311.pyc | Bin 7271 -> 0 bytes .../rich/__pycache__/padding.cpython-311.pyc | Bin 7240 -> 0 bytes .../rich/__pycache__/pager.cpython-311.pyc | Bin 2245 -> 0 bytes .../rich/__pycache__/palette.cpython-311.pyc | Bin 5978 -> 0 bytes .../rich/__pycache__/panel.cpython-311.pyc | Bin 13388 -> 0 bytes .../rich/__pycache__/pretty.cpython-311.pyc | Bin 44965 -> 0 bytes .../rich/__pycache__/progress.cpython-311.pyc | Bin 80121 -> 0 bytes .../__pycache__/progress_bar.cpython-311.pyc | Bin 11012 -> 0 bytes .../rich/__pycache__/prompt.cpython-311.pyc | Bin 17935 -> 0 bytes .../rich/__pycache__/protocol.cpython-311.pyc | Bin 2096 -> 0 bytes .../rich/__pycache__/region.cpython-311.pyc | Bin 659 -> 0 bytes .../rich/__pycache__/repr.cpython-311.pyc | Bin 7622 -> 0 bytes .../rich/__pycache__/rule.cpython-311.pyc | Bin 7165 -> 0 bytes .../rich/__pycache__/scope.cpython-311.pyc | Bin 4351 -> 0 bytes .../rich/__pycache__/screen.cpython-311.pyc | Bin 2774 -> 0 bytes .../rich/__pycache__/segment.cpython-311.pyc | Bin 32035 -> 0 bytes .../rich/__pycache__/spinner.cpython-311.pyc | Bin 6693 -> 0 bytes .../rich/__pycache__/status.cpython-311.pyc | Bin 6758 -> 0 bytes .../rich/__pycache__/style.cpython-311.pyc | Bin 35238 -> 0 bytes .../rich/__pycache__/styled.cpython-311.pyc | Bin 2439 -> 0 bytes .../rich/__pycache__/syntax.cpython-311.pyc | Bin 43645 -> 0 bytes .../rich/__pycache__/table.cpython-311.pyc | Bin 49060 -> 0 bytes .../terminal_theme.cpython-311.pyc | Bin 3705 -> 0 bytes .../rich/__pycache__/text.cpython-311.pyc | Bin 67566 -> 0 bytes .../rich/__pycache__/theme.cpython-311.pyc | Bin 7296 -> 0 bytes .../rich/__pycache__/themes.cpython-311.pyc | Bin 355 -> 0 bytes .../__pycache__/traceback.cpython-311.pyc | Bin 39759 -> 0 bytes .../rich/__pycache__/tree.cpython-311.pyc | Bin 12862 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 454 -- .../pip/_vendor/rich/_emoji_codes.py | 3610 ---------------- .../pip/_vendor/rich/_emoji_replace.py | 32 - .../pip/_vendor/rich/_export_format.py | 76 - .../pip/_vendor/rich/_extension.py | 10 - .../site-packages/pip/_vendor/rich/_fileno.py | 24 - .../pip/_vendor/rich/_inspect.py | 268 -- .../pip/_vendor/rich/_log_render.py | 94 - .../site-packages/pip/_vendor/rich/_loop.py | 43 - .../pip/_vendor/rich/_null_file.py | 69 - .../pip/_vendor/rich/_palettes.py | 309 -- .../site-packages/pip/_vendor/rich/_pick.py | 17 - .../site-packages/pip/_vendor/rich/_ratio.py | 153 - .../pip/_vendor/rich/_spinners.py | 482 --- .../site-packages/pip/_vendor/rich/_stack.py | 16 - .../site-packages/pip/_vendor/rich/_timer.py | 19 - .../pip/_vendor/rich/_win32_console.py | 661 --- .../pip/_vendor/rich/_windows.py | 71 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 93 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 306 -- .../site-packages/pip/_vendor/rich/ansi.py | 241 -- .../site-packages/pip/_vendor/rich/bar.py | 93 - .../site-packages/pip/_vendor/rich/box.py | 474 --- .../site-packages/pip/_vendor/rich/cells.py | 174 - .../site-packages/pip/_vendor/rich/color.py | 621 --- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2680 ------------ .../pip/_vendor/rich/constrain.py | 37 - .../pip/_vendor/rich/containers.py | 167 - .../site-packages/pip/_vendor/rich/control.py | 219 - .../pip/_vendor/rich/default_styles.py | 193 - .../pip/_vendor/rich/diagnose.py | 39 - .../site-packages/pip/_vendor/rich/emoji.py | 91 - .../site-packages/pip/_vendor/rich/errors.py | 34 - .../pip/_vendor/rich/file_proxy.py | 57 - .../pip/_vendor/rich/filesize.py | 88 - .../pip/_vendor/rich/highlighter.py | 232 -- .../site-packages/pip/_vendor/rich/json.py | 139 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 442 -- .../site-packages/pip/_vendor/rich/live.py | 400 -- .../pip/_vendor/rich/live_render.py | 106 - .../site-packages/pip/_vendor/rich/logging.py | 297 -- .../site-packages/pip/_vendor/rich/markup.py | 251 -- .../site-packages/pip/_vendor/rich/measure.py | 151 - .../site-packages/pip/_vendor/rich/padding.py | 141 - .../site-packages/pip/_vendor/rich/pager.py | 34 - .../site-packages/pip/_vendor/rich/palette.py | 100 - .../site-packages/pip/_vendor/rich/panel.py | 317 -- .../site-packages/pip/_vendor/rich/pretty.py | 1016 ----- .../pip/_vendor/rich/progress.py | 1715 -------- .../pip/_vendor/rich/progress_bar.py | 223 - .../site-packages/pip/_vendor/rich/prompt.py | 400 -- .../pip/_vendor/rich/protocol.py | 42 - .../site-packages/pip/_vendor/rich/py.typed | 0 .../site-packages/pip/_vendor/rich/region.py | 10 - .../site-packages/pip/_vendor/rich/repr.py | 149 - .../site-packages/pip/_vendor/rich/rule.py | 130 - .../site-packages/pip/_vendor/rich/scope.py | 86 - .../site-packages/pip/_vendor/rich/screen.py | 54 - .../site-packages/pip/_vendor/rich/segment.py | 752 ---- .../site-packages/pip/_vendor/rich/spinner.py | 132 - .../site-packages/pip/_vendor/rich/status.py | 131 - .../site-packages/pip/_vendor/rich/style.py | 792 ---- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 985 ----- .../site-packages/pip/_vendor/rich/table.py | 1006 ----- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1361 ------ .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 899 ---- .../site-packages/pip/_vendor/rich/tree.py | 257 -- .../site-packages/pip/_vendor/tomli/LICENSE | 21 - .../pip/_vendor/tomli/__init__.py | 8 - .../__pycache__/__init__.cpython-311.pyc | Bin 364 -> 0 bytes .../tomli/__pycache__/_parser.cpython-311.pyc | Bin 34044 -> 0 bytes .../tomli/__pycache__/_re.cpython-311.pyc | Bin 4913 -> 0 bytes .../tomli/__pycache__/_types.cpython-311.pyc | Bin 402 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 793 ---- .../site-packages/pip/_vendor/tomli/_re.py | 119 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../site-packages/pip/_vendor/tomli/py.typed | 1 - .../site-packages/pip/_vendor/tomli_w/LICENSE | 21 - .../pip/_vendor/tomli_w/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 347 -> 0 bytes .../__pycache__/_writer.cpython-311.pyc | Bin 12027 -> 0 bytes .../pip/_vendor/tomli_w/_writer.py | 229 - .../pip/_vendor/tomli_w/py.typed | 1 - .../pip/_vendor/truststore/LICENSE | 21 - .../pip/_vendor/truststore/__init__.py | 36 - .../__pycache__/__init__.cpython-311.pyc | Bin 1557 -> 0 bytes .../__pycache__/_api.cpython-311.pyc | Bin 18897 -> 0 bytes .../__pycache__/_macos.cpython-311.pyc | Bin 19821 -> 0 bytes .../__pycache__/_openssl.cpython-311.pyc | Bin 2395 -> 0 bytes .../_ssl_constants.cpython-311.pyc | Bin 1119 -> 0 bytes .../__pycache__/_windows.cpython-311.pyc | Bin 17542 -> 0 bytes .../pip/_vendor/truststore/_api.py | 341 -- .../pip/_vendor/truststore/_macos.py | 571 --- .../pip/_vendor/truststore/_openssl.py | 68 - .../pip/_vendor/truststore/_ssl_constants.py | 31 - .../pip/_vendor/truststore/_windows.py | 567 --- .../pip/_vendor/truststore/py.typed | 0 .../pip/_vendor/urllib3/LICENSE.txt | 21 - .../pip/_vendor/urllib3/__init__.py | 211 - .../__pycache__/__init__.cpython-311.pyc | Bin 7679 -> 0 bytes .../_base_connection.cpython-311.pyc | Bin 7125 -> 0 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 26353 -> 0 bytes .../_request_methods.cpython-311.pyc | Bin 10726 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 706 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 41030 -> 0 bytes .../connectionpool.cpython-311.pyc | Bin 41675 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 20098 -> 0 bytes .../__pycache__/fields.cpython-311.pyc | Bin 12712 -> 0 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 3882 -> 0 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 25942 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 61685 -> 0 bytes .../pip/_vendor/urllib3/_base_connection.py | 167 - .../pip/_vendor/urllib3/_collections.py | 486 --- .../pip/_vendor/urllib3/_request_methods.py | 278 -- .../pip/_vendor/urllib3/_version.py | 24 - .../pip/_vendor/urllib3/connection.py | 1099 ----- .../pip/_vendor/urllib3/connectionpool.py | 1191 ------ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 204 -> 0 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 29535 -> 0 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 8741 -> 0 bytes .../urllib3/contrib/emscripten/__init__.py | 17 - .../__pycache__/__init__.cpython-311.pyc | Bin 1126 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 10763 -> 0 bytes .../__pycache__/fetch.cpython-311.pyc | Bin 31302 -> 0 bytes .../__pycache__/request.cpython-311.pyc | Bin 1662 -> 0 bytes .../__pycache__/response.cpython-311.pyc | Bin 13109 -> 0 bytes .../urllib3/contrib/emscripten/connection.py | 260 -- .../emscripten/emscripten_fetch_worker.js | 110 - .../urllib3/contrib/emscripten/fetch.py | 726 ---- .../urllib3/contrib/emscripten/request.py | 22 - .../urllib3/contrib/emscripten/response.py | 281 -- .../pip/_vendor/urllib3/contrib/pyopenssl.py | 563 --- .../pip/_vendor/urllib3/contrib/socks.py | 228 - .../pip/_vendor/urllib3/exceptions.py | 335 -- .../pip/_vendor/urllib3/fields.py | 341 -- .../pip/_vendor/urllib3/filepost.py | 89 - .../pip/_vendor/urllib3/http2/__init__.py | 53 - .../__pycache__/__init__.cpython-311.pyc | Bin 2029 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 19050 -> 0 bytes .../http2/__pycache__/probe.cpython-311.pyc | Bin 4349 -> 0 bytes .../pip/_vendor/urllib3/http2/connection.py | 356 -- .../pip/_vendor/urllib3/http2/probe.py | 87 - .../pip/_vendor/urllib3/poolmanager.py | 653 --- .../pip/_vendor/urllib3/py.typed | 2 - .../pip/_vendor/urllib3/response.py | 1487 ------- .../pip/_vendor/urllib3/util/__init__.py | 42 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 1237 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 5060 -> 0 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 1295 -> 0 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 8959 -> 0 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 3369 -> 0 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 22030 -> 0 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 16659 -> 0 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 6093 -> 0 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 14328 -> 0 bytes 384 files changed, 59423 deletions(-) delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/_xdg.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/_xdg.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/console.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filter.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/modeline.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/_mapping.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_types.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/_types.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/json.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/jupyter.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/layout.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/live.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/live_render.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/logging.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/markup.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/padding.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/pager.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/palette.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/panel.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/pretty.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/prompt.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/protocol.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/region.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/repr.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/rule.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/scope.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/screen.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/segment.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/spinner.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/status.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/style.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/styled.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/syntax.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/table.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/text.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/theme.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/themes.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/traceback.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/rich/tree.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_parser.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_re.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/_types.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/__pycache__/_writer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/_writer.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/tomli_w/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_api.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_macos.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_openssl.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_ssl_constants.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/_windows.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/truststore/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_base_connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_request_methods.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_base_connection.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_request_methods.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/_version.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connection.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/connection.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/emscripten_fetch_worker.js delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/fetch.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/request.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/emscripten/response.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/fields.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/__pycache__/probe.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/connection.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/http2/probe.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/py.typed delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/response.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py deleted file mode 100755 index 72f2b03..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3676 +0,0 @@ -# TODO: Add Generic type annotations to initialized collections. -# For now we'd simply use implicit Any/Unknown which would add redundant annotations -# mypy: disable-error-code="var-annotated" -""" -Package resource API --------------------- - -A resource is a logical file contained within a package, or a logical -subdirectory thereof. The package resource API expects resource names -to have their path parts separated with ``/``, *not* whatever the local -path separator is. Do not use os.path operations to manipulate resource -names being passed into the API. - -The package resource API is designed to work with normal filesystem packages, -.egg files, and unpacked .egg files. It can also work in a limited way with -.zip files and with custom PEP 302 loaders that support the ``get_data()`` -method. - -This module is deprecated. Users are directed to :mod:`importlib.resources`, -:mod:`importlib.metadata` and :pypi:`packaging` instead. -""" - -from __future__ import annotations - -import sys - -if sys.version_info < (3, 8): # noqa: UP036 # Check for unsupported versions - raise RuntimeError("Python 3.8 or later is required") - -import os -import io -import time -import re -import types -from typing import ( - Any, - Literal, - Dict, - Iterator, - Mapping, - MutableSequence, - NamedTuple, - NoReturn, - Tuple, - Union, - TYPE_CHECKING, - Protocol, - Callable, - Iterable, - TypeVar, - overload, -) -import zipfile -import zipimport -import warnings -import stat -import functools -import pkgutil -import operator -import platform -import collections -import plistlib -import email.parser -import errno -import tempfile -import textwrap -import inspect -import ntpath -import posixpath -import importlib -import importlib.abc -import importlib.machinery -from pkgutil import get_importer - -import _imp - -# capture these to bypass sandboxing -from os import utime -from os import open as os_open -from os.path import isdir, split - -try: - from os import mkdir, rename, unlink - - WRITE_SUPPORT = True -except ImportError: - # no write support, probably under GAE - WRITE_SUPPORT = False - -from pip._internal.utils._jaraco_text import ( - yield_lines, - drop_comment, - join_continuation, -) -from pip._vendor.packaging import markers as _packaging_markers -from pip._vendor.packaging import requirements as _packaging_requirements -from pip._vendor.packaging import utils as _packaging_utils -from pip._vendor.packaging import version as _packaging_version -from pip._vendor.platformdirs import user_cache_dir as _user_cache_dir - -if TYPE_CHECKING: - from _typeshed import BytesPath, StrPath, StrOrBytesPath - from typing_extensions import Self - - -# Patch: Remove deprecation warning from vendored pkg_resources. -# Setting PYTHONWARNINGS=error to verify builds produce no warnings -# causes immediate exceptions. -# See https://github.com/pypa/pip/issues/12243 - - -_T = TypeVar("_T") -_DistributionT = TypeVar("_DistributionT", bound="Distribution") -# Type aliases -_NestedStr = Union[str, Iterable[Union[str, Iterable["_NestedStr"]]]] -_InstallerTypeT = Callable[["Requirement"], "_DistributionT"] -_InstallerType = Callable[["Requirement"], Union["Distribution", None]] -_PkgReqType = Union[str, "Requirement"] -_EPDistType = Union["Distribution", _PkgReqType] -_MetadataType = Union["IResourceProvider", None] -_ResolvedEntryPoint = Any # Can be any attribute in the module -_ResourceStream = Any # TODO / Incomplete: A readable file-like object -# Any object works, but let's indicate we expect something like a module (optionally has __loader__ or __file__) -_ModuleLike = Union[object, types.ModuleType] -# Any: Should be _ModuleLike but we end up with issues where _ModuleLike doesn't have _ZipLoaderModule's __loader__ -_ProviderFactoryType = Callable[[Any], "IResourceProvider"] -_DistFinderType = Callable[[_T, str, bool], Iterable["Distribution"]] -_NSHandlerType = Callable[[_T, str, str, types.ModuleType], Union[str, None]] -_AdapterT = TypeVar( - "_AdapterT", _DistFinderType[Any], _ProviderFactoryType, _NSHandlerType[Any] -) - - -# Use _typeshed.importlib.LoaderProtocol once available https://github.com/python/typeshed/pull/11890 -class _LoaderProtocol(Protocol): - def load_module(self, fullname: str, /) -> types.ModuleType: ... - - -class _ZipLoaderModule(Protocol): - __loader__: zipimport.zipimporter - - -_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I) - - -class PEP440Warning(RuntimeWarning): - """ - Used when there is an issue with a version or specifier not complying with - PEP 440. - """ - - -parse_version = _packaging_version.Version - - -_state_vars: dict[str, str] = {} - - -def _declare_state(vartype: str, varname: str, initial_value: _T) -> _T: - _state_vars[varname] = vartype - return initial_value - - -def __getstate__() -> dict[str, Any]: - state = {} - g = globals() - for k, v in _state_vars.items(): - state[k] = g['_sget_' + v](g[k]) - return state - - -def __setstate__(state: dict[str, Any]) -> dict[str, Any]: - g = globals() - for k, v in state.items(): - g['_sset_' + _state_vars[k]](k, g[k], v) - return state - - -def _sget_dict(val): - return val.copy() - - -def _sset_dict(key, ob, state): - ob.clear() - ob.update(state) - - -def _sget_object(val): - return val.__getstate__() - - -def _sset_object(key, ob, state): - ob.__setstate__(state) - - -_sget_none = _sset_none = lambda *args: None - - -def get_supported_platform(): - """Return this platform's maximum compatible version. - - distutils.util.get_platform() normally reports the minimum version - of macOS that would be required to *use* extensions produced by - distutils. But what we want when checking compatibility is to know the - version of macOS that we are *running*. To allow usage of packages that - explicitly require a newer version of macOS, we must also know the - current version of the OS. - - If this condition occurs for any other platform with a version in its - platform strings, this function should be extended accordingly. - """ - plat = get_build_platform() - m = macosVersionString.match(plat) - if m is not None and sys.platform == "darwin": - try: - plat = 'macosx-%s-%s' % ('.'.join(_macos_vers()[:2]), m.group(3)) - except ValueError: - # not macOS - pass - return plat - - -__all__ = [ - # Basic resource access and distribution/entry point discovery - 'require', - 'run_script', - 'get_provider', - 'get_distribution', - 'load_entry_point', - 'get_entry_map', - 'get_entry_info', - 'iter_entry_points', - 'resource_string', - 'resource_stream', - 'resource_filename', - 'resource_listdir', - 'resource_exists', - 'resource_isdir', - # Environmental control - 'declare_namespace', - 'working_set', - 'add_activation_listener', - 'find_distributions', - 'set_extraction_path', - 'cleanup_resources', - 'get_default_cache', - # Primary implementation classes - 'Environment', - 'WorkingSet', - 'ResourceManager', - 'Distribution', - 'Requirement', - 'EntryPoint', - # Exceptions - 'ResolutionError', - 'VersionConflict', - 'DistributionNotFound', - 'UnknownExtra', - 'ExtractionError', - # Warnings - 'PEP440Warning', - # Parsing functions and string utilities - 'parse_requirements', - 'parse_version', - 'safe_name', - 'safe_version', - 'get_platform', - 'compatible_platforms', - 'yield_lines', - 'split_sections', - 'safe_extra', - 'to_filename', - 'invalid_marker', - 'evaluate_marker', - # filesystem utilities - 'ensure_directory', - 'normalize_path', - # Distribution "precedence" constants - 'EGG_DIST', - 'BINARY_DIST', - 'SOURCE_DIST', - 'CHECKOUT_DIST', - 'DEVELOP_DIST', - # "Provider" interfaces, implementations, and registration/lookup APIs - 'IMetadataProvider', - 'IResourceProvider', - 'FileMetadata', - 'PathMetadata', - 'EggMetadata', - 'EmptyProvider', - 'empty_provider', - 'NullProvider', - 'EggProvider', - 'DefaultProvider', - 'ZipProvider', - 'register_finder', - 'register_namespace_handler', - 'register_loader_type', - 'fixup_namespace_packages', - 'get_importer', - # Warnings - 'PkgResourcesDeprecationWarning', - # Deprecated/backward compatibility only - 'run_main', - 'AvailableDistributions', -] - - -class ResolutionError(Exception): - """Abstract base for dependency resolution errors""" - - def __repr__(self): - return self.__class__.__name__ + repr(self.args) - - -class VersionConflict(ResolutionError): - """ - An already-installed version conflicts with the requested version. - - Should be initialized with the installed Distribution and the requested - Requirement. - """ - - _template = "{self.dist} is installed but {self.req} is required" - - @property - def dist(self) -> Distribution: - return self.args[0] - - @property - def req(self) -> Requirement: - return self.args[1] - - def report(self): - return self._template.format(**locals()) - - def with_context(self, required_by: set[Distribution | str]): - """ - If required_by is non-empty, return a version of self that is a - ContextualVersionConflict. - """ - if not required_by: - return self - args = self.args + (required_by,) - return ContextualVersionConflict(*args) - - -class ContextualVersionConflict(VersionConflict): - """ - A VersionConflict that accepts a third parameter, the set of the - requirements that required the installed Distribution. - """ - - _template = VersionConflict._template + ' by {self.required_by}' - - @property - def required_by(self) -> set[str]: - return self.args[2] - - -class DistributionNotFound(ResolutionError): - """A requested distribution was not found""" - - _template = ( - "The '{self.req}' distribution was not found " - "and is required by {self.requirers_str}" - ) - - @property - def req(self) -> Requirement: - return self.args[0] - - @property - def requirers(self) -> set[str] | None: - return self.args[1] - - @property - def requirers_str(self): - if not self.requirers: - return 'the application' - return ', '.join(self.requirers) - - def report(self): - return self._template.format(**locals()) - - def __str__(self): - return self.report() - - -class UnknownExtra(ResolutionError): - """Distribution doesn't have an "extra feature" of the given name""" - - -_provider_factories: dict[type[_ModuleLike], _ProviderFactoryType] = {} - -PY_MAJOR = '{}.{}'.format(*sys.version_info) -EGG_DIST = 3 -BINARY_DIST = 2 -SOURCE_DIST = 1 -CHECKOUT_DIST = 0 -DEVELOP_DIST = -1 - - -def register_loader_type( - loader_type: type[_ModuleLike], provider_factory: _ProviderFactoryType -): - """Register `provider_factory` to make providers for `loader_type` - - `loader_type` is the type or class of a PEP 302 ``module.__loader__``, - and `provider_factory` is a function that, passed a *module* object, - returns an ``IResourceProvider`` for that module. - """ - _provider_factories[loader_type] = provider_factory - - -@overload -def get_provider(moduleOrReq: str) -> IResourceProvider: ... -@overload -def get_provider(moduleOrReq: Requirement) -> Distribution: ... -def get_provider(moduleOrReq: str | Requirement) -> IResourceProvider | Distribution: - """Return an IResourceProvider for the named module or requirement""" - if isinstance(moduleOrReq, Requirement): - return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] - try: - module = sys.modules[moduleOrReq] - except KeyError: - __import__(moduleOrReq) - module = sys.modules[moduleOrReq] - loader = getattr(module, '__loader__', None) - return _find_adapter(_provider_factories, loader)(module) - - -@functools.lru_cache(maxsize=None) -def _macos_vers(): - version = platform.mac_ver()[0] - # fallback for MacPorts - if version == '': - plist = '/System/Library/CoreServices/SystemVersion.plist' - if os.path.exists(plist): - with open(plist, 'rb') as fh: - plist_content = plistlib.load(fh) - if 'ProductVersion' in plist_content: - version = plist_content['ProductVersion'] - return version.split('.') - - -def _macos_arch(machine): - return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) - - -def get_build_platform(): - """Return this platform's string for platform-specific distributions - - XXX Currently this is the same as ``distutils.util.get_platform()``, but it - needs some hacks for Linux and macOS. - """ - from sysconfig import get_platform - - plat = get_platform() - if sys.platform == "darwin" and not plat.startswith('macosx-'): - try: - version = _macos_vers() - machine = os.uname()[4].replace(" ", "_") - return "macosx-%d.%d-%s" % ( - int(version[0]), - int(version[1]), - _macos_arch(machine), - ) - except ValueError: - # if someone is running a non-Mac darwin system, this will fall - # through to the default implementation - pass - return plat - - -macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") -darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") -# XXX backward compat -get_platform = get_build_platform - - -def compatible_platforms(provided: str | None, required: str | None): - """Can code for the `provided` platform run on the `required` platform? - - Returns true if either platform is ``None``, or the platforms are equal. - - XXX Needs compatibility checks for Linux and other unixy OSes. - """ - if provided is None or required is None or provided == required: - # easy case - return True - - # macOS special cases - reqMac = macosVersionString.match(required) - if reqMac: - provMac = macosVersionString.match(provided) - - # is this a Mac package? - if not provMac: - # this is backwards compatibility for packages built before - # setuptools 0.6. All packages built after this point will - # use the new macOS designation. - provDarwin = darwinVersionString.match(provided) - if provDarwin: - dversion = int(provDarwin.group(1)) - macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) - if ( - dversion == 7 - and macosversion >= "10.3" - or dversion == 8 - and macosversion >= "10.4" - ): - return True - # egg isn't macOS or legacy darwin - return False - - # are they the same major version and machine type? - if provMac.group(1) != reqMac.group(1) or provMac.group(3) != reqMac.group(3): - return False - - # is the required OS major update >= the provided one? - if int(provMac.group(2)) > int(reqMac.group(2)): - return False - - return True - - # XXX Linux and other platforms' special cases should go here - return False - - -@overload -def get_distribution(dist: _DistributionT) -> _DistributionT: ... -@overload -def get_distribution(dist: _PkgReqType) -> Distribution: ... -def get_distribution(dist: Distribution | _PkgReqType) -> Distribution: - """Return a current distribution object for a Requirement or string""" - if isinstance(dist, str): - dist = Requirement.parse(dist) - if isinstance(dist, Requirement): - # Bad type narrowing, dist has to be a Requirement here, so get_provider has to return Distribution - dist = get_provider(dist) # type: ignore[assignment] - if not isinstance(dist, Distribution): - raise TypeError("Expected str, Requirement, or Distribution", dist) - return dist - - -def load_entry_point(dist: _EPDistType, group: str, name: str) -> _ResolvedEntryPoint: - """Return `name` entry point of `group` for `dist` or raise ImportError""" - return get_distribution(dist).load_entry_point(group, name) - - -@overload -def get_entry_map( - dist: _EPDistType, group: None = None -) -> dict[str, dict[str, EntryPoint]]: ... -@overload -def get_entry_map(dist: _EPDistType, group: str) -> dict[str, EntryPoint]: ... -def get_entry_map(dist: _EPDistType, group: str | None = None): - """Return the entry point map for `group`, or the full entry map""" - return get_distribution(dist).get_entry_map(group) - - -def get_entry_info(dist: _EPDistType, group: str, name: str): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return get_distribution(dist).get_entry_info(group, name) - - -class IMetadataProvider(Protocol): - def has_metadata(self, name: str) -> bool: - """Does the package's distribution contain the named metadata?""" - - def get_metadata(self, name: str) -> str: - """The named metadata resource as a string""" - - def get_metadata_lines(self, name: str) -> Iterator[str]: - """Yield named metadata resource as list of non-blank non-comment lines - - Leading and trailing whitespace is stripped from each line, and lines - with ``#`` as the first non-blank character are omitted.""" - - def metadata_isdir(self, name: str) -> bool: - """Is the named metadata a directory? (like ``os.path.isdir()``)""" - - def metadata_listdir(self, name: str) -> list[str]: - """List of metadata names in the directory (like ``os.listdir()``)""" - - def run_script(self, script_name: str, namespace: dict[str, Any]) -> None: - """Execute the named script in the supplied namespace dictionary""" - - -class IResourceProvider(IMetadataProvider, Protocol): - """An object that provides access to package resources""" - - def get_resource_filename( - self, manager: ResourceManager, resource_name: str - ) -> str: - """Return a true filesystem path for `resource_name` - - `manager` must be a ``ResourceManager``""" - - def get_resource_stream( - self, manager: ResourceManager, resource_name: str - ) -> _ResourceStream: - """Return a readable file-like object for `resource_name` - - `manager` must be a ``ResourceManager``""" - - def get_resource_string( - self, manager: ResourceManager, resource_name: str - ) -> bytes: - """Return the contents of `resource_name` as :obj:`bytes` - - `manager` must be a ``ResourceManager``""" - - def has_resource(self, resource_name: str) -> bool: - """Does the package contain the named resource?""" - - def resource_isdir(self, resource_name: str) -> bool: - """Is the named resource a directory? (like ``os.path.isdir()``)""" - - def resource_listdir(self, resource_name: str) -> list[str]: - """List of resource names in the directory (like ``os.listdir()``)""" - - -class WorkingSet: - """A collection of active distributions on sys.path (or a similar list)""" - - def __init__(self, entries: Iterable[str] | None = None): - """Create working set from list of path entries (default=sys.path)""" - self.entries: list[str] = [] - self.entry_keys = {} - self.by_key = {} - self.normalized_to_canonical_keys = {} - self.callbacks = [] - - if entries is None: - entries = sys.path - - for entry in entries: - self.add_entry(entry) - - @classmethod - def _build_master(cls): - """ - Prepare the master working set. - """ - ws = cls() - try: - from __main__ import __requires__ - except ImportError: - # The main program does not list any requirements - return ws - - # ensure the requirements are met - try: - ws.require(__requires__) - except VersionConflict: - return cls._build_from_requirements(__requires__) - - return ws - - @classmethod - def _build_from_requirements(cls, req_spec): - """ - Build a working set from a requirement spec. Rewrites sys.path. - """ - # try it without defaults already on sys.path - # by starting with an empty path - ws = cls([]) - reqs = parse_requirements(req_spec) - dists = ws.resolve(reqs, Environment()) - for dist in dists: - ws.add(dist) - - # add any missing entries from sys.path - for entry in sys.path: - if entry not in ws.entries: - ws.add_entry(entry) - - # then copy back to sys.path - sys.path[:] = ws.entries - return ws - - def add_entry(self, entry: str): - """Add a path item to ``.entries``, finding any distributions on it - - ``find_distributions(entry, True)`` is used to find distributions - corresponding to the path entry, and they are added. `entry` is - always appended to ``.entries``, even if it is already present. - (This is because ``sys.path`` can contain the same value more than - once, and the ``.entries`` of the ``sys.path`` WorkingSet should always - equal ``sys.path``.) - """ - self.entry_keys.setdefault(entry, []) - self.entries.append(entry) - for dist in find_distributions(entry, True): - self.add(dist, entry, False) - - def __contains__(self, dist: Distribution) -> bool: - """True if `dist` is the active distribution for its project""" - return self.by_key.get(dist.key) == dist - - def find(self, req: Requirement) -> Distribution | None: - """Find a distribution matching requirement `req` - - If there is an active distribution for the requested project, this - returns it as long as it meets the version requirement specified by - `req`. But, if there is an active distribution for the project and it - does *not* meet the `req` requirement, ``VersionConflict`` is raised. - If there is no active distribution for the requested project, ``None`` - is returned. - """ - dist = self.by_key.get(req.key) - - if dist is None: - canonical_key = self.normalized_to_canonical_keys.get(req.key) - - if canonical_key is not None: - req.key = canonical_key - dist = self.by_key.get(canonical_key) - - if dist is not None and dist not in req: - # XXX add more info - raise VersionConflict(dist, req) - return dist - - def iter_entry_points(self, group: str, name: str | None = None): - """Yield entry point objects from `group` matching `name` - - If `name` is None, yields all entry points in `group` from all - distributions in the working set, otherwise only ones matching - both `group` and `name` are yielded (in distribution order). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.name - ) - - def run_script(self, requires: str, script_name: str): - """Locate distribution for `requires` and run `script_name` script""" - ns = sys._getframe(1).f_globals - name = ns['__name__'] - ns.clear() - ns['__name__'] = name - self.require(requires)[0].run_script(script_name, ns) - - def __iter__(self) -> Iterator[Distribution]: - """Yield distributions for non-duplicate projects in the working set - - The yield order is the order in which the items' path entries were - added to the working set. - """ - seen = set() - for item in self.entries: - if item not in self.entry_keys: - # workaround a cache issue - continue - - for key in self.entry_keys[item]: - if key not in seen: - seen.add(key) - yield self.by_key[key] - - def add( - self, - dist: Distribution, - entry: str | None = None, - insert: bool = True, - replace: bool = False, - ): - """Add `dist` to working set, associated with `entry` - - If `entry` is unspecified, it defaults to the ``.location`` of `dist`. - On exit from this routine, `entry` is added to the end of the working - set's ``.entries`` (if it wasn't already present). - - `dist` is only added to the working set if it's for a project that - doesn't already have a distribution in the set, unless `replace=True`. - If it's added, any callbacks registered with the ``subscribe()`` method - will be called. - """ - if insert: - dist.insert_on(self.entries, entry, replace=replace) - - if entry is None: - entry = dist.location - keys = self.entry_keys.setdefault(entry, []) - keys2 = self.entry_keys.setdefault(dist.location, []) - if not replace and dist.key in self.by_key: - # ignore hidden distros - return - - self.by_key[dist.key] = dist - normalized_name = _packaging_utils.canonicalize_name(dist.key) - self.normalized_to_canonical_keys[normalized_name] = dist.key - if dist.key not in keys: - keys.append(dist.key) - if dist.key not in keys2: - keys2.append(dist.key) - self._added_new(dist) - - @overload - def resolve( - self, - requirements: Iterable[Requirement], - env: Environment | None, - installer: _InstallerTypeT[_DistributionT], - replace_conflicting: bool = False, - extras: tuple[str, ...] | None = None, - ) -> list[_DistributionT]: ... - @overload - def resolve( - self, - requirements: Iterable[Requirement], - env: Environment | None = None, - *, - installer: _InstallerTypeT[_DistributionT], - replace_conflicting: bool = False, - extras: tuple[str, ...] | None = None, - ) -> list[_DistributionT]: ... - @overload - def resolve( - self, - requirements: Iterable[Requirement], - env: Environment | None = None, - installer: _InstallerType | None = None, - replace_conflicting: bool = False, - extras: tuple[str, ...] | None = None, - ) -> list[Distribution]: ... - def resolve( - self, - requirements: Iterable[Requirement], - env: Environment | None = None, - installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None, - replace_conflicting: bool = False, - extras: tuple[str, ...] | None = None, - ) -> list[Distribution] | list[_DistributionT]: - """List all distributions needed to (recursively) meet `requirements` - - `requirements` must be a sequence of ``Requirement`` objects. `env`, - if supplied, should be an ``Environment`` instance. If - not supplied, it defaults to all distributions available within any - entry or distribution in the working set. `installer`, if supplied, - will be invoked with each requirement that cannot be met by an - already-installed distribution; it should return a ``Distribution`` or - ``None``. - - Unless `replace_conflicting=True`, raises a VersionConflict exception - if - any requirements are found on the path that have the correct name but - the wrong version. Otherwise, if an `installer` is supplied it will be - invoked to obtain the correct version of the requirement and activate - it. - - `extras` is a list of the extras to be used with these requirements. - This is important because extra requirements may look like `my_req; - extra = "my_extra"`, which would otherwise be interpreted as a purely - optional requirement. Instead, we want to be able to assert that these - requirements are truly required. - """ - - # set up the stack - requirements = list(requirements)[::-1] - # set of processed requirements - processed = set() - # key -> dist - best = {} - to_activate = [] - - req_extras = _ReqExtras() - - # Mapping of requirement to set of distributions that required it; - # useful for reporting info about conflicts. - required_by = collections.defaultdict(set) - - while requirements: - # process dependencies breadth-first - req = requirements.pop(0) - if req in processed: - # Ignore cyclic or redundant dependencies - continue - - if not req_extras.markers_pass(req, extras): - continue - - dist = self._resolve_dist( - req, best, replace_conflicting, env, installer, required_by, to_activate - ) - - # push the new requirements onto the stack - new_requirements = dist.requires(req.extras)[::-1] - requirements.extend(new_requirements) - - # Register the new requirements needed by req - for new_requirement in new_requirements: - required_by[new_requirement].add(req.project_name) - req_extras[new_requirement] = req.extras - - processed.add(req) - - # return list of distros to activate - return to_activate - - def _resolve_dist( - self, req, best, replace_conflicting, env, installer, required_by, to_activate - ) -> Distribution: - dist = best.get(req.key) - if dist is None: - # Find the best distribution and add it to the map - dist = self.by_key.get(req.key) - if dist is None or (dist not in req and replace_conflicting): - ws = self - if env is None: - if dist is None: - env = Environment(self.entries) - else: - # Use an empty environment and workingset to avoid - # any further conflicts with the conflicting - # distribution - env = Environment([]) - ws = WorkingSet([]) - dist = best[req.key] = env.best_match( - req, ws, installer, replace_conflicting=replace_conflicting - ) - if dist is None: - requirers = required_by.get(req, None) - raise DistributionNotFound(req, requirers) - to_activate.append(dist) - if dist not in req: - # Oops, the "best" so far conflicts with a dependency - dependent_req = required_by[req] - raise VersionConflict(dist, req).with_context(dependent_req) - return dist - - @overload - def find_plugins( - self, - plugin_env: Environment, - full_env: Environment | None, - installer: _InstallerTypeT[_DistributionT], - fallback: bool = True, - ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ... - @overload - def find_plugins( - self, - plugin_env: Environment, - full_env: Environment | None = None, - *, - installer: _InstallerTypeT[_DistributionT], - fallback: bool = True, - ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ... - @overload - def find_plugins( - self, - plugin_env: Environment, - full_env: Environment | None = None, - installer: _InstallerType | None = None, - fallback: bool = True, - ) -> tuple[list[Distribution], dict[Distribution, Exception]]: ... - def find_plugins( - self, - plugin_env: Environment, - full_env: Environment | None = None, - installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None, - fallback: bool = True, - ) -> tuple[ - list[Distribution] | list[_DistributionT], - dict[Distribution, Exception], - ]: - """Find all activatable distributions in `plugin_env` - - Example usage:: - - distributions, errors = working_set.find_plugins( - Environment(plugin_dirlist) - ) - # add plugins+libs to sys.path - map(working_set.add, distributions) - # display errors - print('Could not load', errors) - - The `plugin_env` should be an ``Environment`` instance that contains - only distributions that are in the project's "plugin directory" or - directories. The `full_env`, if supplied, should be an ``Environment`` - contains all currently-available distributions. If `full_env` is not - supplied, one is created automatically from the ``WorkingSet`` this - method is called on, which will typically mean that every directory on - ``sys.path`` will be scanned for distributions. - - `installer` is a standard installer callback as used by the - ``resolve()`` method. The `fallback` flag indicates whether we should - attempt to resolve older versions of a plugin if the newest version - cannot be resolved. - - This method returns a 2-tuple: (`distributions`, `error_info`), where - `distributions` is a list of the distributions found in `plugin_env` - that were loadable, along with any other distributions that are needed - to resolve their dependencies. `error_info` is a dictionary mapping - unloadable plugin distributions to an exception instance describing the - error that occurred. Usually this will be a ``DistributionNotFound`` or - ``VersionConflict`` instance. - """ - - plugin_projects = list(plugin_env) - # scan project names in alphabetic order - plugin_projects.sort() - - error_info: dict[Distribution, Exception] = {} - distributions: dict[Distribution, Exception | None] = {} - - if full_env is None: - env = Environment(self.entries) - env += plugin_env - else: - env = full_env + plugin_env - - shadow_set = self.__class__([]) - # put all our entries in shadow_set - list(map(shadow_set.add, self)) - - for project_name in plugin_projects: - for dist in plugin_env[project_name]: - req = [dist.as_requirement()] - - try: - resolvees = shadow_set.resolve(req, env, installer) - - except ResolutionError as v: - # save error info - error_info[dist] = v - if fallback: - # try the next older version of project - continue - else: - # give up on this project, keep going - break - - else: - list(map(shadow_set.add, resolvees)) - distributions.update(dict.fromkeys(resolvees)) - - # success, no need to try any more versions of this project - break - - sorted_distributions = list(distributions) - sorted_distributions.sort() - - return sorted_distributions, error_info - - def require(self, *requirements: _NestedStr): - """Ensure that distributions matching `requirements` are activated - - `requirements` must be a string or a (possibly-nested) sequence - thereof, specifying the distributions and versions required. The - return value is a sequence of the distributions that needed to be - activated to fulfill the requirements; all relevant distributions are - included, even if they were already activated in this working set. - """ - needed = self.resolve(parse_requirements(requirements)) - - for dist in needed: - self.add(dist) - - return needed - - def subscribe( - self, callback: Callable[[Distribution], object], existing: bool = True - ): - """Invoke `callback` for all distributions - - If `existing=True` (default), - call on all existing ones, as well. - """ - if callback in self.callbacks: - return - self.callbacks.append(callback) - if not existing: - return - for dist in self: - callback(dist) - - def _added_new(self, dist): - for callback in self.callbacks: - callback(dist) - - def __getstate__(self): - return ( - self.entries[:], - self.entry_keys.copy(), - self.by_key.copy(), - self.normalized_to_canonical_keys.copy(), - self.callbacks[:], - ) - - def __setstate__(self, e_k_b_n_c): - entries, keys, by_key, normalized_to_canonical_keys, callbacks = e_k_b_n_c - self.entries = entries[:] - self.entry_keys = keys.copy() - self.by_key = by_key.copy() - self.normalized_to_canonical_keys = normalized_to_canonical_keys.copy() - self.callbacks = callbacks[:] - - -class _ReqExtras(Dict["Requirement", Tuple[str, ...]]): - """ - Map each requirement to the extras that demanded it. - """ - - def markers_pass(self, req: Requirement, extras: tuple[str, ...] | None = None): - """ - Evaluate markers for req against each extra that - demanded it. - - Return False if the req has a marker and fails - evaluation. Otherwise, return True. - """ - extra_evals = ( - req.marker.evaluate({'extra': extra}) - for extra in self.get(req, ()) + (extras or (None,)) - ) - return not req.marker or any(extra_evals) - - -class Environment: - """Searchable snapshot of distributions on a search path""" - - def __init__( - self, - search_path: Iterable[str] | None = None, - platform: str | None = get_supported_platform(), - python: str | None = PY_MAJOR, - ): - """Snapshot distributions available on a search path - - Any distributions found on `search_path` are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. - - `platform` is an optional string specifying the name of the platform - that platform-specific distributions must be compatible with. If - unspecified, it defaults to the current platform. `python` is an - optional string naming the desired version of Python (e.g. ``'3.6'``); - it defaults to the current version. - - You may explicitly set `platform` (and/or `python`) to ``None`` if you - wish to map *all* distributions, not just those compatible with the - running platform or Python version. - """ - self._distmap = {} - self.platform = platform - self.python = python - self.scan(search_path) - - def can_add(self, dist: Distribution): - """Is distribution `dist` acceptable for this environment? - - The distribution must match the platform and python version - requirements specified when this environment was created, or False - is returned. - """ - py_compat = ( - self.python is None - or dist.py_version is None - or dist.py_version == self.python - ) - return py_compat and compatible_platforms(dist.platform, self.platform) - - def remove(self, dist: Distribution): - """Remove `dist` from the environment""" - self._distmap[dist.key].remove(dist) - - def scan(self, search_path: Iterable[str] | None = None): - """Scan `search_path` for distributions usable in this environment - - Any distributions found are added to the environment. - `search_path` should be a sequence of ``sys.path`` items. If not - supplied, ``sys.path`` is used. Only distributions conforming to - the platform/python version defined at initialization are added. - """ - if search_path is None: - search_path = sys.path - - for item in search_path: - for dist in find_distributions(item): - self.add(dist) - - def __getitem__(self, project_name: str) -> list[Distribution]: - """Return a newest-to-oldest list of distributions for `project_name` - - Uses case-insensitive `project_name` comparison, assuming all the - project's distributions use their project's name converted to all - lowercase as their key. - - """ - distribution_key = project_name.lower() - return self._distmap.get(distribution_key, []) - - def add(self, dist: Distribution): - """Add `dist` if we ``can_add()`` it and it has not already been added""" - if self.can_add(dist) and dist.has_version(): - dists = self._distmap.setdefault(dist.key, []) - if dist not in dists: - dists.append(dist) - dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) - - @overload - def best_match( - self, - req: Requirement, - working_set: WorkingSet, - installer: _InstallerTypeT[_DistributionT], - replace_conflicting: bool = False, - ) -> _DistributionT: ... - @overload - def best_match( - self, - req: Requirement, - working_set: WorkingSet, - installer: _InstallerType | None = None, - replace_conflicting: bool = False, - ) -> Distribution | None: ... - def best_match( - self, - req: Requirement, - working_set: WorkingSet, - installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None, - replace_conflicting: bool = False, - ) -> Distribution | None: - """Find distribution best matching `req` and usable on `working_set` - - This calls the ``find(req)`` method of the `working_set` to see if a - suitable distribution is already active. (This may raise - ``VersionConflict`` if an unsuitable version of the project is already - active in the specified `working_set`.) If a suitable distribution - isn't active, this method returns the newest distribution in the - environment that meets the ``Requirement`` in `req`. If no suitable - distribution is found, and `installer` is supplied, then the result of - calling the environment's ``obtain(req, installer)`` method will be - returned. - """ - try: - dist = working_set.find(req) - except VersionConflict: - if not replace_conflicting: - raise - dist = None - if dist is not None: - return dist - for dist in self[req.key]: - if dist in req: - return dist - # try to download/install - return self.obtain(req, installer) - - @overload - def obtain( - self, - requirement: Requirement, - installer: _InstallerTypeT[_DistributionT], - ) -> _DistributionT: ... - @overload - def obtain( - self, - requirement: Requirement, - installer: Callable[[Requirement], None] | None = None, - ) -> None: ... - @overload - def obtain( - self, - requirement: Requirement, - installer: _InstallerType | None = None, - ) -> Distribution | None: ... - def obtain( - self, - requirement: Requirement, - installer: Callable[[Requirement], None] - | _InstallerType - | None - | _InstallerTypeT[_DistributionT] = None, - ) -> Distribution | None: - """Obtain a distribution matching `requirement` (e.g. via download) - - Obtain a distro that matches requirement (e.g. via download). In the - base ``Environment`` class, this routine just returns - ``installer(requirement)``, unless `installer` is None, in which case - None is returned instead. This method is a hook that allows subclasses - to attempt other ways of obtaining a distribution before falling back - to the `installer` argument.""" - return installer(requirement) if installer else None - - def __iter__(self) -> Iterator[str]: - """Yield the unique project names of the available distributions""" - for key in self._distmap.keys(): - if self[key]: - yield key - - def __iadd__(self, other: Distribution | Environment): - """In-place addition of a distribution or environment""" - if isinstance(other, Distribution): - self.add(other) - elif isinstance(other, Environment): - for project in other: - for dist in other[project]: - self.add(dist) - else: - raise TypeError("Can't add %r to environment" % (other,)) - return self - - def __add__(self, other: Distribution | Environment): - """Add an environment or distribution to an environment""" - new = self.__class__([], platform=None, python=None) - for env in self, other: - new += env - return new - - -# XXX backward compatibility -AvailableDistributions = Environment - - -class ExtractionError(RuntimeError): - """An error occurred extracting a resource - - The following attributes are available from instances of this exception: - - manager - The resource manager that raised this exception - - cache_path - The base directory for resource extraction - - original_error - The exception instance that caused extraction to fail - """ - - manager: ResourceManager - cache_path: str - original_error: BaseException | None - - -class ResourceManager: - """Manage resource extraction and packages""" - - extraction_path: str | None = None - - def __init__(self): - self.cached_files = {} - - def resource_exists(self, package_or_requirement: _PkgReqType, resource_name: str): - """Does the named resource exist?""" - return get_provider(package_or_requirement).has_resource(resource_name) - - def resource_isdir(self, package_or_requirement: _PkgReqType, resource_name: str): - """Is the named resource an existing directory?""" - return get_provider(package_or_requirement).resource_isdir(resource_name) - - def resource_filename( - self, package_or_requirement: _PkgReqType, resource_name: str - ): - """Return a true filesystem path for specified resource""" - return get_provider(package_or_requirement).get_resource_filename( - self, resource_name - ) - - def resource_stream(self, package_or_requirement: _PkgReqType, resource_name: str): - """Return a readable file-like object for specified resource""" - return get_provider(package_or_requirement).get_resource_stream( - self, resource_name - ) - - def resource_string( - self, package_or_requirement: _PkgReqType, resource_name: str - ) -> bytes: - """Return specified resource as :obj:`bytes`""" - return get_provider(package_or_requirement).get_resource_string( - self, resource_name - ) - - def resource_listdir(self, package_or_requirement: _PkgReqType, resource_name: str): - """List the contents of the named resource directory""" - return get_provider(package_or_requirement).resource_listdir(resource_name) - - def extraction_error(self) -> NoReturn: - """Give an error message for problems extracting file(s)""" - - old_exc = sys.exc_info()[1] - cache_path = self.extraction_path or get_default_cache() - - tmpl = textwrap.dedent( - """ - Can't extract file(s) to egg cache - - The following error occurred while trying to extract file(s) - to the Python egg cache: - - {old_exc} - - The Python egg cache directory is currently set to: - - {cache_path} - - Perhaps your account does not have write access to this directory? - You can change the cache directory by setting the PYTHON_EGG_CACHE - environment variable to point to an accessible directory. - """ - ).lstrip() - err = ExtractionError(tmpl.format(**locals())) - err.manager = self - err.cache_path = cache_path - err.original_error = old_exc - raise err - - def get_cache_path(self, archive_name: str, names: Iterable[StrPath] = ()): - """Return absolute location in cache for `archive_name` and `names` - - The parent directory of the resulting path will be created if it does - not already exist. `archive_name` should be the base filename of the - enclosing egg (which may not be the name of the enclosing zipfile!), - including its ".egg" extension. `names`, if provided, should be a - sequence of path name parts "under" the egg's extraction location. - - This method should only be called by resource providers that need to - obtain an extraction location, and only for names they intend to - extract, as it tracks the generated names for possible cleanup later. - """ - extract_path = self.extraction_path or get_default_cache() - target_path = os.path.join(extract_path, archive_name + '-tmp', *names) - try: - _bypass_ensure_directory(target_path) - except Exception: - self.extraction_error() - - self._warn_unsafe_extraction_path(extract_path) - - self.cached_files[target_path] = True - return target_path - - @staticmethod - def _warn_unsafe_extraction_path(path): - """ - If the default extraction path is overridden and set to an insecure - location, such as /tmp, it opens up an opportunity for an attacker to - replace an extracted file with an unauthorized payload. Warn the user - if a known insecure location is used. - - See Distribute #375 for more details. - """ - if os.name == 'nt' and not path.startswith(os.environ['windir']): - # On Windows, permissions are generally restrictive by default - # and temp directories are not writable by other users, so - # bypass the warning. - return - mode = os.stat(path).st_mode - if mode & stat.S_IWOTH or mode & stat.S_IWGRP: - msg = ( - "Extraction path is writable by group/others " - "and vulnerable to attack when " - "used with get_resource_filename ({path}). " - "Consider a more secure " - "location (set with .set_extraction_path or the " - "PYTHON_EGG_CACHE environment variable)." - ).format(**locals()) - warnings.warn(msg, UserWarning) - - def postprocess(self, tempname: StrOrBytesPath, filename: StrOrBytesPath): - """Perform any platform-specific postprocessing of `tempname` - - This is where Mac header rewrites should be done; other platforms don't - have anything special they should do. - - Resource providers should call this method ONLY after successfully - extracting a compressed resource. They must NOT call it on resources - that are already in the filesystem. - - `tempname` is the current (temporary) name of the file, and `filename` - is the name it will be renamed to by the caller after this routine - returns. - """ - - if os.name == 'posix': - # Make the resource executable - mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 - os.chmod(tempname, mode) - - def set_extraction_path(self, path: str): - """Set the base path where resources will be extracted to, if needed. - - If you do not call this routine before any extractions take place, the - path defaults to the return value of ``get_default_cache()``. (Which - is based on the ``PYTHON_EGG_CACHE`` environment variable, with various - platform-specific fallbacks. See that routine's documentation for more - details.) - - Resources are extracted to subdirectories of this path based upon - information given by the ``IResourceProvider``. You may set this to a - temporary directory, but then you must call ``cleanup_resources()`` to - delete the extracted files when done. There is no guarantee that - ``cleanup_resources()`` will be able to remove all extracted files. - - (Note: you may not change the extraction path for a given resource - manager once resources have been extracted, unless you first call - ``cleanup_resources()``.) - """ - if self.cached_files: - raise ValueError("Can't change extraction path, files already extracted") - - self.extraction_path = path - - def cleanup_resources(self, force: bool = False) -> list[str]: - """ - Delete all extracted resource files and directories, returning a list - of the file and directory names that could not be successfully removed. - This function does not have any concurrency protection, so it should - generally only be called when the extraction path is a temporary - directory exclusive to a single process. This method is not - automatically called; you must call it explicitly or register it as an - ``atexit`` function if you wish to ensure cleanup of a temporary - directory used for extractions. - """ - # XXX - return [] - - -def get_default_cache() -> str: - """ - Return the ``PYTHON_EGG_CACHE`` environment variable - or a platform-relevant user cache dir for an app - named "Python-Eggs". - """ - return os.environ.get('PYTHON_EGG_CACHE') or _user_cache_dir(appname='Python-Eggs') - - -def safe_name(name: str): - """Convert an arbitrary string to a standard distribution name - - Any runs of non-alphanumeric/. characters are replaced with a single '-'. - """ - return re.sub('[^A-Za-z0-9.]+', '-', name) - - -def safe_version(version: str): - """ - Convert an arbitrary string to a standard version string - """ - try: - # normalize the version - return str(_packaging_version.Version(version)) - except _packaging_version.InvalidVersion: - version = version.replace(' ', '.') - return re.sub('[^A-Za-z0-9.]+', '-', version) - - -def _forgiving_version(version): - """Fallback when ``safe_version`` is not safe enough - >>> parse_version(_forgiving_version('0.23ubuntu1')) - - >>> parse_version(_forgiving_version('0.23-')) - - >>> parse_version(_forgiving_version('0.-_')) - - >>> parse_version(_forgiving_version('42.+?1')) - - >>> parse_version(_forgiving_version('hello world')) - - """ - version = version.replace(' ', '.') - match = _PEP440_FALLBACK.search(version) - if match: - safe = match["safe"] - rest = version[len(safe) :] - else: - safe = "0" - rest = version - local = f"sanitized.{_safe_segment(rest)}".strip(".") - return f"{safe}.dev0+{local}" - - -def _safe_segment(segment): - """Convert an arbitrary string into a safe segment""" - segment = re.sub('[^A-Za-z0-9.]+', '-', segment) - segment = re.sub('-[^A-Za-z0-9]+', '-', segment) - return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-") - - -def safe_extra(extra: str): - """Convert an arbitrary string to a standard 'extra' name - - Any runs of non-alphanumeric characters are replaced with a single '_', - and the result is always lowercased. - """ - return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() - - -def to_filename(name: str): - """Convert a project or version name to its filename-escaped form - - Any '-' characters are currently replaced with '_'. - """ - return name.replace('-', '_') - - -def invalid_marker(text: str): - """ - Validate text as a PEP 508 environment marker; return an exception - if invalid or False otherwise. - """ - try: - evaluate_marker(text) - except SyntaxError as e: - e.filename = None - e.lineno = None - return e - return False - - -def evaluate_marker(text: str, extra: str | None = None) -> bool: - """ - Evaluate a PEP 508 environment marker. - Return a boolean indicating the marker result in this environment. - Raise SyntaxError if marker is invalid. - - This implementation uses the 'pyparsing' module. - """ - try: - marker = _packaging_markers.Marker(text) - return marker.evaluate() - except _packaging_markers.InvalidMarker as e: - raise SyntaxError(e) from e - - -class NullProvider: - """Try to implement resources and metadata for arbitrary PEP 302 loaders""" - - egg_name: str | None = None - egg_info: str | None = None - loader: _LoaderProtocol | None = None - - def __init__(self, module: _ModuleLike): - self.loader = getattr(module, '__loader__', None) - self.module_path = os.path.dirname(getattr(module, '__file__', '')) - - def get_resource_filename(self, manager: ResourceManager, resource_name: str): - return self._fn(self.module_path, resource_name) - - def get_resource_stream(self, manager: ResourceManager, resource_name: str): - return io.BytesIO(self.get_resource_string(manager, resource_name)) - - def get_resource_string( - self, manager: ResourceManager, resource_name: str - ) -> bytes: - return self._get(self._fn(self.module_path, resource_name)) - - def has_resource(self, resource_name: str): - return self._has(self._fn(self.module_path, resource_name)) - - def _get_metadata_path(self, name): - return self._fn(self.egg_info, name) - - def has_metadata(self, name: str) -> bool: - if not self.egg_info: - return False - - path = self._get_metadata_path(name) - return self._has(path) - - def get_metadata(self, name: str): - if not self.egg_info: - return "" - path = self._get_metadata_path(name) - value = self._get(path) - try: - return value.decode('utf-8') - except UnicodeDecodeError as exc: - # Include the path in the error message to simplify - # troubleshooting, and without changing the exception type. - exc.reason += ' in {} file at path: {}'.format(name, path) - raise - - def get_metadata_lines(self, name: str) -> Iterator[str]: - return yield_lines(self.get_metadata(name)) - - def resource_isdir(self, resource_name: str): - return self._isdir(self._fn(self.module_path, resource_name)) - - def metadata_isdir(self, name: str) -> bool: - return bool(self.egg_info and self._isdir(self._fn(self.egg_info, name))) - - def resource_listdir(self, resource_name: str): - return self._listdir(self._fn(self.module_path, resource_name)) - - def metadata_listdir(self, name: str) -> list[str]: - if self.egg_info: - return self._listdir(self._fn(self.egg_info, name)) - return [] - - def run_script(self, script_name: str, namespace: dict[str, Any]): - script = 'scripts/' + script_name - if not self.has_metadata(script): - raise ResolutionError( - "Script {script!r} not found in metadata at {self.egg_info!r}".format( - **locals() - ), - ) - - script_text = self.get_metadata(script).replace('\r\n', '\n') - script_text = script_text.replace('\r', '\n') - script_filename = self._fn(self.egg_info, script) - namespace['__file__'] = script_filename - if os.path.exists(script_filename): - source = _read_utf8_with_fallback(script_filename) - code = compile(source, script_filename, 'exec') - exec(code, namespace, namespace) - else: - from linecache import cache - - cache[script_filename] = ( - len(script_text), - 0, - script_text.split('\n'), - script_filename, - ) - script_code = compile(script_text, script_filename, 'exec') - exec(script_code, namespace, namespace) - - def _has(self, path) -> bool: - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _isdir(self, path) -> bool: - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _listdir(self, path) -> list[str]: - raise NotImplementedError( - "Can't perform this operation for unregistered loader type" - ) - - def _fn(self, base: str | None, resource_name: str): - if base is None: - raise TypeError( - "`base` parameter in `_fn` is `None`. Either override this method or check the parameter first." - ) - self._validate_resource_path(resource_name) - if resource_name: - return os.path.join(base, *resource_name.split('/')) - return base - - @staticmethod - def _validate_resource_path(path): - """ - Validate the resource paths according to the docs. - https://setuptools.pypa.io/en/latest/pkg_resources.html#basic-resource-access - - >>> warned = getfixture('recwarn') - >>> warnings.simplefilter('always') - >>> vrp = NullProvider._validate_resource_path - >>> vrp('foo/bar.txt') - >>> bool(warned) - False - >>> vrp('../foo/bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('/foo/bar.txt') - >>> bool(warned) - True - >>> vrp('foo/../../bar.txt') - >>> bool(warned) - True - >>> warned.clear() - >>> vrp('foo/f../bar.txt') - >>> bool(warned) - False - - Windows path separators are straight-up disallowed. - >>> vrp(r'\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - >>> vrp(r'C:\\foo/bar.txt') - Traceback (most recent call last): - ... - ValueError: Use of .. or absolute path in a resource path \ -is not allowed. - - Blank values are allowed - - >>> vrp('') - >>> bool(warned) - False - - Non-string values are not. - - >>> vrp(None) - Traceback (most recent call last): - ... - AttributeError: ... - """ - invalid = ( - os.path.pardir in path.split(posixpath.sep) - or posixpath.isabs(path) - or ntpath.isabs(path) - or path.startswith("\\") - ) - if not invalid: - return - - msg = "Use of .. or absolute path in a resource path is not allowed." - - # Aggressively disallow Windows absolute paths - if (path.startswith("\\") or ntpath.isabs(path)) and not posixpath.isabs(path): - raise ValueError(msg) - - # for compatibility, warn; in future - # raise ValueError(msg) - issue_warning( - msg[:-1] + " and will raise exceptions in a future release.", - DeprecationWarning, - ) - - def _get(self, path) -> bytes: - if hasattr(self.loader, 'get_data') and self.loader: - # Already checked get_data exists - return self.loader.get_data(path) # type: ignore[attr-defined] - raise NotImplementedError( - "Can't perform this operation for loaders without 'get_data()'" - ) - - -register_loader_type(object, NullProvider) - - -def _parents(path): - """ - yield all parents of path including path - """ - last = None - while path != last: - yield path - last = path - path, _ = os.path.split(path) - - -class EggProvider(NullProvider): - """Provider based on a virtual filesystem""" - - def __init__(self, module: _ModuleLike): - super().__init__(module) - self._setup_prefix() - - def _setup_prefix(self): - # Assume that metadata may be nested inside a "basket" - # of multiple eggs and use module_path instead of .archive. - eggs = filter(_is_egg_path, _parents(self.module_path)) - egg = next(eggs, None) - egg and self._set_egg(egg) - - def _set_egg(self, path: str): - self.egg_name = os.path.basename(path) - self.egg_info = os.path.join(path, 'EGG-INFO') - self.egg_root = path - - -class DefaultProvider(EggProvider): - """Provides access to package resources in the filesystem""" - - def _has(self, path) -> bool: - return os.path.exists(path) - - def _isdir(self, path) -> bool: - return os.path.isdir(path) - - def _listdir(self, path): - return os.listdir(path) - - def get_resource_stream(self, manager: object, resource_name: str): - return open(self._fn(self.module_path, resource_name), 'rb') - - def _get(self, path) -> bytes: - with open(path, 'rb') as stream: - return stream.read() - - @classmethod - def _register(cls): - loader_names = ( - 'SourceFileLoader', - 'SourcelessFileLoader', - ) - for name in loader_names: - loader_cls = getattr(importlib.machinery, name, type(None)) - register_loader_type(loader_cls, cls) - - -DefaultProvider._register() - - -class EmptyProvider(NullProvider): - """Provider that returns nothing for all requests""" - - # A special case, we don't want all Providers inheriting from NullProvider to have a potentially None module_path - module_path: str | None = None # type: ignore[assignment] - - _isdir = _has = lambda self, path: False - - def _get(self, path) -> bytes: - return b'' - - def _listdir(self, path): - return [] - - def __init__(self): - pass - - -empty_provider = EmptyProvider() - - -class ZipManifests(Dict[str, "MemoizedZipManifests.manifest_mod"]): - """ - zip manifest builder - """ - - # `path` could be `StrPath | IO[bytes]` but that violates the LSP for `MemoizedZipManifests.load` - @classmethod - def build(cls, path: str): - """ - Build a dictionary similar to the zipimport directory - caches, except instead of tuples, store ZipInfo objects. - - Use a platform-specific path separator (os.sep) for the path keys - for compatibility with pypy on Windows. - """ - with zipfile.ZipFile(path) as zfile: - items = ( - ( - name.replace('/', os.sep), - zfile.getinfo(name), - ) - for name in zfile.namelist() - ) - return dict(items) - - load = build - - -class MemoizedZipManifests(ZipManifests): - """ - Memoized zipfile manifests. - """ - - class manifest_mod(NamedTuple): - manifest: dict[str, zipfile.ZipInfo] - mtime: float - - def load(self, path: str) -> dict[str, zipfile.ZipInfo]: # type: ignore[override] # ZipManifests.load is a classmethod - """ - Load a manifest at path or return a suitable manifest already loaded. - """ - path = os.path.normpath(path) - mtime = os.stat(path).st_mtime - - if path not in self or self[path].mtime != mtime: - manifest = self.build(path) - self[path] = self.manifest_mod(manifest, mtime) - - return self[path].manifest - - -class ZipProvider(EggProvider): - """Resource support for zips and eggs""" - - eagers: list[str] | None = None - _zip_manifests = MemoizedZipManifests() - # ZipProvider's loader should always be a zipimporter or equivalent - loader: zipimport.zipimporter - - def __init__(self, module: _ZipLoaderModule): - super().__init__(module) - self.zip_pre = self.loader.archive + os.sep - - def _zipinfo_name(self, fspath): - # Convert a virtual filename (full path to file) into a zipfile subpath - # usable with the zipimport directory cache for our target archive - fspath = fspath.rstrip(os.sep) - if fspath == self.loader.archive: - return '' - if fspath.startswith(self.zip_pre): - return fspath[len(self.zip_pre) :] - raise AssertionError("%s is not a subpath of %s" % (fspath, self.zip_pre)) - - def _parts(self, zip_path): - # Convert a zipfile subpath into an egg-relative path part list. - # pseudo-fs path - fspath = self.zip_pre + zip_path - if fspath.startswith(self.egg_root + os.sep): - return fspath[len(self.egg_root) + 1 :].split(os.sep) - raise AssertionError("%s is not a subpath of %s" % (fspath, self.egg_root)) - - @property - def zipinfo(self): - return self._zip_manifests.load(self.loader.archive) - - def get_resource_filename(self, manager: ResourceManager, resource_name: str): - if not self.egg_name: - raise NotImplementedError( - "resource_filename() only supported for .egg, not .zip" - ) - # no need to lock for extraction, since we use temp names - zip_path = self._resource_to_zip(resource_name) - eagers = self._get_eager_resources() - if '/'.join(self._parts(zip_path)) in eagers: - for name in eagers: - self._extract_resource(manager, self._eager_to_zip(name)) - return self._extract_resource(manager, zip_path) - - @staticmethod - def _get_date_and_size(zip_stat): - size = zip_stat.file_size - # ymdhms+wday, yday, dst - date_time = zip_stat.date_time + (0, 0, -1) - # 1980 offset already done - timestamp = time.mktime(date_time) - return timestamp, size - - # FIXME: 'ZipProvider._extract_resource' is too complex (12) - def _extract_resource(self, manager: ResourceManager, zip_path) -> str: # noqa: C901 - if zip_path in self._index(): - for name in self._index()[zip_path]: - last = self._extract_resource(manager, os.path.join(zip_path, name)) - # return the extracted directory name - return os.path.dirname(last) - - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - - if not WRITE_SUPPORT: - raise OSError( - '"os.rename" and "os.unlink" are not supported on this platform' - ) - try: - if not self.egg_name: - raise OSError( - '"egg_name" is empty. This likely means no egg could be found from the "module_path".' - ) - real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path)) - - if self._is_current(real_path, zip_path): - return real_path - - outf, tmpnam = _mkstemp( - ".$extract", - dir=os.path.dirname(real_path), - ) - os.write(outf, self.loader.get_data(zip_path)) - os.close(outf) - utime(tmpnam, (timestamp, timestamp)) - manager.postprocess(tmpnam, real_path) - - try: - rename(tmpnam, real_path) - - except OSError: - if os.path.isfile(real_path): - if self._is_current(real_path, zip_path): - # the file became current since it was checked above, - # so proceed. - return real_path - # Windows, del old file and retry - elif os.name == 'nt': - unlink(real_path) - rename(tmpnam, real_path) - return real_path - raise - - except OSError: - # report a user-friendly error - manager.extraction_error() - - return real_path - - def _is_current(self, file_path, zip_path): - """ - Return True if the file_path is current for this zip_path - """ - timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) - if not os.path.isfile(file_path): - return False - stat = os.stat(file_path) - if stat.st_size != size or stat.st_mtime != timestamp: - return False - # check that the contents match - zip_contents = self.loader.get_data(zip_path) - with open(file_path, 'rb') as f: - file_contents = f.read() - return zip_contents == file_contents - - def _get_eager_resources(self): - if self.eagers is None: - eagers = [] - for name in ('native_libs.txt', 'eager_resources.txt'): - if self.has_metadata(name): - eagers.extend(self.get_metadata_lines(name)) - self.eagers = eagers - return self.eagers - - def _index(self): - try: - return self._dirindex - except AttributeError: - ind = {} - for path in self.zipinfo: - parts = path.split(os.sep) - while parts: - parent = os.sep.join(parts[:-1]) - if parent in ind: - ind[parent].append(parts[-1]) - break - else: - ind[parent] = [parts.pop()] - self._dirindex = ind - return ind - - def _has(self, fspath) -> bool: - zip_path = self._zipinfo_name(fspath) - return zip_path in self.zipinfo or zip_path in self._index() - - def _isdir(self, fspath) -> bool: - return self._zipinfo_name(fspath) in self._index() - - def _listdir(self, fspath): - return list(self._index().get(self._zipinfo_name(fspath), ())) - - def _eager_to_zip(self, resource_name: str): - return self._zipinfo_name(self._fn(self.egg_root, resource_name)) - - def _resource_to_zip(self, resource_name: str): - return self._zipinfo_name(self._fn(self.module_path, resource_name)) - - -register_loader_type(zipimport.zipimporter, ZipProvider) - - -class FileMetadata(EmptyProvider): - """Metadata handler for standalone PKG-INFO files - - Usage:: - - metadata = FileMetadata("/path/to/PKG-INFO") - - This provider rejects all data and metadata requests except for PKG-INFO, - which is treated as existing, and will be the contents of the file at - the provided location. - """ - - def __init__(self, path: StrPath): - self.path = path - - def _get_metadata_path(self, name): - return self.path - - def has_metadata(self, name: str) -> bool: - return name == 'PKG-INFO' and os.path.isfile(self.path) - - def get_metadata(self, name: str): - if name != 'PKG-INFO': - raise KeyError("No metadata except PKG-INFO is available") - - with open(self.path, encoding='utf-8', errors="replace") as f: - metadata = f.read() - self._warn_on_replacement(metadata) - return metadata - - def _warn_on_replacement(self, metadata): - replacement_char = '�' - if replacement_char in metadata: - tmpl = "{self.path} could not be properly decoded in UTF-8" - msg = tmpl.format(**locals()) - warnings.warn(msg) - - def get_metadata_lines(self, name: str) -> Iterator[str]: - return yield_lines(self.get_metadata(name)) - - -class PathMetadata(DefaultProvider): - """Metadata provider for egg directories - - Usage:: - - # Development eggs: - - egg_info = "/path/to/PackageName.egg-info" - base_dir = os.path.dirname(egg_info) - metadata = PathMetadata(base_dir, egg_info) - dist_name = os.path.splitext(os.path.basename(egg_info))[0] - dist = Distribution(basedir, project_name=dist_name, metadata=metadata) - - # Unpacked egg directories: - - egg_path = "/path/to/PackageName-ver-pyver-etc.egg" - metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) - dist = Distribution.from_filename(egg_path, metadata=metadata) - """ - - def __init__(self, path: str, egg_info: str): - self.module_path = path - self.egg_info = egg_info - - -class EggMetadata(ZipProvider): - """Metadata provider for .egg files""" - - def __init__(self, importer: zipimport.zipimporter): - """Create a metadata provider from a zipimporter""" - - self.zip_pre = importer.archive + os.sep - self.loader = importer - if importer.prefix: - self.module_path = os.path.join(importer.archive, importer.prefix) - else: - self.module_path = importer.archive - self._setup_prefix() - - -_distribution_finders: dict[type, _DistFinderType[Any]] = _declare_state( - 'dict', '_distribution_finders', {} -) - - -def register_finder(importer_type: type[_T], distribution_finder: _DistFinderType[_T]): - """Register `distribution_finder` to find distributions in sys.path items - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `distribution_finder` is a callable that, passed a path - item and the importer instance, yields ``Distribution`` instances found on - that path item. See ``pkg_resources.find_on_path`` for an example.""" - _distribution_finders[importer_type] = distribution_finder - - -def find_distributions(path_item: str, only: bool = False): - """Yield distributions accessible via `path_item`""" - importer = get_importer(path_item) - finder = _find_adapter(_distribution_finders, importer) - return finder(importer, path_item, only) - - -def find_eggs_in_zip( - importer: zipimport.zipimporter, path_item: str, only: bool = False -) -> Iterator[Distribution]: - """ - Find eggs in zip files; possibly multiple nested eggs. - """ - if importer.archive.endswith('.whl'): - # wheels are not supported with this finder - # they don't have PKG-INFO metadata, and won't ever contain eggs - return - metadata = EggMetadata(importer) - if metadata.has_metadata('PKG-INFO'): - yield Distribution.from_filename(path_item, metadata=metadata) - if only: - # don't yield nested distros - return - for subitem in metadata.resource_listdir(''): - if _is_egg_path(subitem): - subpath = os.path.join(path_item, subitem) - dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) - yield from dists - elif subitem.lower().endswith(('.dist-info', '.egg-info')): - subpath = os.path.join(path_item, subitem) - submeta = EggMetadata(zipimport.zipimporter(subpath)) - submeta.egg_info = subpath - yield Distribution.from_location(path_item, subitem, submeta) - - -register_finder(zipimport.zipimporter, find_eggs_in_zip) - - -def find_nothing( - importer: object | None, path_item: str | None, only: bool | None = False -): - return () - - -register_finder(object, find_nothing) - - -def find_on_path(importer: object | None, path_item, only=False): - """Yield distributions accessible on a sys.path directory""" - path_item = _normalize_cached(path_item) - - if _is_unpacked_egg(path_item): - yield Distribution.from_filename( - path_item, - metadata=PathMetadata(path_item, os.path.join(path_item, 'EGG-INFO')), - ) - return - - entries = (os.path.join(path_item, child) for child in safe_listdir(path_item)) - - # scan for .egg and .egg-info in directory - for entry in sorted(entries): - fullpath = os.path.join(path_item, entry) - factory = dist_factory(path_item, entry, only) - yield from factory(fullpath) - - -def dist_factory(path_item, entry, only): - """Return a dist_factory for the given entry.""" - lower = entry.lower() - is_egg_info = lower.endswith('.egg-info') - is_dist_info = lower.endswith('.dist-info') and os.path.isdir( - os.path.join(path_item, entry) - ) - is_meta = is_egg_info or is_dist_info - return ( - distributions_from_metadata - if is_meta - else find_distributions - if not only and _is_egg_path(entry) - else resolve_egg_link - if not only and lower.endswith('.egg-link') - else NoDists() - ) - - -class NoDists: - """ - >>> bool(NoDists()) - False - - >>> list(NoDists()('anything')) - [] - """ - - def __bool__(self): - return False - - def __call__(self, fullpath): - return iter(()) - - -def safe_listdir(path: StrOrBytesPath): - """ - Attempt to list contents of path, but suppress some exceptions. - """ - try: - return os.listdir(path) - except (PermissionError, NotADirectoryError): - pass - except OSError as e: - # Ignore the directory if does not exist, not a directory or - # permission denied - if e.errno not in (errno.ENOTDIR, errno.EACCES, errno.ENOENT): - raise - return () - - -def distributions_from_metadata(path: str): - root = os.path.dirname(path) - if os.path.isdir(path): - if len(os.listdir(path)) == 0: - # empty metadata dir; skip - return - metadata: _MetadataType = PathMetadata(root, path) - else: - metadata = FileMetadata(path) - entry = os.path.basename(path) - yield Distribution.from_location( - root, - entry, - metadata, - precedence=DEVELOP_DIST, - ) - - -def non_empty_lines(path): - """ - Yield non-empty lines from file at path - """ - for line in _read_utf8_with_fallback(path).splitlines(): - line = line.strip() - if line: - yield line - - -def resolve_egg_link(path): - """ - Given a path to an .egg-link, resolve distributions - present in the referenced path. - """ - referenced_paths = non_empty_lines(path) - resolved_paths = ( - os.path.join(os.path.dirname(path), ref) for ref in referenced_paths - ) - dist_groups = map(find_distributions, resolved_paths) - return next(dist_groups, ()) - - -if hasattr(pkgutil, 'ImpImporter'): - register_finder(pkgutil.ImpImporter, find_on_path) - -register_finder(importlib.machinery.FileFinder, find_on_path) - -_namespace_handlers: dict[type, _NSHandlerType[Any]] = _declare_state( - 'dict', '_namespace_handlers', {} -) -_namespace_packages: dict[str | None, list[str]] = _declare_state( - 'dict', '_namespace_packages', {} -) - - -def register_namespace_handler( - importer_type: type[_T], namespace_handler: _NSHandlerType[_T] -): - """Register `namespace_handler` to declare namespace packages - - `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item - handler), and `namespace_handler` is a callable like this:: - - def namespace_handler(importer, path_entry, moduleName, module): - # return a path_entry to use for child packages - - Namespace handlers are only called if the importer object has already - agreed that it can handle the relevant path item, and they should only - return a subpath if the module __path__ does not already contain an - equivalent subpath. For an example namespace handler, see - ``pkg_resources.file_ns_handler``. - """ - _namespace_handlers[importer_type] = namespace_handler - - -def _handle_ns(packageName, path_item): - """Ensure that named package includes a subpath of path_item (if needed)""" - - importer = get_importer(path_item) - if importer is None: - return None - - # use find_spec (PEP 451) and fall-back to find_module (PEP 302) - try: - spec = importer.find_spec(packageName) - except AttributeError: - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - loader = importer.find_module(packageName) - else: - loader = spec.loader if spec else None - - if loader is None: - return None - module = sys.modules.get(packageName) - if module is None: - module = sys.modules[packageName] = types.ModuleType(packageName) - module.__path__ = [] - _set_parent_ns(packageName) - elif not hasattr(module, '__path__'): - raise TypeError("Not a package:", packageName) - handler = _find_adapter(_namespace_handlers, importer) - subpath = handler(importer, path_item, packageName, module) - if subpath is not None: - path = module.__path__ - path.append(subpath) - importlib.import_module(packageName) - _rebuild_mod_path(path, packageName, module) - return subpath - - -def _rebuild_mod_path(orig_path, package_name, module: types.ModuleType): - """ - Rebuild module.__path__ ensuring that all entries are ordered - corresponding to their sys.path order - """ - sys_path = [_normalize_cached(p) for p in sys.path] - - def safe_sys_path_index(entry): - """ - Workaround for #520 and #513. - """ - try: - return sys_path.index(entry) - except ValueError: - return float('inf') - - def position_in_sys_path(path): - """ - Return the ordinal of the path based on its position in sys.path - """ - path_parts = path.split(os.sep) - module_parts = package_name.count('.') + 1 - parts = path_parts[:-module_parts] - return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName: str): - """Declare that package 'packageName' is a namespace package""" - - msg = ( - f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n" - "Implementing implicit namespace packages (as specified in PEP 420) " - "is preferred to `pkg_resources.declare_namespace`. " - "See https://setuptools.pypa.io/en/latest/references/" - "keywords.html#keyword-namespace-packages" - ) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path: MutableSequence[str] = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - declare_namespace(parent) - if parent not in _namespace_packages: - __import__(parent) - try: - path = sys.modules[parent].__path__ - except AttributeError as e: - raise TypeError("Not a package:", parent) from e - - # Track what packages are namespaces, so when new path items are added, - # they can be updated - _namespace_packages.setdefault(parent or None, []).append(packageName) - _namespace_packages.setdefault(packageName, []) - - for path_item in path: - # Ensure all the parent's path items are reflected in the child, - # if they apply - _handle_ns(packageName, path_item) - - finally: - _imp.release_lock() - - -def fixup_namespace_packages(path_item: str, parent: str | None = None): - """Ensure that previously-declared namespace packages include path_item""" - _imp.acquire_lock() - try: - for package in _namespace_packages.get(parent, ()): - subpath = _handle_ns(package, path_item) - if subpath: - fixup_namespace_packages(subpath, package) - finally: - _imp.release_lock() - - -def file_ns_handler( - importer: object, - path_item: StrPath, - packageName: str, - module: types.ModuleType, -): - """Compute an ns-package subpath for a filesystem or zipfile importer""" - - subpath = os.path.join(path_item, packageName.split('.')[-1]) - normalized = _normalize_cached(subpath) - for item in module.__path__: - if _normalize_cached(item) == normalized: - break - else: - # Only return the path if it's not already there - return subpath - - -if hasattr(pkgutil, 'ImpImporter'): - register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) - -register_namespace_handler(zipimport.zipimporter, file_ns_handler) -register_namespace_handler(importlib.machinery.FileFinder, file_ns_handler) - - -def null_ns_handler( - importer: object, - path_item: str | None, - packageName: str | None, - module: _ModuleLike | None, -): - return None - - -register_namespace_handler(object, null_ns_handler) - - -@overload -def normalize_path(filename: StrPath) -> str: ... -@overload -def normalize_path(filename: BytesPath) -> bytes: ... -def normalize_path(filename: StrOrBytesPath): - """Normalize a file/dir name for comparison purposes""" - return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename: StrOrBytesPath): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else filename - - -if TYPE_CHECKING: - # https://github.com/python/mypy/issues/16261 - # https://github.com/python/typeshed/issues/6347 - @overload - def _normalize_cached(filename: StrPath) -> str: ... - @overload - def _normalize_cached(filename: BytesPath) -> bytes: ... - def _normalize_cached(filename: StrOrBytesPath) -> str | bytes: ... -else: - - @functools.lru_cache(maxsize=None) - def _normalize_cached(filename): - return normalize_path(filename) - - -def _is_egg_path(path): - """ - Determine if given path appears to be an egg. - """ - return _is_zip_egg(path) or _is_unpacked_egg(path) - - -def _is_zip_egg(path): - return ( - path.lower().endswith('.egg') - and os.path.isfile(path) - and zipfile.is_zipfile(path) - ) - - -def _is_unpacked_egg(path): - """ - Determine if given path appears to be an unpacked egg. - """ - return path.lower().endswith('.egg') and os.path.isfile( - os.path.join(path, 'EGG-INFO', 'PKG-INFO') - ) - - -def _set_parent_ns(packageName): - parts = packageName.split('.') - name = parts.pop() - if parts: - parent = '.'.join(parts) - setattr(sys.modules[parent], name, sys.modules[packageName]) - - -MODULE = re.compile(r"\w+(\.\w+)*$").match -EGG_NAME = re.compile( - r""" - (?P[^-]+) ( - -(?P[^-]+) ( - -py(?P[^-]+) ( - -(?P.+) - )? - )? - )? - """, - re.VERBOSE | re.IGNORECASE, -).match - - -class EntryPoint: - """Object representing an advertised importable object""" - - def __init__( - self, - name: str, - module_name: str, - attrs: Iterable[str] = (), - extras: Iterable[str] = (), - dist: Distribution | None = None, - ): - if not MODULE(module_name): - raise ValueError("Invalid module name", module_name) - self.name = name - self.module_name = module_name - self.attrs = tuple(attrs) - self.extras = tuple(extras) - self.dist = dist - - def __str__(self): - s = "%s = %s" % (self.name, self.module_name) - if self.attrs: - s += ':' + '.'.join(self.attrs) - if self.extras: - s += ' [%s]' % ','.join(self.extras) - return s - - def __repr__(self): - return "EntryPoint.parse(%r)" % str(self) - - @overload - def load( - self, - require: Literal[True] = True, - env: Environment | None = None, - installer: _InstallerType | None = None, - ) -> _ResolvedEntryPoint: ... - @overload - def load( - self, - require: Literal[False], - *args: Any, - **kwargs: Any, - ) -> _ResolvedEntryPoint: ... - def load( - self, - require: bool = True, - *args: Environment | _InstallerType | None, - **kwargs: Environment | _InstallerType | None, - ) -> _ResolvedEntryPoint: - """ - Require packages for this EntryPoint, then resolve it. - """ - if not require or args or kwargs: - warnings.warn( - "Parameters to load are deprecated. Call .resolve and " - ".require separately.", - PkgResourcesDeprecationWarning, - stacklevel=2, - ) - if require: - # We could pass `env` and `installer` directly, - # but keeping `*args` and `**kwargs` for backwards compatibility - self.require(*args, **kwargs) # type: ignore - return self.resolve() - - def resolve(self) -> _ResolvedEntryPoint: - """ - Resolve the entry point from its module and attrs. - """ - module = __import__(self.module_name, fromlist=['__name__'], level=0) - try: - return functools.reduce(getattr, self.attrs, module) - except AttributeError as exc: - raise ImportError(str(exc)) from exc - - def require( - self, - env: Environment | None = None, - installer: _InstallerType | None = None, - ): - if not self.dist: - error_cls = UnknownExtra if self.extras else AttributeError - raise error_cls("Can't require() without a distribution", self) - - # Get the requirements for this entry point with all its extras and - # then resolve them. We have to pass `extras` along when resolving so - # that the working set knows what extras we want. Otherwise, for - # dist-info distributions, the working set will assume that the - # requirements for that extra are purely optional and skip over them. - reqs = self.dist.requires(self.extras) - items = working_set.resolve(reqs, env, installer, extras=self.extras) - list(map(working_set.add, items)) - - pattern = re.compile( - r'\s*' - r'(?P.+?)\s*' - r'=\s*' - r'(?P[\w.]+)\s*' - r'(:\s*(?P[\w.]+))?\s*' - r'(?P\[.*\])?\s*$' - ) - - @classmethod - def parse(cls, src: str, dist: Distribution | None = None): - """Parse a single entry point from string `src` - - Entry point syntax follows the form:: - - name = some.module:some.attr [extra1, extra2] - - The entry name and module name are required, but the ``:attrs`` and - ``[extras]`` parts are optional - """ - m = cls.pattern.match(src) - if not m: - msg = "EntryPoint must be in 'name=module:attrs [extras]' format" - raise ValueError(msg, src) - res = m.groupdict() - extras = cls._parse_extras(res['extras']) - attrs = res['attr'].split('.') if res['attr'] else () - return cls(res['name'], res['module'], attrs, extras, dist) - - @classmethod - def _parse_extras(cls, extras_spec): - if not extras_spec: - return () - req = Requirement.parse('x' + extras_spec) - if req.specs: - raise ValueError - return req.extras - - @classmethod - def parse_group( - cls, - group: str, - lines: _NestedStr, - dist: Distribution | None = None, - ): - """Parse an entry point group""" - if not MODULE(group): - raise ValueError("Invalid group name", group) - this: dict[str, Self] = {} - for line in yield_lines(lines): - ep = cls.parse(line, dist) - if ep.name in this: - raise ValueError("Duplicate entry point", group, ep.name) - this[ep.name] = ep - return this - - @classmethod - def parse_map( - cls, - data: str | Iterable[str] | dict[str, str | Iterable[str]], - dist: Distribution | None = None, - ): - """Parse a map of entry point groups""" - _data: Iterable[tuple[str | None, str | Iterable[str]]] - if isinstance(data, dict): - _data = data.items() - else: - _data = split_sections(data) - maps: dict[str, dict[str, Self]] = {} - for group, lines in _data: - if group is None: - if not lines: - continue - raise ValueError("Entry points must be listed in groups") - group = group.strip() - if group in maps: - raise ValueError("Duplicate group name", group) - maps[group] = cls.parse_group(group, lines, dist) - return maps - - -def _version_from_file(lines): - """ - Given an iterable of lines from a Metadata file, return - the value of the Version field, if present, or None otherwise. - """ - - def is_version_line(line): - return line.lower().startswith('version:') - - version_lines = filter(is_version_line, lines) - line = next(iter(version_lines), '') - _, _, value = line.partition(':') - return safe_version(value.strip()) or None - - -class Distribution: - """Wrap an actual or potential sys.path entry w/metadata""" - - PKG_INFO = 'PKG-INFO' - - def __init__( - self, - location: str | None = None, - metadata: _MetadataType = None, - project_name: str | None = None, - version: str | None = None, - py_version: str | None = PY_MAJOR, - platform: str | None = None, - precedence: int = EGG_DIST, - ): - self.project_name = safe_name(project_name or 'Unknown') - if version is not None: - self._version = safe_version(version) - self.py_version = py_version - self.platform = platform - self.location = location - self.precedence = precedence - self._provider = metadata or empty_provider - - @classmethod - def from_location( - cls, - location: str, - basename: StrPath, - metadata: _MetadataType = None, - **kw: int, # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility - ) -> Distribution: - project_name, version, py_version, platform = [None] * 4 - basename, ext = os.path.splitext(basename) - if ext.lower() in _distributionImpl: - cls = _distributionImpl[ext.lower()] - - match = EGG_NAME(basename) - if match: - project_name, version, py_version, platform = match.group( - 'name', 'ver', 'pyver', 'plat' - ) - return cls( - location, - metadata, - project_name=project_name, - version=version, - py_version=py_version, - platform=platform, - **kw, - )._reload_version() - - def _reload_version(self): - return self - - @property - def hashcmp(self): - return ( - self._forgiving_parsed_version, - self.precedence, - self.key, - self.location, - self.py_version or '', - self.platform or '', - ) - - def __hash__(self): - return hash(self.hashcmp) - - def __lt__(self, other: Distribution): - return self.hashcmp < other.hashcmp - - def __le__(self, other: Distribution): - return self.hashcmp <= other.hashcmp - - def __gt__(self, other: Distribution): - return self.hashcmp > other.hashcmp - - def __ge__(self, other: Distribution): - return self.hashcmp >= other.hashcmp - - def __eq__(self, other: object): - if not isinstance(other, self.__class__): - # It's not a Distribution, so they are not equal - return False - return self.hashcmp == other.hashcmp - - def __ne__(self, other: object): - return not self == other - - # These properties have to be lazy so that we don't have to load any - # metadata until/unless it's actually needed. (i.e., some distributions - # may not know their name or version without loading PKG-INFO) - - @property - def key(self): - try: - return self._key - except AttributeError: - self._key = key = self.project_name.lower() - return key - - @property - def parsed_version(self): - if not hasattr(self, "_parsed_version"): - try: - self._parsed_version = parse_version(self.version) - except _packaging_version.InvalidVersion as ex: - info = f"(package: {self.project_name})" - if hasattr(ex, "add_note"): - ex.add_note(info) # PEP 678 - raise - raise _packaging_version.InvalidVersion(f"{str(ex)} {info}") from None - - return self._parsed_version - - @property - def _forgiving_parsed_version(self): - try: - return self.parsed_version - except _packaging_version.InvalidVersion as ex: - self._parsed_version = parse_version(_forgiving_version(self.version)) - - notes = "\n".join(getattr(ex, "__notes__", [])) # PEP 678 - msg = f"""!!\n\n - ************************************************************************* - {str(ex)}\n{notes} - - This is a long overdue deprecation. - For the time being, `pkg_resources` will use `{self._parsed_version}` - as a replacement to avoid breaking existing environments, - but no future compatibility is guaranteed. - - If you maintain package {self.project_name} you should implement - the relevant changes to adequate the project to PEP 440 immediately. - ************************************************************************* - \n\n!! - """ - warnings.warn(msg, DeprecationWarning) - - return self._parsed_version - - @property - def version(self): - try: - return self._version - except AttributeError as e: - version = self._get_version() - if version is None: - path = self._get_metadata_path_for_display(self.PKG_INFO) - msg = ("Missing 'Version:' header and/or {} file at path: {}").format( - self.PKG_INFO, path - ) - raise ValueError(msg, self) from e - - return version - - @property - def _dep_map(self): - """ - A map of extra to its list of (direct) requirements - for this distribution, including the null extra. - """ - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._filter_extras(self._build_dep_map()) - return self.__dep_map - - @staticmethod - def _filter_extras(dm: dict[str | None, list[Requirement]]): - """ - Given a mapping of extras to dependencies, strip off - environment markers and filter out any dependencies - not matching the markers. - """ - for extra in list(filter(None, dm)): - new_extra: str | None = extra - reqs = dm.pop(extra) - new_extra, _, marker = extra.partition(':') - fails_marker = marker and ( - invalid_marker(marker) or not evaluate_marker(marker) - ) - if fails_marker: - reqs = [] - new_extra = safe_extra(new_extra) or None - - dm.setdefault(new_extra, []).extend(reqs) - return dm - - def _build_dep_map(self): - dm = {} - for name in 'requires.txt', 'depends.txt': - for extra, reqs in split_sections(self._get_metadata(name)): - dm.setdefault(extra, []).extend(parse_requirements(reqs)) - return dm - - def requires(self, extras: Iterable[str] = ()): - """List of Requirements needed for this distro if `extras` are used""" - dm = self._dep_map - deps: list[Requirement] = [] - deps.extend(dm.get(None, ())) - for ext in extras: - try: - deps.extend(dm[safe_extra(ext)]) - except KeyError as e: - raise UnknownExtra( - "%s has no such extra feature %r" % (self, ext) - ) from e - return deps - - def _get_metadata_path_for_display(self, name): - """ - Return the path to the given metadata file, if available. - """ - try: - # We need to access _get_metadata_path() on the provider object - # directly rather than through this class's __getattr__() - # since _get_metadata_path() is marked private. - path = self._provider._get_metadata_path(name) - - # Handle exceptions e.g. in case the distribution's metadata - # provider doesn't support _get_metadata_path(). - except Exception: - return '[could not detect]' - - return path - - def _get_metadata(self, name): - if self.has_metadata(name): - yield from self.get_metadata_lines(name) - - def _get_version(self): - lines = self._get_metadata(self.PKG_INFO) - return _version_from_file(lines) - - def activate(self, path: list[str] | None = None, replace: bool = False): - """Ensure distribution is importable on `path` (default=sys.path)""" - if path is None: - path = sys.path - self.insert_on(path, replace=replace) - if path is sys.path and self.location is not None: - fixup_namespace_packages(self.location) - for pkg in self._get_metadata('namespace_packages.txt'): - if pkg in sys.modules: - declare_namespace(pkg) - - def egg_name(self): - """Return what this distribution's standard .egg filename should be""" - filename = "%s-%s-py%s" % ( - to_filename(self.project_name), - to_filename(self.version), - self.py_version or PY_MAJOR, - ) - - if self.platform: - filename += '-' + self.platform - return filename - - def __repr__(self): - if self.location: - return "%s (%s)" % (self, self.location) - else: - return str(self) - - def __str__(self): - try: - version = getattr(self, 'version', None) - except ValueError: - version = None - version = version or "[unknown version]" - return "%s %s" % (self.project_name, version) - - def __getattr__(self, attr): - """Delegate all unrecognized public attributes to .metadata provider""" - if attr.startswith('_'): - raise AttributeError(attr) - return getattr(self._provider, attr) - - def __dir__(self): - return list( - set(super().__dir__()) - | set(attr for attr in self._provider.__dir__() if not attr.startswith('_')) - ) - - @classmethod - def from_filename( - cls, - filename: StrPath, - metadata: _MetadataType = None, - **kw: int, # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility - ): - return cls.from_location( - _normalize_cached(filename), os.path.basename(filename), metadata, **kw - ) - - def as_requirement(self): - """Return a ``Requirement`` that matches this distribution exactly""" - if isinstance(self.parsed_version, _packaging_version.Version): - spec = "%s==%s" % (self.project_name, self.parsed_version) - else: - spec = "%s===%s" % (self.project_name, self.parsed_version) - - return Requirement.parse(spec) - - def load_entry_point(self, group: str, name: str) -> _ResolvedEntryPoint: - """Return the `name` entry point of `group` or raise ImportError""" - ep = self.get_entry_info(group, name) - if ep is None: - raise ImportError("Entry point %r not found" % ((group, name),)) - return ep.load() - - @overload - def get_entry_map(self, group: None = None) -> dict[str, dict[str, EntryPoint]]: ... - @overload - def get_entry_map(self, group: str) -> dict[str, EntryPoint]: ... - def get_entry_map(self, group: str | None = None): - """Return the entry point map for `group`, or the full entry map""" - if not hasattr(self, "_ep_map"): - self._ep_map = EntryPoint.parse_map( - self._get_metadata('entry_points.txt'), self - ) - if group is not None: - return self._ep_map.get(group, {}) - return self._ep_map - - def get_entry_info(self, group: str, name: str): - """Return the EntryPoint object for `group`+`name`, or ``None``""" - return self.get_entry_map(group).get(name) - - # FIXME: 'Distribution.insert_on' is too complex (13) - def insert_on( # noqa: C901 - self, - path: list[str], - loc=None, - replace: bool = False, - ): - """Ensure self.location is on path - - If replace=False (default): - - If location is already in path anywhere, do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent. - - Else: add to the end of path. - If replace=True: - - If location is already on path anywhere (not eggs) - or higher priority than its parent (eggs) - do nothing. - - Else: - - If it's an egg and its parent directory is on path, - insert just ahead of the parent, - removing any lower-priority entries. - - Else: add it to the front of path. - """ - - loc = loc or self.location - if not loc: - return - - nloc = _normalize_cached(loc) - bdir = os.path.dirname(nloc) - npath = [(p and _normalize_cached(p) or p) for p in path] - - for p, item in enumerate(npath): - if item == nloc: - if replace: - break - else: - # don't modify path (even removing duplicates) if - # found and not replace - return - elif item == bdir and self.precedence == EGG_DIST: - # if it's an .egg, give it precedence over its directory - # UNLESS it's already been added to sys.path and replace=False - if (not replace) and nloc in npath[p:]: - return - if path is sys.path: - self.check_version_conflict() - path.insert(p, loc) - npath.insert(p, nloc) - break - else: - if path is sys.path: - self.check_version_conflict() - if replace: - path.insert(0, loc) - else: - path.append(loc) - return - - # p is the spot where we found or inserted loc; now remove duplicates - while True: - try: - np = npath.index(nloc, p + 1) - except ValueError: - break - else: - del npath[np], path[np] - # ha! - p = np - - return - - def check_version_conflict(self): - if self.key == 'setuptools': - # ignore the inevitable setuptools self-conflicts :( - return - - nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) - loc = normalize_path(self.location) - for modname in self._get_metadata('top_level.txt'): - if ( - modname not in sys.modules - or modname in nsp - or modname in _namespace_packages - ): - continue - if modname in ('pkg_resources', 'setuptools', 'site'): - continue - fn = getattr(sys.modules[modname], '__file__', None) - if fn and ( - normalize_path(fn).startswith(loc) or fn.startswith(self.location) - ): - continue - issue_warning( - "Module %s was already imported from %s, but %s is being added" - " to sys.path" % (modname, fn, self.location), - ) - - def has_version(self): - try: - self.version - except ValueError: - issue_warning("Unbuilt egg for " + repr(self)) - return False - except SystemError: - # TODO: remove this except clause when python/cpython#103632 is fixed. - return False - return True - - def clone(self, **kw: str | int | IResourceProvider | None): - """Copy this distribution, substituting in any changed keyword args""" - names = 'project_name version py_version platform location precedence' - for attr in names.split(): - kw.setdefault(attr, getattr(self, attr, None)) - kw.setdefault('metadata', self._provider) - # Unsafely unpacking. But keeping **kw for backwards and subclassing compatibility - return self.__class__(**kw) # type:ignore[arg-type] - - @property - def extras(self): - return [dep for dep in self._dep_map if dep] - - -class EggInfoDistribution(Distribution): - def _reload_version(self): - """ - Packages installed by distutils (e.g. numpy or scipy), - which uses an old safe_version, and so - their version numbers can get mangled when - converted to filenames (e.g., 1.11.0.dev0+2329eae to - 1.11.0.dev0_2329eae). These distributions will not be - parsed properly - downstream by Distribution and safe_version, so - take an extra step and try to get the version number from - the metadata file itself instead of the filename. - """ - md_version = self._get_version() - if md_version: - self._version = md_version - return self - - -class DistInfoDistribution(Distribution): - """ - Wrap an actual or potential sys.path entry - w/metadata, .dist-info style. - """ - - PKG_INFO = 'METADATA' - EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") - - @property - def _parsed_pkg_info(self): - """Parse and cache metadata""" - try: - return self._pkg_info - except AttributeError: - metadata = self.get_metadata(self.PKG_INFO) - self._pkg_info = email.parser.Parser().parsestr(metadata) - return self._pkg_info - - @property - def _dep_map(self): - try: - return self.__dep_map - except AttributeError: - self.__dep_map = self._compute_dependencies() - return self.__dep_map - - def _compute_dependencies(self) -> dict[str | None, list[Requirement]]: - """Recompute this distribution's dependencies.""" - self.__dep_map: dict[str | None, list[Requirement]] = {None: []} - - reqs: list[Requirement] = [] - # Including any condition expressions - for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: - reqs.extend(parse_requirements(req)) - - def reqs_for_extra(extra): - for req in reqs: - if not req.marker or req.marker.evaluate({'extra': extra}): - yield req - - common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None))) - self.__dep_map[None].extend(common) - - for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: - s_extra = safe_extra(extra.strip()) - self.__dep_map[s_extra] = [ - r for r in reqs_for_extra(extra) if r not in common - ] - - return self.__dep_map - - -_distributionImpl = { - '.egg': Distribution, - '.egg-info': EggInfoDistribution, - '.dist-info': DistInfoDistribution, -} - - -def issue_warning(*args, **kw): - level = 1 - g = globals() - try: - # find the first stack frame that is *not* code in - # the pkg_resources module, to use for the warning - while sys._getframe(level).f_globals is g: - level += 1 - except ValueError: - pass - warnings.warn(stacklevel=level + 1, *args, **kw) - - -def parse_requirements(strs: _NestedStr): - """ - Yield ``Requirement`` objects for each specification in `strs`. - - `strs` must be a string, or a (possibly-nested) iterable thereof. - """ - return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs)))) - - -class RequirementParseError(_packaging_requirements.InvalidRequirement): - "Compatibility wrapper for InvalidRequirement" - - -class Requirement(_packaging_requirements.Requirement): - def __init__(self, requirement_string: str): - """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" - super().__init__(requirement_string) - self.unsafe_name = self.name - project_name = safe_name(self.name) - self.project_name, self.key = project_name, project_name.lower() - self.specs = [(spec.operator, spec.version) for spec in self.specifier] - # packaging.requirements.Requirement uses a set for its extras. We use a variable-length tuple - self.extras: tuple[str] = tuple(map(safe_extra, self.extras)) - self.hashCmp = ( - self.key, - self.url, - self.specifier, - frozenset(self.extras), - str(self.marker) if self.marker else None, - ) - self.__hash = hash(self.hashCmp) - - def __eq__(self, other: object): - return isinstance(other, Requirement) and self.hashCmp == other.hashCmp - - def __ne__(self, other): - return not self == other - - def __contains__(self, item: Distribution | str | tuple[str, ...]) -> bool: - if isinstance(item, Distribution): - if item.key != self.key: - return False - - item = item.version - - # Allow prereleases always in order to match the previous behavior of - # this method. In the future this should be smarter and follow PEP 440 - # more accurately. - return self.specifier.contains(item, prereleases=True) - - def __hash__(self): - return self.__hash - - def __repr__(self): - return "Requirement.parse(%r)" % str(self) - - @staticmethod - def parse(s: str | Iterable[str]): - (req,) = parse_requirements(s) - return req - - -def _always_object(classes): - """ - Ensure object appears in the mro even - for old-style classes. - """ - if object not in classes: - return classes + (object,) - return classes - - -def _find_adapter(registry: Mapping[type, _AdapterT], ob: object) -> _AdapterT: - """Return an adapter factory for `ob` from `registry`""" - types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) - for t in types: - if t in registry: - return registry[t] - # _find_adapter would previously return None, and immediately be called. - # So we're raising a TypeError to keep backward compatibility if anyone depended on that behaviour. - raise TypeError(f"Could not find adapter for {registry} and {ob}") - - -def ensure_directory(path: StrOrBytesPath): - """Ensure that the parent directory of `path` exists""" - dirname = os.path.dirname(path) - os.makedirs(dirname, exist_ok=True) - - -def _bypass_ensure_directory(path): - """Sandbox-bypassing version of ensure_directory()""" - if not WRITE_SUPPORT: - raise OSError('"os.mkdir" not supported on this platform.') - dirname, filename = split(path) - if dirname and filename and not isdir(dirname): - _bypass_ensure_directory(dirname) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -def split_sections(s: _NestedStr) -> Iterator[tuple[str | None, list[str]]]: - """Split a string or iterable thereof into (section, content) pairs - - Each ``section`` is a stripped version of the section header ("[section]") - and each ``content`` is a list of stripped lines excluding blank lines and - comment-only lines. If there are any such lines before the first section - header, they're returned in a first ``section`` of ``None``. - """ - section = None - content = [] - for line in yield_lines(s): - if line.startswith("["): - if line.endswith("]"): - if section or content: - yield section, content - section = line[1:-1].strip() - content = [] - else: - raise ValueError("Invalid section heading", line) - else: - content.append(line) - - # wrap up last segment - yield section, content - - -def _mkstemp(*args, **kw): - old_open = os.open - try: - # temporarily bypass sandboxing - os.open = os_open - return tempfile.mkstemp(*args, **kw) - finally: - # and then put it back - os.open = old_open - - -# Silence the PEP440Warning by default, so that end users don't get hit by it -# randomly just because they use pkg_resources. We want to append the rule -# because we want earlier uses of filterwarnings to take precedence over this -# one. -warnings.filterwarnings("ignore", category=PEP440Warning, append=True) - - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ - - -# Ported from ``setuptools`` to avoid introducing an import inter-dependency: -_LOCALE_ENCODING = "locale" if sys.version_info >= (3, 10) else None - - -def _read_utf8_with_fallback(file: str, fallback_encoding=_LOCALE_ENCODING) -> str: - """See setuptools.unicode_utils._read_utf8_with_fallback""" - try: - with open(file, "r", encoding="utf-8") as f: - return f.read() - except UnicodeDecodeError: # pragma: no cover - msg = f"""\ - ******************************************************************************** - `encoding="utf-8"` fails with {file!r}, trying `encoding={fallback_encoding!r}`. - - This fallback behaviour is considered **deprecated** and future versions of - `setuptools/pkg_resources` may not implement it. - - Please encode {file!r} with "utf-8" to ensure future builds will succeed. - - If this file was produced by `setuptools` itself, cleaning up the cached files - and re-building/re-installing the package with a newer version of `setuptools` - (e.g. by updating `build-system.requires` in its `pyproject.toml`) - might solve the problem. - ******************************************************************************** - """ - # TODO: Add a deadline? - # See comment in setuptools.unicode_utils._Utf8EncodingNeeded - warnings.warn(msg, PkgResourcesDeprecationWarning, stacklevel=2) - with open(file, "r", encoding=fallback_encoding) as f: - return f.read() - - -# from jaraco.functools 1.3 -def _call_aside(f, *args, **kwargs): - f(*args, **kwargs) - return f - - -@_call_aside -def _initialize(g=globals()): - "Set up global resource manager (deliberately not state-saved)" - manager = ResourceManager() - g['_manager'] = manager - g.update( - (name, getattr(manager, name)) - for name in dir(manager) - if not name.startswith('_') - ) - - -@_call_aside -def _initialize_master_working_set(): - """ - Prepare the master working set and make the ``require()`` - API available. - - This function has explicit effects on the global state - of pkg_resources. It is intended to be invoked once at - the initialization of this module. - - Invocation by other packages is unsupported and done - at their own risk. - """ - working_set = _declare_state('object', 'working_set', WorkingSet._build_master()) - - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - # backward compatibility - run_main = run_script - # Activate all distributions already on sys.path with replace=False and - # ensure that all distributions added to the working set in the future - # (e.g. by calling ``require()``) will get activated as well, - # with higher priority (replace=True). - tuple(dist.activate(replace=False) for dist in working_set) - add_activation_listener( - lambda dist: dist.activate(replace=True), - existing=False, - ) - working_set.entries = [] - # match order - list(map(working_set.add_entry, sys.path)) - globals().update(locals()) - - -if TYPE_CHECKING: - # All of these are set by the @_call_aside methods above - __resource_manager = ResourceManager() # Won't exist at runtime - resource_exists = __resource_manager.resource_exists - resource_isdir = __resource_manager.resource_isdir - resource_filename = __resource_manager.resource_filename - resource_stream = __resource_manager.resource_stream - resource_string = __resource_manager.resource_string - resource_listdir = __resource_manager.resource_listdir - set_extraction_path = __resource_manager.set_extraction_path - cleanup_resources = __resource_manager.cleanup_resources - - working_set = WorkingSet() - require = working_set.require - iter_entry_points = working_set.iter_entry_points - add_activation_listener = working_set.subscribe - run_script = working_set.run_script - run_main = run_script diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index b32dcb685c89935fa5a09a6a299fd44bebcaa7fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176828 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%0DhXFePEz_X(se{^wK~00;_7M7L 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/LICENSE deleted file mode 100755 index f35fed9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2010-202x The platformdirs developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py deleted file mode 100755 index 92fc2da..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__init__.py +++ /dev/null @@ -1,917 +0,0 @@ -"""Utilities for determining application-specific dirs. - -Provides convenience functions (e.g. :func:`user_data_dir`, :func:`user_config_path`), a :data:`PlatformDirs` class that -auto-detects the current platform, and the :class:`~platformdirs.api.PlatformDirsABC` base class. - -See for details and usage. - -""" - -from __future__ import annotations - -import os -import sys -from typing import TYPE_CHECKING - -from .api import PlatformDirsABC -from .version import __version__ -from .version import __version_tuple__ as __version_info__ - -if TYPE_CHECKING: - from pathlib import Path - from typing import Literal - -if sys.platform == "win32": - from pip._vendor.platformdirs.windows import Windows as _Result -elif sys.platform == "darwin": - from pip._vendor.platformdirs.macos import MacOS as _Result -else: - from pip._vendor.platformdirs.unix import Unix as _Result - - -def _set_platform_dir_class() -> type[PlatformDirsABC]: - if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system": - if os.getenv("SHELL") or os.getenv("PREFIX"): - return _Result - - from pip._vendor.platformdirs.android import _android_folder # noqa: PLC0415 - - if _android_folder() is not None: - from pip._vendor.platformdirs.android import Android # noqa: PLC0415 - - return Android # return to avoid redefinition of a result - - return _Result - - -if TYPE_CHECKING: - # Work around mypy issue: https://github.com/python/mypy/issues/10962 - PlatformDirs = _Result -else: - PlatformDirs = _set_platform_dir_class() #: Currently active platform -AppDirs = PlatformDirs #: Backwards compatibility with appdirs - - -def user_data_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: data directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_data_dir - - -def site_data_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: data directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_data_dir - - -def user_config_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: config directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_config_dir - - -def site_config_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: config directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_config_dir - - -def user_cache_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: cache directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_cache_dir - - -def site_cache_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: cache directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_cache_dir - - -def user_state_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: state directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_state_dir - - -def site_state_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param ensure_exists: See `ensure_exists `. - - :returns: state directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - ensure_exists=ensure_exists, - ).site_state_dir - - -def user_log_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: log directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_log_dir - - -def site_log_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: log directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_log_dir - - -def user_documents_dir() -> str: - """:returns: documents directory tied to the user""" - return PlatformDirs().user_documents_dir - - -def user_downloads_dir() -> str: - """:returns: downloads directory tied to the user""" - return PlatformDirs().user_downloads_dir - - -def user_pictures_dir() -> str: - """:returns: pictures directory tied to the user""" - return PlatformDirs().user_pictures_dir - - -def user_videos_dir() -> str: - """:returns: videos directory tied to the user""" - return PlatformDirs().user_videos_dir - - -def user_music_dir() -> str: - """:returns: music directory tied to the user""" - return PlatformDirs().user_music_dir - - -def user_desktop_dir() -> str: - """:returns: desktop directory tied to the user""" - return PlatformDirs().user_desktop_dir - - -def user_projects_dir() -> str: - """:returns: projects directory tied to the user""" - return PlatformDirs().user_projects_dir - - -def user_publicshare_dir() -> str: - """:returns: public share directory tied to the user""" - return PlatformDirs().user_publicshare_dir - - -def user_templates_dir() -> str: - """:returns: templates directory tied to the user""" - return PlatformDirs().user_templates_dir - - -def user_fonts_dir() -> str: - """:returns: fonts directory tied to the user""" - return PlatformDirs().user_fonts_dir - - -def user_preference_dir() -> str: - """:returns: preference directory tied to the user""" - return PlatformDirs().user_preference_dir - - -def user_bin_dir() -> str: - """:returns: bin directory tied to the user""" - return PlatformDirs().user_bin_dir - - -def site_bin_dir() -> str: - """:returns: bin directory shared by users""" - return PlatformDirs().site_bin_dir - - -def user_applications_dir() -> str: - """:returns: applications directory tied to the user""" - return PlatformDirs().user_applications_dir - - -def site_applications_dir( - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: applications directory shared by users - - """ - return PlatformDirs( - multipath=multipath, - ensure_exists=ensure_exists, - ).site_applications_dir - - -def user_runtime_dir( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: runtime directory tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_runtime_dir - - -def site_runtime_dir( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> str: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: runtime directory shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_runtime_dir - - -def user_data_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: data path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_data_path - - -def site_data_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: data path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_data_path - - -def user_config_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: config path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_config_path - - -def site_config_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: config path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - multipath=multipath, - ensure_exists=ensure_exists, - ).site_config_path - - -def site_cache_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: cache path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_cache_path - - -def user_cache_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: cache path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_cache_path - - -def user_state_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param roaming: See `roaming `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: state path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - roaming=roaming, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_state_path - - -def site_state_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param ensure_exists: See `ensure_exists `. - - :returns: state path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - ensure_exists=ensure_exists, - ).site_state_path - - -def user_log_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: log path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_log_path - - -def site_log_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: log path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_log_path - - -def user_documents_path() -> Path: - """:returns: documents path tied to the user""" - return PlatformDirs().user_documents_path - - -def user_downloads_path() -> Path: - """:returns: downloads path tied to the user""" - return PlatformDirs().user_downloads_path - - -def user_pictures_path() -> Path: - """:returns: pictures path tied to the user""" - return PlatformDirs().user_pictures_path - - -def user_videos_path() -> Path: - """:returns: videos path tied to the user""" - return PlatformDirs().user_videos_path - - -def user_music_path() -> Path: - """:returns: music path tied to the user""" - return PlatformDirs().user_music_path - - -def user_desktop_path() -> Path: - """:returns: desktop path tied to the user""" - return PlatformDirs().user_desktop_path - - -def user_projects_path() -> Path: - """:returns: projects path tied to the user""" - return PlatformDirs().user_projects_path - - -def user_publicshare_path() -> Path: - """:returns: public share path tied to the user""" - return PlatformDirs().user_publicshare_path - - -def user_templates_path() -> Path: - """:returns: templates path tied to the user""" - return PlatformDirs().user_templates_path - - -def user_fonts_path() -> Path: - """:returns: fonts path tied to the user""" - return PlatformDirs().user_fonts_path - - -def user_preference_path() -> Path: - """:returns: preference path tied to the user""" - return PlatformDirs().user_preference_path - - -def user_bin_path() -> Path: - """:returns: bin path tied to the user""" - return PlatformDirs().user_bin_path - - -def site_bin_path() -> Path: - """:returns: bin path shared by users""" - return PlatformDirs().site_bin_path - - -def user_applications_path() -> Path: - """:returns: applications path tied to the user""" - return PlatformDirs().user_applications_path - - -def site_applications_path( - multipath: bool = False, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param multipath: See `multipath `. - :param ensure_exists: See `ensure_exists `. - - :returns: applications path shared by users - - """ - return PlatformDirs( - multipath=multipath, - ensure_exists=ensure_exists, - ).site_applications_path - - -def user_runtime_path( # noqa: PLR0913, PLR0917 - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - :param use_site_for_root: See `use_site_for_root `. - - :returns: runtime path tied to the user - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - use_site_for_root=use_site_for_root, - ).user_runtime_path - - -def site_runtime_path( - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 -) -> Path: - """:param appname: See `appname `. - :param appauthor: See `appauthor `. - :param version: See `version `. - :param opinion: See `opinion `. - :param ensure_exists: See `ensure_exists `. - - :returns: runtime path shared by users - - """ - return PlatformDirs( - appname=appname, - appauthor=appauthor, - version=version, - opinion=opinion, - ensure_exists=ensure_exists, - ).site_runtime_path - - -__all__ = [ - "AppDirs", - "PlatformDirs", - "PlatformDirsABC", - "__version__", - "__version_info__", - "site_applications_dir", - "site_applications_path", - "site_bin_dir", - "site_bin_path", - "site_cache_dir", - "site_cache_path", - "site_config_dir", - "site_config_path", - "site_data_dir", - "site_data_path", - "site_log_dir", - "site_log_path", - "site_runtime_dir", - "site_runtime_path", - "site_state_dir", - "site_state_path", - "user_applications_dir", - "user_applications_path", - "user_bin_dir", - "user_bin_path", - "user_cache_dir", - "user_cache_path", - "user_config_dir", - "user_config_path", - "user_data_dir", - "user_data_path", - "user_desktop_dir", - "user_desktop_path", - "user_documents_dir", - "user_documents_path", - "user_downloads_dir", - "user_downloads_path", - "user_fonts_dir", - "user_fonts_path", - "user_log_dir", - "user_log_path", - "user_music_dir", - "user_music_path", - "user_pictures_dir", - "user_pictures_path", - "user_preference_dir", - "user_preference_path", - "user_projects_dir", - "user_projects_path", - "user_publicshare_dir", - "user_publicshare_path", - "user_runtime_dir", - "user_runtime_path", - "user_state_dir", - "user_state_path", - "user_templates_dir", - "user_templates_path", - "user_videos_dir", - "user_videos_path", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py deleted file mode 100755 index 0d1877b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__main__.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Main entry point.""" - -from __future__ import annotations - -from pip._vendor.platformdirs import PlatformDirs, __version__ - -PROPS = ( - "user_data_dir", - "user_config_dir", - "user_cache_dir", - "user_state_dir", - "user_log_dir", - "user_documents_dir", - "user_downloads_dir", - "user_pictures_dir", - "user_videos_dir", - "user_music_dir", - "user_projects_dir", - "user_publicshare_dir", - "user_templates_dir", - "user_fonts_dir", - "user_preference_dir", - "user_bin_dir", - "site_bin_dir", - "user_applications_dir", - "user_runtime_dir", - "site_data_dir", - "site_config_dir", - "site_cache_dir", - "site_state_dir", - "site_log_dir", - "site_applications_dir", - "site_runtime_dir", -) - - -def main() -> None: - """Run the main entry point.""" - app_name = "MyApp" - app_author = "MyCompany" - - print(f"-- platformdirs {__version__} --") # noqa: T201 - - print("-- app dirs (with optional 'version')") # noqa: T201 - dirs = PlatformDirs(app_name, app_author, version="1.0") - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (without optional 'version')") # noqa: T201 - dirs = PlatformDirs(app_name, app_author) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (without optional 'appauthor')") # noqa: T201 - dirs = PlatformDirs(app_name) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - print("\n-- app dirs (with disabled 'appauthor')") # noqa: T201 - dirs = PlatformDirs(app_name, appauthor=False) - for prop in PROPS: - print(f"{prop}: {getattr(dirs, prop)}") # noqa: T201 - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index a4674621d4f0e90e90a428a56a87701b874f3a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29106 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc deleted file mode 100755 index 9d3708316f9bd9ac7982e0cdae0929b46029d415..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15392 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 CII6b* diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc deleted file mode 100755 index fc454190d8a25e812b554ee6099eb7001f96b85d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22722 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc deleted file mode 100755 index 9fe67f3009646c3c8b4b36857409df64694ad232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21743 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc deleted file mode 100755 index 216646e3c1149822337b3fb43cace6fc604d38e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23301 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/_xdg.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/_xdg.py deleted file mode 100755 index b2af284..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/_xdg.py +++ /dev/null @@ -1,171 +0,0 @@ -"""XDG environment variable mixin for Unix and macOS.""" - -from __future__ import annotations - -import os - -from .api import PlatformDirsABC - - -class XDGMixin(PlatformDirsABC): - """Mixin that checks XDG environment variables, falling back to platform-specific defaults via ``super()``.""" - - @property - def user_data_dir(self) -> str: - """:returns: data directory tied to the user, from ``$XDG_DATA_HOME`` if set, else platform default""" - if path := os.environ.get("XDG_DATA_HOME", "").strip(): - return self._append_app_name_and_version(path) - return super().user_data_dir - - @property - def _site_data_dirs(self) -> list[str]: - if xdg_dirs := os.environ.get("XDG_DATA_DIRS", "").strip(): - return [self._append_app_name_and_version(p) for p in xdg_dirs.split(os.pathsep) if p.strip()] - return super()._site_data_dirs - - @property - def site_data_dir(self) -> str: - """:returns: data directories shared by users, from ``$XDG_DATA_DIRS`` if set, else platform default""" - dirs = self._site_data_dirs - return os.pathsep.join(dirs) if self.multipath else dirs[0] - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, from ``$XDG_CONFIG_HOME`` if set, else platform default""" - if path := os.environ.get("XDG_CONFIG_HOME", "").strip(): - return self._append_app_name_and_version(path) - return super().user_config_dir - - @property - def _site_config_dirs(self) -> list[str]: - if xdg_dirs := os.environ.get("XDG_CONFIG_DIRS", "").strip(): - return [self._append_app_name_and_version(p) for p in xdg_dirs.split(os.pathsep) if p.strip()] - return super()._site_config_dirs - - @property - def site_config_dir(self) -> str: - """:returns: config directories shared by users, from ``$XDG_CONFIG_DIRS`` if set, else platform default""" - dirs = self._site_config_dirs - return os.pathsep.join(dirs) if self.multipath else dirs[0] - - @property - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user, from ``$XDG_CACHE_HOME`` if set, else platform default""" - if path := os.environ.get("XDG_CACHE_HOME", "").strip(): - return self._append_app_name_and_version(path) - return super().user_cache_dir - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, from ``$XDG_STATE_HOME`` if set, else platform default""" - if path := os.environ.get("XDG_STATE_HOME", "").strip(): - return self._append_app_name_and_version(path) - return super().user_state_dir - - @property - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user, from ``$XDG_RUNTIME_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_RUNTIME_DIR", "").strip(): - return self._append_app_name_and_version(path) - return super().user_runtime_dir - - @property - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users, from ``$XDG_RUNTIME_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_RUNTIME_DIR", "").strip(): - return self._append_app_name_and_version(path) - return super().site_runtime_dir - - @property - def user_documents_dir(self) -> str: - """:returns: documents directory tied to the user, from ``$XDG_DOCUMENTS_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_DOCUMENTS_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_documents_dir - - @property - def user_downloads_dir(self) -> str: - """:returns: downloads directory tied to the user, from ``$XDG_DOWNLOAD_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_DOWNLOAD_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_downloads_dir - - @property - def user_pictures_dir(self) -> str: - """:returns: pictures directory tied to the user, from ``$XDG_PICTURES_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_PICTURES_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_pictures_dir - - @property - def user_videos_dir(self) -> str: - """:returns: videos directory tied to the user, from ``$XDG_VIDEOS_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_VIDEOS_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_videos_dir - - @property - def user_music_dir(self) -> str: - """:returns: music directory tied to the user, from ``$XDG_MUSIC_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_MUSIC_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_music_dir - - @property - def user_desktop_dir(self) -> str: - """:returns: desktop directory tied to the user, from ``$XDG_DESKTOP_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_DESKTOP_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 - return super().user_desktop_dir - - @property - def user_projects_dir(self) -> str: - """:returns: projects directory tied to the user, from ``$XDG_PROJECTS_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_PROJECTS_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 # API returns str, not Path - return super().user_projects_dir - - @property - def user_publicshare_dir(self) -> str: - """:returns: public share directory tied to the user, from ``$XDG_PUBLICSHARE_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_PUBLICSHARE_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 # API returns str, not Path - return super().user_publicshare_dir - - @property - def user_templates_dir(self) -> str: - """:returns: templates directory tied to the user, from ``$XDG_TEMPLATES_DIR`` if set, else platform default""" - if path := os.environ.get("XDG_TEMPLATES_DIR", "").strip(): - return os.path.expanduser(path) # noqa: PTH111 # API returns str, not Path - return super().user_templates_dir - - @property - def user_fonts_dir(self) -> str: - """:returns: fonts directory tied to the user, from ``$XDG_DATA_HOME/fonts`` if set, else platform default""" - if path := os.environ.get("XDG_DATA_HOME", "").strip(): - return f"{os.path.expanduser(path)}/fonts" # noqa: PTH111 # API returns str, not Path - return super().user_fonts_dir - - @property - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user, from ``$XDG_DATA_HOME`` if set, else platform default""" - if path := os.environ.get("XDG_DATA_HOME", "").strip(): - return os.path.join(os.path.expanduser(path), "applications") # noqa: PTH111, PTH118 - return super().user_applications_dir - - @property - def _site_applications_dirs(self) -> list[str]: - if xdg_dirs := os.environ.get("XDG_DATA_DIRS", "").strip(): - return [os.path.join(p, "applications") for p in xdg_dirs.split(os.pathsep) if p.strip()] # noqa: PTH118 - return super()._site_applications_dirs - - @property - def site_applications_dir(self) -> str: - """:returns: applications directories shared by users, from ``$XDG_DATA_DIRS`` if set, else platform default""" - dirs = self._site_applications_dirs - return os.pathsep.join(dirs) if self.multipath else dirs[0] - - -__all__ = [ - "XDGMixin", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py deleted file mode 100755 index 885e8c6..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/android.py +++ /dev/null @@ -1,300 +0,0 @@ -"""Android.""" - -from __future__ import annotations - -import os -import re -import sys -from functools import lru_cache -from typing import TYPE_CHECKING, cast - -from .api import PlatformDirsABC - - -class Android(PlatformDirsABC): # noqa: PLR0904 - """Platform directories for Android. - - Follows the guidance `from here `_. Directories are typically located - under the app's private storage (``/data/user///``). - - Makes use of the `appname `, `version - `, `opinion `, `ensure_exists - `. - - """ - - @property - def user_data_dir(self) -> str: - """:returns: data directory tied to the user, e.g. ``/data/user///files/``""" - return self._append_app_name_and_version(cast("str", _android_folder()), "files") - - @property - def site_data_dir(self) -> str: - """:returns: data directory shared by users, same as `user_data_dir`""" - return self.user_data_dir - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, e.g. ``/data/user///shared_prefs/``""" - return self._append_app_name_and_version(cast("str", _android_folder()), "shared_prefs") - - @property - def site_config_dir(self) -> str: - """:returns: config directory shared by users, same as `user_config_dir`""" - return self.user_config_dir - - @property - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user, e.g.,``/data/user///cache/``""" - return self._append_app_name_and_version(cast("str", _android_folder()), "cache") - - @property - def site_cache_dir(self) -> str: - """:returns: cache directory shared by users, same as `user_cache_dir`""" - return self.user_cache_dir - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_state_dir(self) -> str: - """:returns: state directory shared by users, same as `user_state_dir`""" - return self.user_state_dir - - @property - def user_log_dir(self) -> str: - """:returns: log directory tied to the user, same as `user_cache_dir` if not opinionated else ``log`` in it, e.g. ``/data/user///cache//log``""" - path = self.user_cache_dir - if self.opinion: - path = os.path.join(path, "log") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_log_dir(self) -> str: - """:returns: log directory shared by users, same as `user_log_dir`""" - return self.user_log_dir - - @property - def user_documents_dir(self) -> str: - """:returns: documents directory tied to the user e.g. ``/storage/emulated/0/Documents``""" - return _android_documents_folder() - - @property - def user_downloads_dir(self) -> str: - """:returns: downloads directory tied to the user e.g. ``/storage/emulated/0/Downloads``""" - return _android_downloads_folder() - - @property - def user_pictures_dir(self) -> str: - """:returns: pictures directory tied to the user e.g. ``/storage/emulated/0/Pictures``""" - return _android_pictures_folder() - - @property - def user_videos_dir(self) -> str: - """:returns: videos directory tied to the user e.g. ``/storage/emulated/0/DCIM/Camera``""" - return _android_videos_folder() - - @property - def user_music_dir(self) -> str: - """:returns: music directory tied to the user e.g. ``/storage/emulated/0/Music``""" - return _android_music_folder() - - @property - def user_desktop_dir(self) -> str: - """:returns: desktop directory tied to the user e.g. ``/storage/emulated/0/Desktop``""" - return "/storage/emulated/0/Desktop" - - @property - def user_projects_dir(self) -> str: - """:returns: projects directory tied to the user e.g. ``/storage/emulated/0/Projects``""" - return "/storage/emulated/0/Projects" - - @property - def user_publicshare_dir(self) -> str: - """:returns: public share directory tied to the user e.g. ``/storage/emulated/0/Public``""" - return "/storage/emulated/0/Public" - - @property - def user_templates_dir(self) -> str: - """:returns: templates directory tied to the user e.g. ``/storage/emulated/0/Templates``""" - return "/storage/emulated/0/Templates" - - @property - def user_fonts_dir(self) -> str: - """:returns: fonts directory tied to the user e.g. ``/storage/emulated/0/fonts``""" - return "/storage/emulated/0/fonts" - - @property - def user_preference_dir(self) -> str: - """:returns: preference directory tied to the user, same as ``user_config_dir``""" - return self.user_config_dir - - @property - def user_bin_dir(self) -> str: - """:returns: bin directory tied to the user, e.g. ``/data/user///files/bin``""" - return os.path.join(cast("str", _android_folder()), "files", "bin") # noqa: PTH118 - - @property - def site_bin_dir(self) -> str: - """:returns: bin directory shared by users, same as `user_bin_dir`""" - return self.user_bin_dir - - @property - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_applications_dir(self) -> str: - """:returns: applications directory shared by users, same as `user_applications_dir`""" - return self.user_applications_dir - - @property - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user, same as `user_cache_dir` if not opinionated else ``tmp`` in it, e.g. ``/data/user///cache//tmp``""" - path = self.user_cache_dir - if self.opinion: - path = os.path.join(path, "tmp") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users, same as `user_runtime_dir`""" - return self.user_runtime_dir - - -@lru_cache(maxsize=1) -def _android_folder() -> str | None: # noqa: C901 - """:returns: base folder for the Android OS or None if it cannot be found""" - result: str | None = None - # type checker isn't happy with our "import android", just don't do this when type checking see - # https://stackoverflow.com/a/61394121 - if not TYPE_CHECKING: - try: - # First try to get a path to android app using python4android (if available)... - from android import mActivity # noqa: PLC0415 - - context = cast("android.content.Context", mActivity.getApplicationContext()) # noqa: F821 - result = context.getFilesDir().getParentFile().getAbsolutePath() - except Exception: # noqa: BLE001 - result = None - if result is None: - try: - # ...and fall back to using plain pyjnius, if python4android isn't available or doesn't deliver any useful - # result... - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - result = context.getFilesDir().getParentFile().getAbsolutePath() - except Exception: # noqa: BLE001 - result = None - if result is None: - # and if that fails, too, find an android folder looking at path on the sys.path - # warning: only works for apps installed under /data, not adopted storage etc. - pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files") - for path in sys.path: - if pattern.match(path): - result = path.split("/files")[0] - break - else: - result = None - if result is None: - # one last try: find an android folder looking at path on the sys.path taking adopted storage paths into - # account - pattern = re.compile(r"/mnt/expand/[a-fA-F0-9-]{36}/(data|user/\d+)/(.+)/files") - for path in sys.path: - if pattern.match(path): - result = path.split("/files")[0] - break - else: - result = None - return result - - -@lru_cache(maxsize=1) -def _android_documents_folder() -> str: - """:returns: documents folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - documents_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOCUMENTS).getAbsolutePath() - except Exception: # noqa: BLE001 - documents_dir = "/storage/emulated/0/Documents" - - return documents_dir - - -@lru_cache(maxsize=1) -def _android_downloads_folder() -> str: - """:returns: downloads folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - downloads_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DOWNLOADS).getAbsolutePath() - except Exception: # noqa: BLE001 - downloads_dir = "/storage/emulated/0/Downloads" - - return downloads_dir - - -@lru_cache(maxsize=1) -def _android_pictures_folder() -> str: - """:returns: pictures folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - pictures_dir: str = context.getExternalFilesDir(environment.DIRECTORY_PICTURES).getAbsolutePath() - except Exception: # noqa: BLE001 - pictures_dir = "/storage/emulated/0/Pictures" - - return pictures_dir - - -@lru_cache(maxsize=1) -def _android_videos_folder() -> str: - """:returns: videos folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - videos_dir: str = context.getExternalFilesDir(environment.DIRECTORY_DCIM).getAbsolutePath() - except Exception: # noqa: BLE001 - videos_dir = "/storage/emulated/0/DCIM/Camera" - - return videos_dir - - -@lru_cache(maxsize=1) -def _android_music_folder() -> str: - """:returns: music folder for the Android OS""" - # Get directories with pyjnius - try: - from jnius import autoclass # noqa: PLC0415 # ty: ignore[unresolved-import] - - context = autoclass("android.content.Context") - environment = autoclass("android.os.Environment") - music_dir: str = context.getExternalFilesDir(environment.DIRECTORY_MUSIC).getAbsolutePath() - except Exception: # noqa: BLE001 - music_dir = "/storage/emulated/0/Music" - - return music_dir - - -__all__ = [ - "Android", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py deleted file mode 100755 index 91ef902..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/api.py +++ /dev/null @@ -1,463 +0,0 @@ -"""Base API.""" - -from __future__ import annotations - -import os -from abc import ABC, abstractmethod -from pathlib import Path -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from collections.abc import Iterator - from typing import Literal - - -class PlatformDirsABC(ABC): # noqa: PLR0904 - """Abstract base class defining all platform directory properties, their :class:`~pathlib.Path` variants, and iterators. - - Platform-specific subclasses (e.g. :class:`~platformdirs.windows.Windows`, :class:`~platformdirs.macos.MacOS`, - :class:`~platformdirs.unix.Unix`) implement the abstract properties to return the appropriate paths for each - operating system. - - """ - - def __init__( # noqa: PLR0913, PLR0917 - self, - appname: str | None = None, - appauthor: str | Literal[False] | None = None, - version: str | None = None, - roaming: bool = False, # noqa: FBT001, FBT002 - multipath: bool = False, # noqa: FBT001, FBT002 - opinion: bool = True, # noqa: FBT001, FBT002 - ensure_exists: bool = False, # noqa: FBT001, FBT002 - use_site_for_root: bool = False, # noqa: FBT001, FBT002 - ) -> None: - """Create a new platform directory. - - :param appname: See `appname`. - :param appauthor: See `appauthor`. - :param version: See `version`. - :param roaming: See `roaming`. - :param multipath: See `multipath`. - :param opinion: See `opinion`. - :param ensure_exists: See `ensure_exists`. - :param use_site_for_root: See `use_site_for_root`. - - """ - self.appname = appname #: The name of the application. - self.appauthor = appauthor - """The name of the app author or distributing body for this application. - - Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it. - - .. note:: - - On Windows, the directory structure is ``//``. When ``appauthor`` is ``None`` (the - default), it falls back to ``appname``, resulting in ``//`` (e.g. - ``AppData/Local/myapp/myapp``). Pass ``appauthor=False`` to omit the author directory entirely and get - ``/``. - - """ - self.version = version - """An optional version path element to append to the path. - - You might want to use this if you want multiple versions of your app to be able to run independently. If used, - this would typically be ``.``. - - """ - self.roaming = roaming - """Whether to use the roaming appdata directory on Windows. - - That means that for users on a Windows network setup for roaming profiles, this user data will be synced on - login (see `here `_). - - """ - self.multipath = multipath - """An optional parameter which indicates that the entire list of data dirs should be returned. - - By default, the first item would only be returned. Only affects ``site_data_dir`` and ``site_config_dir`` on - Unix and macOS. - - """ - self.opinion = opinion - """Whether to use opinionated values. - - When enabled, appends an additional subdirectory for certain directories: e.g. ``Cache`` for cache and ``Logs`` - for logs on Windows, ``log`` for logs on Unix. - - """ - self.ensure_exists = ensure_exists - """Optionally create the directory (and any missing parents) upon access if it does not exist. - - By default, no directories are created. - - """ - self.use_site_for_root = use_site_for_root - """Whether to redirect ``user_*_dir`` calls to their ``site_*_dir`` equivalents when running as root (uid 0). - - Only has an effect on Unix. Disabled by default for backwards compatibility. When enabled, XDG user environment - variables (e.g. ``XDG_DATA_HOME``) are bypassed for the redirected directories. - - """ - - def _append_app_name_and_version(self, *base: str) -> str: - params = list(base[1:]) - if self.appname: - params.append(self.appname) - if self.version: - params.append(self.version) - path = os.path.join(base[0], *params) # noqa: PTH118 - self._optionally_create_directory(path) - return path - - def _optionally_create_directory(self, path: str) -> None: - if self.ensure_exists: - Path(path).mkdir(parents=True, exist_ok=True) - - def _first_item_as_path_if_multipath(self, directory: str) -> Path: - if self.multipath: - # If multipath is True, the first path is returned. - directory = directory.partition(os.pathsep)[0] - return Path(directory) - - @property - @abstractmethod - def user_data_dir(self) -> str: - """:returns: data directory tied to the user""" - - @property - @abstractmethod - def site_data_dir(self) -> str: - """:returns: data directory shared by users""" - - @property - def _site_data_dirs(self) -> list[str]: - raise NotImplementedError - - @property - @abstractmethod - def user_config_dir(self) -> str: - """:returns: config directory tied to the user""" - - @property - @abstractmethod - def site_config_dir(self) -> str: - """:returns: config directory shared by users""" - - @property - def _site_config_dirs(self) -> list[str]: - raise NotImplementedError - - @property - @abstractmethod - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user""" - - @property - @abstractmethod - def site_cache_dir(self) -> str: - """:returns: cache directory shared by users""" - - @property - @abstractmethod - def user_state_dir(self) -> str: - """:returns: state directory tied to the user""" - - @property - @abstractmethod - def site_state_dir(self) -> str: - """:returns: state directory shared by users""" - - @property - @abstractmethod - def user_log_dir(self) -> str: - """:returns: log directory tied to the user""" - - @property - @abstractmethod - def site_log_dir(self) -> str: - """:returns: log directory shared by users""" - - @property - @abstractmethod - def user_documents_dir(self) -> str: - """:returns: documents directory tied to the user""" - - @property - @abstractmethod - def user_downloads_dir(self) -> str: - """:returns: downloads directory tied to the user""" - - @property - @abstractmethod - def user_pictures_dir(self) -> str: - """:returns: pictures directory tied to the user""" - - @property - @abstractmethod - def user_videos_dir(self) -> str: - """:returns: videos directory tied to the user""" - - @property - @abstractmethod - def user_music_dir(self) -> str: - """:returns: music directory tied to the user""" - - @property - @abstractmethod - def user_desktop_dir(self) -> str: - """:returns: desktop directory tied to the user""" - - @property - @abstractmethod - def user_projects_dir(self) -> str: - """:returns: projects directory tied to the user""" - - @property - @abstractmethod - def user_publicshare_dir(self) -> str: - """:returns: public share directory tied to the user""" - - @property - @abstractmethod - def user_templates_dir(self) -> str: - """:returns: templates directory tied to the user""" - - @property - @abstractmethod - def user_fonts_dir(self) -> str: - """:returns: fonts directory tied to the user""" - - @property - @abstractmethod - def user_preference_dir(self) -> str: - """:returns: preference directory tied to the user""" - - @property - @abstractmethod - def user_bin_dir(self) -> str: - """:returns: bin directory tied to the user""" - - @property - @abstractmethod - def site_bin_dir(self) -> str: - """:returns: bin directory shared by users""" - - @property - @abstractmethod - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user""" - - @property - @abstractmethod - def site_applications_dir(self) -> str: - """:returns: applications directory shared by users""" - - @property - def _site_applications_dirs(self) -> list[str]: - raise NotImplementedError - - @property - @abstractmethod - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user""" - - @property - @abstractmethod - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users""" - - @property - def user_data_path(self) -> Path: - """:returns: data path tied to the user""" - return Path(self.user_data_dir) - - @property - def site_data_path(self) -> Path: - """:returns: data path shared by users""" - return Path(self.site_data_dir) - - @property - def user_config_path(self) -> Path: - """:returns: config path tied to the user""" - return Path(self.user_config_dir) - - @property - def site_config_path(self) -> Path: - """:returns: config path shared by users""" - return Path(self.site_config_dir) - - @property - def user_cache_path(self) -> Path: - """:returns: cache path tied to the user""" - return Path(self.user_cache_dir) - - @property - def site_cache_path(self) -> Path: - """:returns: cache path shared by users""" - return Path(self.site_cache_dir) - - @property - def user_state_path(self) -> Path: - """:returns: state path tied to the user""" - return Path(self.user_state_dir) - - @property - def site_state_path(self) -> Path: - """:returns: state path shared by users""" - return Path(self.site_state_dir) - - @property - def user_log_path(self) -> Path: - """:returns: log path tied to the user""" - return Path(self.user_log_dir) - - @property - def site_log_path(self) -> Path: - """:returns: log path shared by users""" - return Path(self.site_log_dir) - - @property - def user_documents_path(self) -> Path: - """:returns: documents path tied to the user""" - return Path(self.user_documents_dir) - - @property - def user_downloads_path(self) -> Path: - """:returns: downloads path tied to the user""" - return Path(self.user_downloads_dir) - - @property - def user_pictures_path(self) -> Path: - """:returns: pictures path tied to the user""" - return Path(self.user_pictures_dir) - - @property - def user_videos_path(self) -> Path: - """:returns: videos path tied to the user""" - return Path(self.user_videos_dir) - - @property - def user_music_path(self) -> Path: - """:returns: music path tied to the user""" - return Path(self.user_music_dir) - - @property - def user_desktop_path(self) -> Path: - """:returns: desktop path tied to the user""" - return Path(self.user_desktop_dir) - - @property - def user_projects_path(self) -> Path: - """:returns: projects path tied to the user""" - return Path(self.user_projects_dir) - - @property - def user_publicshare_path(self) -> Path: - """:returns: public share path tied to the user""" - return Path(self.user_publicshare_dir) - - @property - def user_templates_path(self) -> Path: - """:returns: templates path tied to the user""" - return Path(self.user_templates_dir) - - @property - def user_fonts_path(self) -> Path: - """:returns: fonts path tied to the user""" - return Path(self.user_fonts_dir) - - @property - def user_preference_path(self) -> Path: - """:returns: preference path tied to the user""" - return Path(self.user_preference_dir) - - @property - def user_bin_path(self) -> Path: - """:returns: bin path tied to the user""" - return Path(self.user_bin_dir) - - @property - def site_bin_path(self) -> Path: - """:returns: bin path shared by users""" - return Path(self.site_bin_dir) - - @property - def user_applications_path(self) -> Path: - """:returns: applications path tied to the user""" - return Path(self.user_applications_dir) - - @property - def site_applications_path(self) -> Path: - """:returns: applications path shared by users""" - return Path(self.site_applications_dir) - - @property - def user_runtime_path(self) -> Path: - """:returns: runtime path tied to the user""" - return Path(self.user_runtime_dir) - - @property - def site_runtime_path(self) -> Path: - """:returns: runtime path shared by users""" - return Path(self.site_runtime_dir) - - def iter_config_dirs(self) -> Iterator[str]: - """:yield: all user and site configuration directories.""" - yield self.user_config_dir - yield self.site_config_dir - - def iter_data_dirs(self) -> Iterator[str]: - """:yield: all user and site data directories.""" - yield self.user_data_dir - yield self.site_data_dir - - def iter_cache_dirs(self) -> Iterator[str]: - """:yield: all user and site cache directories.""" - yield self.user_cache_dir - yield self.site_cache_dir - - def iter_state_dirs(self) -> Iterator[str]: - """:yield: all user and site state directories.""" - yield self.user_state_dir - yield self.site_state_dir - - def iter_log_dirs(self) -> Iterator[str]: - """:yield: all user and site log directories.""" - yield self.user_log_dir - yield self.site_log_dir - - def iter_runtime_dirs(self) -> Iterator[str]: - """:yield: all user and site runtime directories.""" - yield self.user_runtime_dir - yield self.site_runtime_dir - - def iter_config_paths(self) -> Iterator[Path]: - """:yield: all user and site configuration paths.""" - for path in self.iter_config_dirs(): - yield Path(path) - - def iter_data_paths(self) -> Iterator[Path]: - """:yield: all user and site data paths.""" - for path in self.iter_data_dirs(): - yield Path(path) - - def iter_cache_paths(self) -> Iterator[Path]: - """:yield: all user and site cache paths.""" - for path in self.iter_cache_dirs(): - yield Path(path) - - def iter_state_paths(self) -> Iterator[Path]: - """:yield: all user and site state paths.""" - for path in self.iter_state_dirs(): - yield Path(path) - - def iter_log_paths(self) -> Iterator[Path]: - """:yield: all user and site log paths.""" - for path in self.iter_log_dirs(): - yield Path(path) - - def iter_runtime_paths(self) -> Iterator[Path]: - """:yield: all user and site runtime paths.""" - for path in self.iter_runtime_dirs(): - yield Path(path) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py deleted file mode 100755 index 9ebc2a0..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/macos.py +++ /dev/null @@ -1,223 +0,0 @@ -"""macOS.""" - -from __future__ import annotations - -import os.path -import sys -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from collections.abc import Iterator - -from ._xdg import XDGMixin -from .api import PlatformDirsABC - -if TYPE_CHECKING: - from pathlib import Path - - -class _MacOSDefaults(PlatformDirsABC): # noqa: PLR0904 - """Default platform directories for macOS without XDG environment variable overrides. - - Follows the guidance from `Apple's File System Programming Guide - `_. - The XDG env var handling is in :class:`~platformdirs._xdg.XDGMixin`. - - """ - - def _base_user_app_support_dir(self) -> str: - return self._append_app_name_and_version(os.path.expanduser("~/Library/Application Support")) # noqa: PTH111 - - def _base_site_dirs(self) -> list[str]: - is_homebrew = "/opt/python" in sys.prefix - homebrew_prefix = sys.prefix.split("/opt/python")[0] if is_homebrew else "" - path_list = [self._append_app_name_and_version(f"{homebrew_prefix}/share")] if is_homebrew else [] - path_list.append(self._append_app_name_and_version("/Library/Application Support")) - return path_list - - @property - def user_data_dir(self) -> str: - """:returns: data directory tied to the user, e.g. ``~/Library/Application Support/$appname/$version``""" - return self._base_user_app_support_dir() - - @property - def _site_data_dirs(self) -> list[str]: - return self._base_site_dirs() - - @property - def site_data_path(self) -> Path: - """:returns: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_data_dir) - - @property - def site_config_path(self) -> Path: - """:returns: config path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_config_dir) - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, same as `user_data_dir`""" - return self._base_user_app_support_dir() - - @property - def _site_config_dirs(self) -> list[str]: - return self._base_site_dirs() - - @property - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user, e.g. ``~/Library/Caches/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches")) # noqa: PTH111 - - @property - def site_cache_dir(self) -> str: - """:returns: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``. If we're using a Python binary managed by `Homebrew `_, the directory will be under the Homebrew prefix, e.g. ``$homebrew_prefix/var/cache/$appname/$version``. If `multipath ` is enabled, and we're in Homebrew, the response is a multi-path string separated by ":", e.g. ``$homebrew_prefix/var/cache/$appname/$version:/Library/Caches/$appname/$version``""" - is_homebrew = "/opt/python" in sys.prefix - homebrew_prefix = sys.prefix.split("/opt/python")[0] if is_homebrew else "" - path_list = [self._append_app_name_and_version(f"{homebrew_prefix}/var/cache")] if is_homebrew else [] - path_list.append(self._append_app_name_and_version("/Library/Caches")) - if self.multipath: - return os.pathsep.join(path_list) - return path_list[0] - - @property - def site_cache_path(self) -> Path: - """:returns: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_cache_dir) - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, same as `user_data_dir`""" - return self._base_user_app_support_dir() - - @property - def site_state_dir(self) -> str: - """:returns: state directory shared by users, same as `site_data_dir`""" - return self._base_site_dirs()[0] - - @property - def user_log_dir(self) -> str: - """:returns: log directory tied to the user, e.g. ``~/Library/Logs/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Logs")) # noqa: PTH111 - - @property - def site_log_dir(self) -> str: - """:returns: log directory shared by users, e.g. ``/Library/Logs/$appname/$version``""" - return self._append_app_name_and_version("/Library/Logs") - - @property - def user_documents_dir(self) -> str: - """:returns: documents directory tied to the user, e.g. ``~/Documents``""" - return os.path.expanduser("~/Documents") # noqa: PTH111 - - @property - def user_downloads_dir(self) -> str: - """:returns: downloads directory tied to the user, e.g. ``~/Downloads``""" - return os.path.expanduser("~/Downloads") # noqa: PTH111 - - @property - def user_pictures_dir(self) -> str: - """:returns: pictures directory tied to the user, e.g. ``~/Pictures``""" - return os.path.expanduser("~/Pictures") # noqa: PTH111 - - @property - def user_videos_dir(self) -> str: - """:returns: videos directory tied to the user, e.g. ``~/Movies``""" - return os.path.expanduser("~/Movies") # noqa: PTH111 - - @property - def user_music_dir(self) -> str: - """:returns: music directory tied to the user, e.g. ``~/Music``""" - return os.path.expanduser("~/Music") # noqa: PTH111 - - @property - def user_desktop_dir(self) -> str: - """:returns: desktop directory tied to the user, e.g. ``~/Desktop``""" - return os.path.expanduser("~/Desktop") # noqa: PTH111 - - @property - def user_projects_dir(self) -> str: - """:returns: projects directory tied to the user, e.g. ``~/Projects``""" - return os.path.expanduser("~/Projects") # noqa: PTH111 - - @property - def user_publicshare_dir(self) -> str: - """:returns: public share directory tied to the user, e.g. ``~/Public``""" - return os.path.expanduser("~/Public") # noqa: PTH111 # API returns str, not Path - - @property - def user_templates_dir(self) -> str: - """:returns: templates directory tied to the user, e.g. ``~/Templates``""" - return os.path.expanduser("~/Templates") # noqa: PTH111 # API returns str, not Path - - @property - def user_fonts_dir(self) -> str: - """:returns: fonts directory tied to the user, e.g. ``~/Library/Fonts``""" - return os.path.expanduser("~/Library/Fonts") # noqa: PTH111 # API returns str, not Path - - @property - def user_preference_dir(self) -> str: - """:returns: preference directory tied to the user, e.g. ``~/Library/Preferences/AppName``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Preferences")) # noqa: PTH111 # API returns str, not Path - - @property - def user_bin_dir(self) -> str: - """:returns: bin directory tied to the user, e.g. ``~/.local/bin``""" - return os.path.expanduser("~/.local/bin") # noqa: PTH111 - - @property - def site_bin_dir(self) -> str: - """:returns: bin directory shared by users, e.g. ``/usr/local/bin``""" - return "/usr/local/bin" - - @property - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user, e.g. ``~/Applications``""" - return os.path.expanduser("~/Applications") # noqa: PTH111 - - @property - def _site_applications_dirs(self) -> list[str]: - return ["/Applications"] - - @property - def site_applications_dir(self) -> str: - """:returns: applications directory shared by users, e.g. ``/Applications``""" - dirs = self._site_applications_dirs - return os.pathsep.join(dirs) if self.multipath else dirs[0] - - @property - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111 - - @property - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users, same as `user_runtime_dir`""" - return self.user_runtime_dir - - def iter_config_dirs(self) -> Iterator[str]: - """:yield: all user and site configuration directories.""" - yield self.user_config_dir - yield from self._site_config_dirs - - def iter_data_dirs(self) -> Iterator[str]: - """:yield: all user and site data directories.""" - yield self.user_data_dir - yield from self._site_data_dirs - - -class MacOS(XDGMixin, _MacOSDefaults): - """Platform directories for the macOS operating system. - - Follows the guidance from `Apple documentation - `_. - Makes use of the `appname `, `version - `, `ensure_exists `. - - XDG environment variables (e.g. ``$XDG_DATA_HOME``) are supported and take precedence over macOS defaults. - - """ - - -__all__ = [ - "MacOS", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/py.typed b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py deleted file mode 100755 index 500d3a4..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/unix.py +++ /dev/null @@ -1,321 +0,0 @@ -"""Unix.""" - -from __future__ import annotations - -import os -import sys -from configparser import ConfigParser -from functools import cached_property -from pathlib import Path -from tempfile import gettempdir -from typing import TYPE_CHECKING, NoReturn - -from ._xdg import XDGMixin -from .api import PlatformDirsABC - -if TYPE_CHECKING: - from collections.abc import Iterator - -if sys.platform == "win32": - - def getuid() -> NoReturn: - msg = "should only be used on Unix" - raise RuntimeError(msg) - -else: - from os import getuid - - -class _UnixDefaults(PlatformDirsABC): # noqa: PLR0904 - """Default directories for Unix/Linux without XDG environment variable overrides. - - The XDG env var handling is in :class:`~platformdirs._xdg.XDGMixin`. - - """ - - @cached_property - def _use_site(self) -> bool: - return self.use_site_for_root and getuid() == 0 - - @property - def user_data_dir(self) -> str: - """:returns: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or ``$XDG_DATA_HOME/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/.local/share")) # noqa: PTH111 - - @property - def _site_data_dirs(self) -> list[str]: - return [self._append_app_name_and_version("/usr/local/share"), self._append_app_name_and_version("/usr/share")] - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or ``$XDG_CONFIG_HOME/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/.config")) # noqa: PTH111 - - @property - def _site_config_dirs(self) -> list[str]: - return [self._append_app_name_and_version("/etc/xdg")] - - @property - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or ``$XDG_CACHE_HOME/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/.cache")) # noqa: PTH111 - - @property - def site_cache_dir(self) -> str: - """:returns: cache directory shared by users, e.g. ``/var/cache/$appname/$version``""" - return self._append_app_name_and_version("/var/cache") - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or ``$XDG_STATE_HOME/$appname/$version``""" - return self._append_app_name_and_version(os.path.expanduser("~/.local/state")) # noqa: PTH111 - - @property - def site_state_dir(self) -> str: - """:returns: state directory shared by users, e.g. ``/var/lib/$appname/$version``""" - return self._append_app_name_and_version("/var/lib") - - @property - def user_log_dir(self) -> str: - """:returns: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it""" - path = self.user_state_dir - if self.opinion: - path = os.path.join(path, "log") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_log_dir(self) -> str: - """:returns: log directory shared by users, e.g. ``/var/log/$appname/$version`` - - Unlike `user_log_dir`, ``opinion`` has no effect since ``/var/log`` is inherently a log directory. - - """ - return self._append_app_name_and_version("/var/log") - - @property - def user_documents_dir(self) -> str: - """:returns: documents directory tied to the user, e.g. ``~/Documents``""" - return _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents") - - @property - def user_downloads_dir(self) -> str: - """:returns: downloads directory tied to the user, e.g. ``~/Downloads``""" - return _get_user_media_dir("XDG_DOWNLOAD_DIR", "~/Downloads") - - @property - def user_pictures_dir(self) -> str: - """:returns: pictures directory tied to the user, e.g. ``~/Pictures``""" - return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures") - - @property - def user_videos_dir(self) -> str: - """:returns: videos directory tied to the user, e.g. ``~/Videos``""" - return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos") - - @property - def user_music_dir(self) -> str: - """:returns: music directory tied to the user, e.g. ``~/Music``""" - return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music") - - @property - def user_desktop_dir(self) -> str: - """:returns: desktop directory tied to the user, e.g. ``~/Desktop``""" - return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop") - - @property - def user_projects_dir(self) -> str: - """:returns: projects directory tied to the user, e.g. ``~/Projects``""" - return _get_user_media_dir("XDG_PROJECTS_DIR", "~/Projects") - - @property - def user_publicshare_dir(self) -> str: - """:returns: public share directory tied to the user, e.g. ``~/Public``""" - return _get_user_media_dir("XDG_PUBLICSHARE_DIR", "~/Public") - - @property - def user_templates_dir(self) -> str: - """:returns: templates directory tied to the user, e.g. ``~/Templates``""" - return _get_user_media_dir("XDG_TEMPLATES_DIR", "~/Templates") - - @property - def user_fonts_dir(self) -> str: - """:returns: fonts directory tied to the user, e.g. ``~/.local/share/fonts``""" - return f"{os.path.expanduser('~/.local/share')}/fonts" # noqa: PTH111 # API returns str, not Path - - @property - def user_preference_dir(self) -> str: - """:returns: preference directory tied to the user, same as ``user_config_dir``""" - return self.user_config_dir - - @property - def user_bin_dir(self) -> str: - """:returns: bin directory tied to the user, e.g. ``~/.local/bin``""" - return os.path.expanduser("~/.local/bin") # noqa: PTH111 - - @property - def site_bin_dir(self) -> str: - """:returns: bin directory shared by users, e.g. ``/usr/local/bin``""" - return "/usr/local/bin" - - @property - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user, e.g. ``~/.local/share/applications``""" - return os.path.join(os.path.expanduser("~/.local/share"), "applications") # noqa: PTH111, PTH118 - - @property - def _site_applications_dirs(self) -> list[str]: - return [os.path.join(p, "applications") for p in ["/usr/local/share", "/usr/share"]] # noqa: PTH118 - - @property - def site_applications_dir(self) -> str: - """:returns: applications directory shared by users, e.g. ``/usr/share/applications``""" - dirs = self._site_applications_dirs - return os.pathsep.join(dirs) if self.multipath else dirs[0] - - @property - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user, e.g. ``$XDG_RUNTIME_DIR/$appname/$version``. - - If ``$XDG_RUNTIME_DIR`` is unset, tries the platform default (``/tmp/run/user/$(id -u)`` on OpenBSD, ``/var/run/user/$(id -u)`` on FreeBSD/NetBSD, ``/run/user/$(id -u)`` otherwise). If the default is not writable, falls back to a temporary directory. - - """ - if sys.platform.startswith("openbsd"): - path = f"/tmp/run/user/{getuid()}" # noqa: S108 - elif sys.platform.startswith(("freebsd", "netbsd")): - path = f"/var/run/user/{getuid()}" - else: - path = f"/run/user/{getuid()}" - if not os.access(path, os.W_OK): - path = f"{gettempdir()}/runtime-{getuid()}" - return self._append_app_name_and_version(path) - - @property - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users, e.g. ``/run/$appname/$version`` or ``$XDG_RUNTIME_DIR/$appname/$version``. - - Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will fall back to paths associated to the root user instead of a regular logged-in user if it's not set. - - If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir` instead. - - For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set. - - """ - if sys.platform.startswith(("freebsd", "openbsd", "netbsd")): - path = "/var/run" - else: - path = "/run" - return self._append_app_name_and_version(path) - - @property - def site_data_path(self) -> Path: - """:returns: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_data_dir) - - @property - def site_config_path(self) -> Path: - """:returns: config path shared by users, returns the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_config_dir) - - @property - def site_cache_path(self) -> Path: - """:returns: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``""" - return self._first_item_as_path_if_multipath(self.site_cache_dir) - - def iter_config_dirs(self) -> Iterator[str]: - """:yield: all user and site configuration directories.""" - if not self._use_site: - yield self.user_config_dir - yield from self._site_config_dirs - - def iter_data_dirs(self) -> Iterator[str]: - """:yield: all user and site data directories.""" - if not self._use_site: - yield self.user_data_dir - yield from self._site_data_dirs - - -class Unix(XDGMixin, _UnixDefaults): - """On Unix/Linux, we follow the `XDG Basedir Spec `_. - - The spec allows overriding directories with environment variables. The examples shown are the default values, - alongside the name of the environment variable that overrides them. Makes use of the `appname - `, `version `, `multipath - `, `opinion `, `ensure_exists - `. - - """ - - @property - def user_data_dir(self) -> str: - """:returns: data directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_data_dir if self._use_site else super().user_data_dir - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_config_dir if self._use_site else super().user_config_dir - - @property - def user_cache_dir(self) -> str: - """:returns: cache directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_cache_dir if self._use_site else super().user_cache_dir - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_state_dir if self._use_site else super().user_state_dir - - @property - def user_log_dir(self) -> str: - """:returns: log directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_log_dir if self._use_site else super().user_log_dir - - @property - def user_applications_dir(self) -> str: - """:returns: applications directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_applications_dir if self._use_site else super().user_applications_dir - - @property - def user_runtime_dir(self) -> str: - """:returns: runtime directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_runtime_dir if self._use_site else super().user_runtime_dir - - @property - def user_bin_dir(self) -> str: - """:returns: bin directory tied to the user, or site equivalent when root with ``use_site_for_root``""" - return self.site_bin_dir if self._use_site else super().user_bin_dir - - -def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str: - if media_dir := _get_user_dirs_folder(env_var): - return media_dir - return os.path.expanduser(fallback_tilde_path) # noqa: PTH111 - - -def _get_user_dirs_folder(key: str) -> str | None: - """Return directory from user-dirs.dirs config file. - - See https://freedesktop.org/wiki/Software/xdg-user-dirs/. - - """ - config_home = os.environ.get("XDG_CONFIG_HOME", "").strip() or os.path.expanduser("~/.config") # noqa: PTH111 - user_dirs_config_path = Path(config_home) / "user-dirs.dirs" - if user_dirs_config_path.exists(): - parser = ConfigParser() - - with user_dirs_config_path.open() as stream: - parser.read_string(f"[top]\n{stream.read()}") - - if key not in parser["top"]: - return None - - path = parser["top"][key].strip('"') - return path.replace("$HOME", os.path.expanduser("~")) # noqa: PTH111 - - return None - - -__all__ = [ - "Unix", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py deleted file mode 100755 index a281775..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/version.py +++ /dev/null @@ -1,24 +0,0 @@ -# file generated by vcs-versioning -# don't change, don't track in version control -from __future__ import annotations - -__all__ = [ - "__version__", - "__version_tuple__", - "version", - "version_tuple", - "__commit_id__", - "commit_id", -] - -version: str -__version__: str -__version_tuple__: tuple[int | str, ...] -version_tuple: tuple[int | str, ...] -commit_id: str | None -__commit_id__: str | None - -__version__ = version = '4.10.0' -__version_tuple__ = version_tuple = (4, 10, 0) - -__commit_id__ = commit_id = None diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py b/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py deleted file mode 100755 index 476ffe7..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/platformdirs/windows.py +++ /dev/null @@ -1,395 +0,0 @@ -"""Windows.""" - -from __future__ import annotations - -import os -import sys -from pathlib import Path -from typing import TYPE_CHECKING, Final - -from .api import PlatformDirsABC - -if TYPE_CHECKING: - from collections.abc import Callable - -# Not exposed by CPython; defined in the Windows SDK (shlobj_core.h) -_KF_FLAG_DONT_VERIFY: Final[int] = 0x00004000 - - -class Windows(PlatformDirsABC): # noqa: PLR0904 - """`MSDN on where to store app data files `_. - - Makes use of the `appname `, `appauthor - `, `version `, `roaming - `, `opinion `, `ensure_exists - `. - - """ - - @property - def user_data_dir(self) -> str: - r""":returns: data directory tied to the user, e.g. ``%USERPROFILE%\AppData\Local\$appauthor\$appname`` (not roaming) or ``%USERPROFILE%\AppData\Roaming\$appauthor\$appname`` (roaming)""" - const = "CSIDL_APPDATA" if self.roaming else "CSIDL_LOCAL_APPDATA" - path = os.path.normpath(get_win_folder(const)) - return self._append_parts(path) - - def _append_parts(self, path: str, *, opinion_value: str | None = None) -> str: - params = [] - if self.appname: - if self.appauthor is not False: - author = self.appauthor or self.appname - params.append(author) - params.append(self.appname) - if opinion_value is not None and self.opinion: - params.append(opinion_value) - if self.version: - params.append(self.version) - path = os.path.join(path, *params) # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_data_dir(self) -> str: - r""":returns: data directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname``""" - path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) - return self._append_parts(path) - - @property - def user_config_dir(self) -> str: - """:returns: config directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_config_dir(self) -> str: - """:returns: config directory shared by users, same as `site_data_dir`""" - return self.site_data_dir - - @property - def user_cache_dir(self) -> str: - r""":returns: cache directory tied to the user (if opinionated with ``Cache`` folder within ``$appname``) e.g. ``%USERPROFILE%\AppData\Local\$appauthor\$appname\Cache\$version``""" - path = os.path.normpath(get_win_folder("CSIDL_LOCAL_APPDATA")) - return self._append_parts(path, opinion_value="Cache") - - @property - def site_cache_dir(self) -> str: - r""":returns: cache directory shared by users, e.g. ``C:\ProgramData\$appauthor\$appname\Cache\$version``""" - path = os.path.normpath(get_win_folder("CSIDL_COMMON_APPDATA")) - return self._append_parts(path, opinion_value="Cache") - - @property - def user_state_dir(self) -> str: - """:returns: state directory tied to the user, same as `user_data_dir`""" - return self.user_data_dir - - @property - def site_state_dir(self) -> str: - """:returns: state directory shared by users, same as `site_data_dir`""" - return self.site_data_dir - - @property - def user_log_dir(self) -> str: - """:returns: log directory tied to the user, same as `user_data_dir` if not opinionated else ``Logs`` in it""" - path = self.user_data_dir - if self.opinion: - path = os.path.join(path, "Logs") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def site_log_dir(self) -> str: - """:returns: log directory shared by users, same as `site_data_dir` if not opinionated else ``Logs`` in it""" - path = self.site_data_dir - if self.opinion: - path = os.path.join(path, "Logs") # noqa: PTH118 - self._optionally_create_directory(path) - return path - - @property - def user_documents_dir(self) -> str: - r""":returns: documents directory tied to the user e.g. ``%USERPROFILE%\Documents``""" - return os.path.normpath(get_win_folder("CSIDL_PERSONAL")) - - @property - def user_downloads_dir(self) -> str: - r""":returns: downloads directory tied to the user e.g. ``%USERPROFILE%\Downloads``""" - return os.path.normpath(get_win_folder("CSIDL_DOWNLOADS")) - - @property - def user_pictures_dir(self) -> str: - r""":returns: pictures directory tied to the user e.g. ``%USERPROFILE%\Pictures``""" - return os.path.normpath(get_win_folder("CSIDL_MYPICTURES")) - - @property - def user_videos_dir(self) -> str: - r""":returns: videos directory tied to the user e.g. ``%USERPROFILE%\Videos``""" - return os.path.normpath(get_win_folder("CSIDL_MYVIDEO")) - - @property - def user_music_dir(self) -> str: - r""":returns: music directory tied to the user e.g. ``%USERPROFILE%\Music``""" - return os.path.normpath(get_win_folder("CSIDL_MYMUSIC")) - - @property - def user_desktop_dir(self) -> str: - r""":returns: desktop directory tied to the user, e.g. ``%USERPROFILE%\Desktop``""" - return os.path.normpath(get_win_folder("CSIDL_DESKTOPDIRECTORY")) - - @property - def user_projects_dir(self) -> str: - r""":returns: projects directory tied to the user, e.g. ``%USERPROFILE%\Projects``""" - return os.path.normpath(os.path.expanduser("~/Projects")) # noqa: PTH111 - - @property - def user_publicshare_dir(self) -> str: - r""":returns: public share directory e.g. ``C:\Users\Public``""" - return os.path.normpath(os.environ.get("PUBLIC", str(Path("~").expanduser().parent / "Public"))) - - @property - def user_templates_dir(self) -> str: - r""":returns: templates directory tied to the user e.g. ``%APPDATA%\Microsoft\Windows\Templates``""" - return os.path.normpath(str(Path(get_win_folder("CSIDL_APPDATA")) / "Microsoft" / "Windows" / "Templates")) - - @property - def user_fonts_dir(self) -> str: - r""":returns: fonts directory tied to the user e.g. ``%LOCALAPPDATA%\Microsoft\Windows\Fonts``""" - return os.path.normpath(str(Path(get_win_folder("CSIDL_LOCAL_APPDATA")) / "Microsoft" / "Windows" / "Fonts")) - - @property - def user_preference_dir(self) -> str: - r""":returns: preference directory tied to the user, same as ``user_config_dir``""" - return self.user_config_dir - - @property - def user_bin_dir(self) -> str: - r""":returns: bin directory tied to the user, e.g. ``%LOCALAPPDATA%\Programs``""" - return os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Programs")) # noqa: PTH118 - - @property - def site_bin_dir(self) -> str: - """:returns: bin directory shared by users, e.g. ``C:\\ProgramData\bin``""" - return os.path.normpath(os.path.join(get_win_folder("CSIDL_COMMON_APPDATA"), "bin")) # noqa: PTH118 - - @property - def user_applications_dir(self) -> str: - r""":returns: applications directory tied to the user, e.g. ``Start Menu\Programs``""" - return os.path.normpath(get_win_folder("CSIDL_PROGRAMS")) - - @property - def site_applications_dir(self) -> str: - r""":returns: applications directory shared by users, e.g. ``C:\ProgramData\Microsoft\Windows\Start Menu\Programs``""" - return os.path.normpath(get_win_folder("CSIDL_COMMON_PROGRAMS")) - - @property - def user_runtime_dir(self) -> str: - r""":returns: runtime directory tied to the user, e.g. ``%USERPROFILE%\AppData\Local\Temp\$appauthor\$appname``""" - path = os.path.normpath(os.path.join(get_win_folder("CSIDL_LOCAL_APPDATA"), "Temp")) # noqa: PTH118 - return self._append_parts(path) - - @property - def site_runtime_dir(self) -> str: - """:returns: runtime directory shared by users, same as `user_runtime_dir`""" - return self.user_runtime_dir - - -def get_win_folder_from_env_vars(csidl_name: str) -> str: - """Get folder from environment variables.""" - result = get_win_folder_if_csidl_name_not_env_var(csidl_name) - if result is not None: - return result - - env_var_name = { - "CSIDL_APPDATA": "APPDATA", - "CSIDL_COMMON_APPDATA": "ALLUSERSPROFILE", - "CSIDL_LOCAL_APPDATA": "LOCALAPPDATA", - }.get(csidl_name) - if env_var_name is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - result = os.environ.get(env_var_name) - if result is None: - msg = f"Unset environment variable: {env_var_name}" - raise ValueError(msg) - return result - - -def get_win_folder_if_csidl_name_not_env_var(csidl_name: str) -> str | None: # noqa: PLR0911 - """Get a folder for a CSIDL name that does not exist as an environment variable.""" - if csidl_name == "CSIDL_PERSONAL": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Documents") # noqa: PTH118 - - if csidl_name == "CSIDL_DOWNLOADS": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Downloads") # noqa: PTH118 - - if csidl_name == "CSIDL_MYPICTURES": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Pictures") # noqa: PTH118 - - if csidl_name == "CSIDL_MYVIDEO": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Videos") # noqa: PTH118 - - if csidl_name == "CSIDL_MYMUSIC": - return os.path.join(os.path.normpath(os.environ["USERPROFILE"]), "Music") # noqa: PTH118 - - if csidl_name == "CSIDL_PROGRAMS": - return os.path.join( # noqa: PTH118 - os.path.normpath(os.environ["APPDATA"]), - "Microsoft", - "Windows", - "Start Menu", - "Programs", - ) - - if csidl_name == "CSIDL_COMMON_PROGRAMS": - return os.path.join( # noqa: PTH118 - os.path.normpath(os.environ.get("PROGRAMDATA", os.environ.get("ALLUSERSPROFILE", "C:\\ProgramData"))), - "Microsoft", - "Windows", - "Start Menu", - "Programs", - ) - return None - - -def get_win_folder_from_registry(csidl_name: str) -> str: - """Get folder from the registry. - - This is a fallback technique at best. I'm not sure if using the registry for these guarantees us the correct answer - for all CSIDL_* names. - - """ - machine_names = { - "CSIDL_COMMON_APPDATA", - "CSIDL_COMMON_PROGRAMS", - } - shell_folder_name = { - "CSIDL_APPDATA": "AppData", - "CSIDL_COMMON_APPDATA": "Common AppData", - "CSIDL_LOCAL_APPDATA": "Local AppData", - "CSIDL_PERSONAL": "Personal", - "CSIDL_DOWNLOADS": "{374DE290-123F-4565-9164-39C4925E467B}", - "CSIDL_MYPICTURES": "My Pictures", - "CSIDL_MYVIDEO": "My Video", - "CSIDL_MYMUSIC": "My Music", - "CSIDL_PROGRAMS": "Programs", - "CSIDL_COMMON_PROGRAMS": "Common Programs", - }.get(csidl_name) - if shell_folder_name is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - if sys.platform != "win32": # only needed for mypy type checker to know that this code runs only on Windows - raise NotImplementedError - import winreg # noqa: PLC0415 - - # Use HKEY_LOCAL_MACHINE for system-wide folders, HKEY_CURRENT_USER for user-specific folders - hkey = winreg.HKEY_LOCAL_MACHINE if csidl_name in machine_names else winreg.HKEY_CURRENT_USER - - key = winreg.OpenKey(hkey, r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders") - directory, _ = winreg.QueryValueEx(key, shell_folder_name) - return str(directory) - - -_KNOWN_FOLDER_GUIDS: dict[str, str] = { - "CSIDL_APPDATA": "{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}", - "CSIDL_COMMON_APPDATA": "{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}", - "CSIDL_LOCAL_APPDATA": "{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}", - "CSIDL_PERSONAL": "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}", - "CSIDL_MYPICTURES": "{33E28130-4E1E-4676-835A-98395C3BC3BB}", - "CSIDL_MYVIDEO": "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}", - "CSIDL_MYMUSIC": "{4BD8D571-6D19-48D3-BE97-422220080E43}", - "CSIDL_DOWNLOADS": "{374DE290-123F-4565-9164-39C4925E467B}", - "CSIDL_DESKTOPDIRECTORY": "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}", - "CSIDL_PROGRAMS": "{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}", - "CSIDL_COMMON_PROGRAMS": "{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}", -} - - -def get_win_folder_via_ctypes(csidl_name: str) -> str: - """Get folder via :func:`SHGetKnownFolderPath`. - - See https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath. - - """ - if sys.platform != "win32": # only needed for type checker to know that this code runs only on Windows - raise NotImplementedError - from ctypes import HRESULT, POINTER, Structure, WinDLL, byref, create_unicode_buffer, wintypes # noqa: PLC0415 - - class _GUID(Structure): - _fields_ = [ - ("Data1", wintypes.DWORD), - ("Data2", wintypes.WORD), - ("Data3", wintypes.WORD), - ("Data4", wintypes.BYTE * 8), - ] - - ole32 = WinDLL("ole32") - ole32.CLSIDFromString.restype = HRESULT - ole32.CLSIDFromString.argtypes = [wintypes.LPCOLESTR, POINTER(_GUID)] - ole32.CoTaskMemFree.restype = None - ole32.CoTaskMemFree.argtypes = [wintypes.LPVOID] - - shell32 = WinDLL("shell32") - shell32.SHGetKnownFolderPath.restype = HRESULT - shell32.SHGetKnownFolderPath.argtypes = [POINTER(_GUID), wintypes.DWORD, wintypes.HANDLE, POINTER(wintypes.LPWSTR)] - - kernel32 = WinDLL("kernel32") - kernel32.GetShortPathNameW.restype = wintypes.DWORD - kernel32.GetShortPathNameW.argtypes = [wintypes.LPWSTR, wintypes.LPWSTR, wintypes.DWORD] - - folder_guid = _KNOWN_FOLDER_GUIDS.get(csidl_name) - if folder_guid is None: - msg = f"Unknown CSIDL name: {csidl_name}" - raise ValueError(msg) - - guid = _GUID() - ole32.CLSIDFromString(folder_guid, byref(guid)) - - path_ptr = wintypes.LPWSTR() - shell32.SHGetKnownFolderPath(byref(guid), _KF_FLAG_DONT_VERIFY, None, byref(path_ptr)) - result = path_ptr.value - ole32.CoTaskMemFree(path_ptr) - - if result is None: - msg = f"SHGetKnownFolderPath returned NULL for {csidl_name}" - raise ValueError(msg) - - if any(ord(c) > 255 for c in result): # noqa: PLR2004 - buf = create_unicode_buffer(1024) - if kernel32.GetShortPathNameW(result, buf, 1024): - result = buf.value - - return result - - -def _pick_get_win_folder() -> Callable[[str], str]: - """Select the best method to resolve Windows folder paths: ctypes, then registry, then environment variables.""" - try: - import ctypes # noqa: PLC0415, F401 - except ImportError: - pass - else: - return get_win_folder_via_ctypes - try: - import winreg # noqa: PLC0415, F401 - except ImportError: - return get_win_folder_from_env_vars - else: - return get_win_folder_from_registry - - -_resolve_win_folder = _pick_get_win_folder() - - -def get_win_folder(csidl_name: str) -> str: - """Get a Windows folder path, checking for ``WIN_PD_OVERRIDE_*`` environment variable overrides first. - - For example, ``CSIDL_LOCAL_APPDATA`` can be overridden by setting ``WIN_PD_OVERRIDE_LOCAL_APPDATA``. - - """ - env_var = f"WIN_PD_OVERRIDE_{csidl_name.removeprefix('CSIDL_')}" - if override := os.environ.get(env_var, "").strip(): - return override - return _resolve_win_folder(csidl_name) - - -__all__ = [ - "Windows", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/LICENSE deleted file mode 100755 index 446a1a8..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2006-2022 by the respective authors (see AUTHORS file). -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. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py deleted file mode 100755 index 974f5bb..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__init__.py +++ /dev/null @@ -1,82 +0,0 @@ -""" - Pygments - ~~~~~~~~ - - Pygments is a syntax highlighting package written in Python. - - It is a generic syntax highlighter for general use in all kinds of software - such as forum systems, wikis or other applications that need to prettify - source code. Highlights are: - - * a wide range of common languages and markup formats is supported - * special attention is paid to details, increasing quality by a fair amount - * support for new languages and formats are added easily - * a number of output formats, presently HTML, LaTeX, RTF, SVG, all image - formats that PIL supports, and ANSI sequences - * it is usable as a command-line tool and as a library - * ... and it highlights even Brainfuck! - - The `Pygments master branch`_ is installable with ``easy_install Pygments==dev``. - - .. _Pygments master branch: - https://github.com/pygments/pygments/archive/master.zip#egg=Pygments-dev - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -from io import StringIO, BytesIO - -__version__ = '2.20.0' -__docformat__ = 'restructuredtext' - -__all__ = ['lex', 'format', 'highlight'] - - -def lex(code, lexer): - """ - Lex `code` with the `lexer` (must be a `Lexer` instance) - and return an iterable of tokens. Currently, this only calls - `lexer.get_tokens()`. - """ - try: - return lexer.get_tokens(code) - except TypeError: - # Heuristic to catch a common mistake. - from pip._vendor.pygments.lexer import RegexLexer - if isinstance(lexer, type) and issubclass(lexer, RegexLexer): - raise TypeError('lex() argument must be a lexer instance, ' - 'not a class') - raise - - -def format(tokens, formatter, outfile=None): # pylint: disable=redefined-builtin - """ - Format ``tokens`` (an iterable of tokens) with the formatter ``formatter`` - (a `Formatter` instance). - - If ``outfile`` is given and a valid file object (an object with a - ``write`` method), the result will be written to it, otherwise it - is returned as a string. - """ - try: - if not outfile: - realoutfile = getattr(formatter, 'encoding', None) and BytesIO() or StringIO() - formatter.format(tokens, realoutfile) - return realoutfile.getvalue() - else: - formatter.format(tokens, outfile) - except TypeError: - # Heuristic to catch a common mistake. - from pip._vendor.pygments.formatter import Formatter - if isinstance(formatter, type) and issubclass(formatter, Formatter): - raise TypeError('format() argument must be a formatter instance, ' - 'not a class') - raise - - -def highlight(code, lexer, formatter, outfile=None): - """ - This is the most high-level highlighting function. It combines `lex` and - `format` in one function. - """ - return format(lex(code, lexer), formatter, outfile) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py deleted file mode 100755 index bdafd1a..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__main__.py +++ /dev/null @@ -1,17 +0,0 @@ -""" - pygments.__main__ - ~~~~~~~~~~~~~~~~~ - - Main entry point for ``python -m pygments``. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import sys -from pip._vendor.pygments.cmdline import main - -try: - sys.exit(main(sys.argv)) -except KeyboardInterrupt: - sys.exit(1) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 84a55cd10e9f73b9e054de9c12918d982e72287f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3832 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc deleted file mode 100755 index ae7f2728793d13d4734a9b0d0963e4ab6fd7657e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4981 zcmb7I&2JmW6`$pYNPStBZ7E9PBm+6AtX85D2ToHaaS_Y;gslXXatL!+E_a9I+RI&L zcGrpoHP9gk9efCi6b1qW6^g=1kc$sJgoekE?d`qt`eYwNGk z)Z7w*VLO=i2U^kEq83fGM4&f3&(XbZfcI&7_k%4*=#4GiH98_1eLY>DsU?=6A2M23vW&wak~+;c0w z9f;+wVcsxW!e8my-4z{TmM0+;@8n9hJ(ccOG^snDcO&e^=8zMZ?=)_I0mUx+zBK*m zGhduOEIn~ldZNd);`#5V`2Nh{)WXr!!a;fAc>Lt<)%y@-CKc(G+U5SssJYDq10-23 zXKA&(m8%t6tX9N5V&!Wks{k;TtxIKo$iVGz{N1(_xc!)$0n~ z_1H>8Gq5|h5)MgoguYl(8a1$Iw8La>IJUvpm53iUlrpkl&t02ip2xecl4g+VtApwT?Z&vVN& zm5r9TT@mq6v@8Rd>2w_tV0FT2E}NbUZgQbh+JPWv`*;<;yAUXxW;z-!6mK>GP{nIL zIH0eEKd|bi;rL=PT|r<6ju=?NTTPxWi(@M69L!5AQi6Cgg49i5aAmQ;%akw;g$UIl zReE6Rg@tTh;hG+K#_-fF8~n4xJE0GL$9}pzl~d49*1u^3LJyif_IEY=d#;TM2qB5% zV=m>%jV-dTf{D*?(*Tx z>e0;VUg6f*_hK7|+ZOR~v*0x(i}4amwF1&CyLP*I{Ikmp%3mr4J!?5(TGDT_7Y(y8;yWqhR9}+bjM*A(G49MzW6Yt$~N+J zhjMjJ5>}Jz&fuZuc)VCK8ZTu zQ_F6~r+}7lMZ6RQ4J#WAKGl!Jmgpk6C56w&>`s}q1ti+r6!(Q`U|=GC%5M-}6mxQ~ z?-t4sUZ+Fu=DUDkVyojkQC6&}ruzR^VVt)O@d54UkpxsKoXlIL?Q7?8c5L3mJVm`p8=+&I2= za>H%E&+V}Nf$>r~hR^|7jNU($l0$6&D+9sLydj2!A~=;E03_1Gv4D0et^hrnq7Ezo zROA$cn4)-(yaK{0v@8zN^}&ji?5PIC_$0jZI>?P;etiJrnaxxFRgj~6PkIh-dz)N* zWSD^yV>{82&KMA(6OFL?8~y_sWw8+R;t1tDrXP*O=d|c#tfC&eiiU-?n2&KWKCsTH zl&I*_P)I~$1|5m}ZlBDwO^)>vQvMYbK*k9+aq`wHJ(e5&?Y-HHe{6o%*}w9aYlpKJ zj%F|1eeP)X;@#Ha?4_gGOM7n|Po4h9)YIQhJ-z?I-G#%c>d{p7pj?eXm4O4J{)FG? z^eZWj$|q2O@bjkQM+J3Ap>COD=KJFG0{`lQU_R7sDQSEs@?3<%PkbkJx0Zb2D|TG>6O{k^zIwI zF*bdA_bt55Ji2?WS2$68s>iZ|PZm%0*l_XWSn;JE%ZjsF@iZOSe_F&w8I>!f+B}Nr zQT$0zN&Y0jKLW|$Jz-!wDo#g_Kd@az4PX6R5y5KUMp%vhJ&4ykY=a-mFUJPIBwv6C z!NLC&MK7;uS}#}D3Oz=}8K#}soutn_cHv<7d(3`wF#NqYKD)QPTk4JEwdo$qiix(S SVbu>V|E=o(^N?0$oc{rOY*VNJ diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc deleted file mode 100755 index ac1c2021b68515f3e0c43e8d2781021ebfa72d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42459 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc deleted file mode 100755 index 8cf2aeacb13144943f29e317c3bdeb0f0fa48219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 zcmZ`(&1)M+6rb7E$66n@>(t*445coX+eo(44=NHH$1$`aD8))kQR0e~b|kH{+TF~q zok++<2NzW15+4e2d(z2GaQ_&)h*n)N1WFISskn!dOZ#SJDRDyIGQXL5@6CHN?_+-o zhXV-c*YAH^Yl#T`!8aZ9oGngQVDT6!D1{WP2pUddMa<)rARvm@;8dFw59~T;(7u4s z0gN`Kyoz@VrF@E{__uJ%uLwyL=_&snAV6j*U!=NiMT>?)HC3lB_v=?F;IbEqr4~(% zl8!PlWoA)ErZTcc6=LXMuOo{@+lS&=!z?j1U$En3sk0<=GczAvG8whNImwiWU7+N% zv%3(R%EkAHMJZYQ{PrieR+3TIeOyzsRJUlHTuWYW%WrqtZ3kb zzdPZKSEI`wGj4>HT(J>J=lJ*d;i<=PWez8ZHd5iC8ux{op=GVFGq+o+_)nM z#AAqR9T>0EKClkD>`kE}C=l-;QiL+}sDi%{N4wJNXmxl~w7b2BP(?f+{Y_8B!(e0u z3|ZJ2vH2~|sDh!7@jjeB=vn}aGn?Lu*Y)$#?Sc`D&80OIcLaK>6UXcE9-8{wHv~1pH8AIBI^oa)Lv)$i&|H6(A|`%7U-_)O1mLX{sm(Eafyh> z30S74+B~6_n^DKhWIazEQKNdq=ZN6T=_$$&)2@o+ZBHIPIU@LTuxk0h7XK{~!h*15 zJVY)`z`}Y8P(>{Xh5H{Rwi8F8iAHFmy4>s^+|BGo_QvXqKTOm!heK11{zwan-eDJN zp5xxP>$i`3ryIS~HL)4&g@WlBZeAFw-QXY8P|xt6;ep+c_cHajj>40T@MH^lyyGs^ za5EVC&f5KeSKRh|ZT@&*>dD}f`#+By4a_wL=4wmLz5y^89&Zkh?FRVw&$D1(?R^%8 z+eR?!<&)(2(`m)Xrqhl94G0@q(_rJz8buR+QI7wM<&|ruF-i$K#4cDWdgwcF>VPG_OuX(HxUk0d-(S(IC&U&r|NI{P~T`Rv$F>A81ul+ hCvBzv@{4_M{EYyr!B$Ab&_-Pd_2K>&`X6v_^dGq^sG diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc deleted file mode 100755 index de21d85f7902fe03da050e083cbcc5db4bdeca5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2937 zcmds3-%le&9G~4%TFTFIN98oi8Z~DTTJRE+>v<%|j~t3{q4gp)cg?apZ5Ow@o0$bE z0gneBkdT}YMlSc_J#iuUPxv3SNi}4XOH7Q3zSZz{Pkv{%UD`@8#uwvs_q#LS`RsRQ zKHnePXWiW)1nsA9o~-T#5c-7;>P@V5&a%)sL@G)nRZvA;NDJ`v>0-f`_6bOBOSh^1 zv|nvcx2u7401K{i7jigwFCz_K9; znpMmduwm1frLW~QgX_L*ZXvF`TLVfiP|^$=ldP=Zm^-iI4NPj2G?8$XY=zIfB{+oM z=jPZ<(Oe_$Yqxp7V5)06PAr3Zo>_BkWKB|#ZCLDb;~uPK0Z%Wvi+E$c&TQSdx2bpx zZ`gl><={!mHZ3W#AyJG+yn%|dnt>&-f(@#f29;n*$6Bvd6n2 z*LFfNts>EKc{?FZ)w|NWV`J})S_D%FGHIpAdGJEX#&ThVu_sM_lDf0Fl#Fp^61t`U zcQ_$^keqhs=jWzo7LqfZN)_9(rqfvHcNXspQNif~}q2lv^xAP$k;FxQ-V+k(w-wYCLGd<406QcrV4B3r^!Z&b&z z=N9^2JOaBXp6w(8Y=gCP^cKpYX1kEqz6Gb9VjU|saN^GqbIppj5%#_l$jcOxh!8&; z`EuBficW|_GKO5hPCM^Y%62A6FYd+jW&y_wGEvO5IgAC z?rUE?IC!u#`#jLIxBm4;IUrR6QWXXK!_{`w7kRY3zx_0^w_WayReEEkV5}Ns+RgpV z$HPxo%DvG_Z?qJQo`Er>Fi~%ehd1CpQ$c)$gcdK_4L)i1!Zf-+xDDR9*lW$+zlRP5 z0UcaZQ4$>s3sE0Go)ey*`E+I}GqaFdTF%^EoLfjaZMrF|$AS~$WVoTr950bhkWN1o z5jEoymvIXxxe60E;ii)yeuLi*dLFs{}o*3NIeB;N6$26}# zFM{v8|HUTAoA4@2GRpp3Li`ItReW7&t0E?*1tf$^sL#Dl(L1H)>*uR)l~DL}aI}O5 xPTl^%^%ClbLN0dh4pqetVYrGw{NY1lxULu!1t?>l2#Es3nkOzFdN_WVKLHA#%0mDE diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc deleted file mode 100755 index 64fb8d545f8f5034cf9e3c6fe5b6571a1579ea9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5465 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 AmjD0& diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc deleted file mode 100755 index f45a015e978292a0d41c26bef8a299a7ed970864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4886 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 OG`#~9lU0Ds{{I0WMYmM| diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc deleted file mode 100755 index d5b864979687a107fdf6ec1253e35e2fe69af6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7469 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 N9IO8Dih4GV{}+xCJsto6 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc deleted file mode 100755 index 92c9f9078ef301d3e17c531902421db23232fb4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7504 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc deleted file mode 100755 index 85c8db9e2c16c37f35e72c049af77d919aeab7af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15804 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 z 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 in Isabelle or - ``\\longrightarrow`` in LaTeX. - - This is mostly useful for HTML or console output when you want to - approximate the source rendering you'd see in an IDE. - - Options accepted: - - `lang` : string - The symbol language. Must be one of ``'isabelle'`` or - ``'latex'``. The default is ``'isabelle'``. - """ - - latex_symbols = { - '\\alpha' : '\U000003b1', - '\\beta' : '\U000003b2', - '\\gamma' : '\U000003b3', - '\\delta' : '\U000003b4', - '\\varepsilon' : '\U000003b5', - '\\zeta' : '\U000003b6', - '\\eta' : '\U000003b7', - '\\vartheta' : '\U000003b8', - '\\iota' : '\U000003b9', - '\\kappa' : '\U000003ba', - '\\lambda' : '\U000003bb', - '\\mu' : '\U000003bc', - '\\nu' : '\U000003bd', - '\\xi' : '\U000003be', - '\\pi' : '\U000003c0', - '\\varrho' : '\U000003c1', - '\\sigma' : '\U000003c3', - '\\tau' : '\U000003c4', - '\\upsilon' : '\U000003c5', - '\\varphi' : '\U000003c6', - '\\chi' : '\U000003c7', - '\\psi' : '\U000003c8', - '\\omega' : '\U000003c9', - '\\Gamma' : '\U00000393', - '\\Delta' : '\U00000394', - '\\Theta' : '\U00000398', - '\\Lambda' : '\U0000039b', - '\\Xi' : '\U0000039e', - '\\Pi' : '\U000003a0', - '\\Sigma' : '\U000003a3', - '\\Upsilon' : '\U000003a5', - '\\Phi' : '\U000003a6', - '\\Psi' : '\U000003a8', - '\\Omega' : '\U000003a9', - '\\leftarrow' : '\U00002190', - '\\longleftarrow' : '\U000027f5', - '\\rightarrow' : '\U00002192', - '\\longrightarrow' : '\U000027f6', - '\\Leftarrow' : '\U000021d0', - '\\Longleftarrow' : '\U000027f8', - '\\Rightarrow' : '\U000021d2', - '\\Longrightarrow' : '\U000027f9', - '\\leftrightarrow' : '\U00002194', - '\\longleftrightarrow' : '\U000027f7', - '\\Leftrightarrow' : '\U000021d4', - '\\Longleftrightarrow' : '\U000027fa', - '\\mapsto' : '\U000021a6', - '\\longmapsto' : '\U000027fc', - '\\relbar' : '\U00002500', - '\\Relbar' : '\U00002550', - '\\hookleftarrow' : '\U000021a9', - '\\hookrightarrow' : '\U000021aa', - '\\leftharpoondown' : '\U000021bd', - '\\rightharpoondown' : '\U000021c1', - '\\leftharpoonup' : '\U000021bc', - '\\rightharpoonup' : '\U000021c0', - '\\rightleftharpoons' : '\U000021cc', - '\\leadsto' : '\U0000219d', - '\\downharpoonleft' : '\U000021c3', - '\\downharpoonright' : '\U000021c2', - '\\upharpoonleft' : '\U000021bf', - '\\upharpoonright' : '\U000021be', - '\\restriction' : '\U000021be', - '\\uparrow' : '\U00002191', - '\\Uparrow' : '\U000021d1', - '\\downarrow' : '\U00002193', - '\\Downarrow' : '\U000021d3', - '\\updownarrow' : '\U00002195', - '\\Updownarrow' : '\U000021d5', - '\\langle' : '\U000027e8', - '\\rangle' : '\U000027e9', - '\\lceil' : '\U00002308', - '\\rceil' : '\U00002309', - '\\lfloor' : '\U0000230a', - '\\rfloor' : '\U0000230b', - '\\flqq' : '\U000000ab', - '\\frqq' : '\U000000bb', - '\\bot' : '\U000022a5', - '\\top' : '\U000022a4', - '\\wedge' : '\U00002227', - '\\bigwedge' : '\U000022c0', - '\\vee' : '\U00002228', - '\\bigvee' : '\U000022c1', - '\\forall' : '\U00002200', - '\\exists' : '\U00002203', - '\\nexists' : '\U00002204', - '\\neg' : '\U000000ac', - '\\Box' : '\U000025a1', - '\\Diamond' : '\U000025c7', - '\\vdash' : '\U000022a2', - '\\models' : '\U000022a8', - '\\dashv' : '\U000022a3', - '\\surd' : '\U0000221a', - '\\le' : '\U00002264', - '\\ge' : '\U00002265', - '\\ll' : '\U0000226a', - '\\gg' : '\U0000226b', - '\\lesssim' : '\U00002272', - '\\gtrsim' : '\U00002273', - '\\lessapprox' : '\U00002a85', - '\\gtrapprox' : '\U00002a86', - '\\in' : '\U00002208', - '\\notin' : '\U00002209', - '\\subset' : '\U00002282', - '\\supset' : '\U00002283', - '\\subseteq' : '\U00002286', - '\\supseteq' : '\U00002287', - '\\sqsubset' : '\U0000228f', - '\\sqsupset' : '\U00002290', - '\\sqsubseteq' : '\U00002291', - '\\sqsupseteq' : '\U00002292', - '\\cap' : '\U00002229', - '\\bigcap' : '\U000022c2', - '\\cup' : '\U0000222a', - '\\bigcup' : '\U000022c3', - '\\sqcup' : '\U00002294', - '\\bigsqcup' : '\U00002a06', - '\\sqcap' : '\U00002293', - '\\Bigsqcap' : '\U00002a05', - '\\setminus' : '\U00002216', - '\\propto' : '\U0000221d', - '\\uplus' : '\U0000228e', - '\\bigplus' : '\U00002a04', - '\\sim' : '\U0000223c', - '\\doteq' : '\U00002250', - '\\simeq' : '\U00002243', - '\\approx' : '\U00002248', - '\\asymp' : '\U0000224d', - '\\cong' : '\U00002245', - '\\equiv' : '\U00002261', - '\\Join' : '\U000022c8', - '\\bowtie' : '\U00002a1d', - '\\prec' : '\U0000227a', - '\\succ' : '\U0000227b', - '\\preceq' : '\U0000227c', - '\\succeq' : '\U0000227d', - '\\parallel' : '\U00002225', - '\\mid' : '\U000000a6', - '\\pm' : '\U000000b1', - '\\mp' : '\U00002213', - '\\times' : '\U000000d7', - '\\div' : '\U000000f7', - '\\cdot' : '\U000022c5', - '\\star' : '\U000022c6', - '\\circ' : '\U00002218', - '\\dagger' : '\U00002020', - '\\ddagger' : '\U00002021', - '\\lhd' : '\U000022b2', - '\\rhd' : '\U000022b3', - '\\unlhd' : '\U000022b4', - '\\unrhd' : '\U000022b5', - '\\triangleleft' : '\U000025c3', - '\\triangleright' : '\U000025b9', - '\\triangle' : '\U000025b3', - '\\triangleq' : '\U0000225c', - '\\oplus' : '\U00002295', - '\\bigoplus' : '\U00002a01', - '\\otimes' : '\U00002297', - '\\bigotimes' : '\U00002a02', - '\\odot' : '\U00002299', - '\\bigodot' : '\U00002a00', - '\\ominus' : '\U00002296', - '\\oslash' : '\U00002298', - '\\dots' : '\U00002026', - '\\cdots' : '\U000022ef', - '\\sum' : '\U00002211', - '\\prod' : '\U0000220f', - '\\coprod' : '\U00002210', - '\\infty' : '\U0000221e', - '\\int' : '\U0000222b', - '\\oint' : '\U0000222e', - '\\clubsuit' : '\U00002663', - '\\diamondsuit' : '\U00002662', - '\\heartsuit' : '\U00002661', - '\\spadesuit' : '\U00002660', - '\\aleph' : '\U00002135', - '\\emptyset' : '\U00002205', - '\\nabla' : '\U00002207', - '\\partial' : '\U00002202', - '\\flat' : '\U0000266d', - '\\natural' : '\U0000266e', - '\\sharp' : '\U0000266f', - '\\angle' : '\U00002220', - '\\copyright' : '\U000000a9', - '\\textregistered' : '\U000000ae', - '\\textonequarter' : '\U000000bc', - '\\textonehalf' : '\U000000bd', - '\\textthreequarters' : '\U000000be', - '\\textordfeminine' : '\U000000aa', - '\\textordmasculine' : '\U000000ba', - '\\euro' : '\U000020ac', - '\\pounds' : '\U000000a3', - '\\yen' : '\U000000a5', - '\\textcent' : '\U000000a2', - '\\textcurrency' : '\U000000a4', - '\\textdegree' : '\U000000b0', - } - - isabelle_symbols = { - '\\' : '\U0001d7ec', - '\\' : '\U0001d7ed', - '\\' : '\U0001d7ee', - '\\' : '\U0001d7ef', - '\\' : '\U0001d7f0', - '\\' : '\U0001d7f1', - '\\' : '\U0001d7f2', - '\\' : '\U0001d7f3', - '\\' : '\U0001d7f4', - '\\' : '\U0001d7f5', - '\\' : '\U0001d49c', - '\\' : '\U0000212c', - '\\' : '\U0001d49e', - '\\' : '\U0001d49f', - '\\' : '\U00002130', - '\\' : '\U00002131', - '\\' : '\U0001d4a2', - '\\' : '\U0000210b', - '\\' : '\U00002110', - '\\' : '\U0001d4a5', - '\\' : '\U0001d4a6', - '\\' : '\U00002112', - '\\' : '\U00002133', - '\\' : '\U0001d4a9', - '\\' : '\U0001d4aa', - '\\

' : '\U0001d5c9', - '\\' : '\U0001d5ca', - '\\' : '\U0001d5cb', - '\\' : '\U0001d5cc', - '\\' : '\U0001d5cd', - '\\' : '\U0001d5ce', - '\\' : '\U0001d5cf', - '\\' : '\U0001d5d0', - '\\' : '\U0001d5d1', - '\\' : '\U0001d5d2', - '\\' : '\U0001d5d3', - '\\' : '\U0001d504', - '\\' : '\U0001d505', - '\\' : '\U0000212d', - '\\

' : '\U0001d507', - '\\' : '\U0001d508', - '\\' : '\U0001d509', - '\\' : '\U0001d50a', - '\\' : '\U0000210c', - '\\' : '\U00002111', - '\\' : '\U0001d50d', - '\\' : '\U0001d50e', - '\\' : '\U0001d50f', - '\\' : '\U0001d510', - '\\' : '\U0001d511', - '\\' : '\U0001d512', - '\\' : '\U0001d513', - '\\' : '\U0001d514', - '\\' : '\U0000211c', - '\\' : '\U0001d516', - '\\' : '\U0001d517', - '\\' : '\U0001d518', - '\\' : '\U0001d519', - '\\' : '\U0001d51a', - '\\' : '\U0001d51b', - '\\' : '\U0001d51c', - '\\' : '\U00002128', - '\\' : '\U0001d51e', - '\\' : '\U0001d51f', - '\\' : '\U0001d520', - '\\
' : '\U0001d521', - '\\' : '\U0001d522', - '\\' : '\U0001d523', - '\\' : '\U0001d524', - '\\' : '\U0001d525', - '\\' : '\U0001d526', - '\\' : '\U0001d527', - '\\' : '\U0001d528', - '\\' : '\U0001d529', - '\\' : '\U0001d52a', - '\\' : '\U0001d52b', - '\\' : '\U0001d52c', - '\\' : '\U0001d52d', - '\\' : '\U0001d52e', - '\\' : '\U0001d52f', - '\\' : '\U0001d530', - '\\' : '\U0001d531', - '\\' : '\U0001d532', - '\\' : '\U0001d533', - '\\' : '\U0001d534', - '\\' : '\U0001d535', - '\\' : '\U0001d536', - '\\' : '\U0001d537', - '\\' : '\U000003b1', - '\\' : '\U000003b2', - '\\' : '\U000003b3', - '\\' : '\U000003b4', - '\\' : '\U000003b5', - '\\' : '\U000003b6', - '\\' : '\U000003b7', - '\\' : '\U000003b8', - '\\' : '\U000003b9', - '\\' : '\U000003ba', - '\\' : '\U000003bb', - '\\' : '\U000003bc', - '\\' : '\U000003bd', - '\\' : '\U000003be', - '\\' : '\U000003c0', - '\\' : '\U000003c1', - '\\' : '\U000003c3', - '\\' : '\U000003c4', - '\\' : '\U000003c5', - '\\' : '\U000003c6', - '\\' : '\U000003c7', - '\\' : '\U000003c8', - '\\' : '\U000003c9', - '\\' : '\U00000393', - '\\' : '\U00000394', - '\\' : '\U00000398', - '\\' : '\U0000039b', - '\\' : '\U0000039e', - '\\' : '\U000003a0', - '\\' : '\U000003a3', - '\\' : '\U000003a5', - '\\' : '\U000003a6', - '\\' : '\U000003a8', - '\\' : '\U000003a9', - '\\' : '\U0001d539', - '\\' : '\U00002102', - '\\' : '\U00002115', - '\\' : '\U0000211a', - '\\' : '\U0000211d', - '\\' : '\U00002124', - '\\' : '\U00002190', - '\\' : '\U000027f5', - '\\' : '\U00002192', - '\\' : '\U000027f6', - '\\' : '\U000021d0', - '\\' : '\U000027f8', - '\\' : '\U000021d2', - '\\' : '\U000027f9', - '\\' : '\U00002194', - '\\' : '\U000027f7', - '\\' : '\U000021d4', - '\\' : '\U000027fa', - '\\' : '\U000021a6', - '\\' : '\U000027fc', - '\\' : '\U00002500', - '\\' : '\U00002550', - '\\' : '\U000021a9', - '\\' : '\U000021aa', - '\\' : '\U000021bd', - '\\' : '\U000021c1', - '\\' : '\U000021bc', - '\\' : '\U000021c0', - '\\' : '\U000021cc', - '\\' : '\U0000219d', - '\\' : '\U000021c3', - '\\' : '\U000021c2', - '\\' : '\U000021bf', - '\\' : '\U000021be', - '\\' : '\U000021be', - '\\' : '\U00002237', - '\\' : '\U00002191', - '\\' : '\U000021d1', - '\\' : '\U00002193', - '\\' : '\U000021d3', - '\\' : '\U00002195', - '\\' : '\U000021d5', - '\\' : '\U000027e8', - '\\' : '\U000027e9', - '\\' : '\U00002308', - '\\' : '\U00002309', - '\\' : '\U0000230a', - '\\' : '\U0000230b', - '\\' : '\U00002987', - '\\' : '\U00002988', - '\\' : '\U000027e6', - '\\' : '\U000027e7', - '\\' : '\U00002983', - '\\' : '\U00002984', - '\\' : '\U000000ab', - '\\' : '\U000000bb', - '\\' : '\U000022a5', - '\\' : '\U000022a4', - '\\' : '\U00002227', - '\\' : '\U000022c0', - '\\' : '\U00002228', - '\\' : '\U000022c1', - '\\' : '\U00002200', - '\\' : '\U00002203', - '\\' : '\U00002204', - '\\' : '\U000000ac', - '\\' : '\U000025a1', - '\\' : '\U000025c7', - '\\' : '\U000022a2', - '\\' : '\U000022a8', - '\\' : '\U000022a9', - '\\' : '\U000022ab', - '\\' : '\U000022a3', - '\\' : '\U0000221a', - '\\' : '\U00002264', - '\\' : '\U00002265', - '\\' : '\U0000226a', - '\\' : '\U0000226b', - '\\' : '\U00002272', - '\\' : '\U00002273', - '\\' : '\U00002a85', - '\\' : '\U00002a86', - '\\' : '\U00002208', - '\\' : '\U00002209', - '\\' : '\U00002282', - '\\' : '\U00002283', - '\\' : '\U00002286', - '\\' : '\U00002287', - '\\' : '\U0000228f', - '\\' : '\U00002290', - '\\' : '\U00002291', - '\\' : '\U00002292', - '\\' : '\U00002229', - '\\' : '\U000022c2', - '\\' : '\U0000222a', - '\\' : '\U000022c3', - '\\' : '\U00002294', - '\\' : '\U00002a06', - '\\' : '\U00002293', - '\\' : '\U00002a05', - '\\' : '\U00002216', - '\\' : '\U0000221d', - '\\' : '\U0000228e', - '\\' : '\U00002a04', - '\\' : '\U00002260', - '\\' : '\U0000223c', - '\\' : '\U00002250', - '\\' : '\U00002243', - '\\' : '\U00002248', - '\\' : '\U0000224d', - '\\' : '\U00002245', - '\\' : '\U00002323', - '\\' : '\U00002261', - '\\' : '\U00002322', - '\\' : '\U000022c8', - '\\' : '\U00002a1d', - '\\' : '\U0000227a', - '\\' : '\U0000227b', - '\\' : '\U0000227c', - '\\' : '\U0000227d', - '\\' : '\U00002225', - '\\' : '\U000000a6', - '\\' : '\U000000b1', - '\\' : '\U00002213', - '\\' : '\U000000d7', - '\\
' : '\U000000f7', - '\\' : '\U000022c5', - '\\' : '\U000022c6', - '\\' : '\U00002219', - '\\' : '\U00002218', - '\\' : '\U00002020', - '\\' : '\U00002021', - '\\' : '\U000022b2', - '\\' : '\U000022b3', - '\\' : '\U000022b4', - '\\' : '\U000022b5', - '\\' : '\U000025c3', - '\\' : '\U000025b9', - '\\' : '\U000025b3', - '\\' : '\U0000225c', - '\\' : '\U00002295', - '\\' : '\U00002a01', - '\\' : '\U00002297', - '\\' : '\U00002a02', - '\\' : '\U00002299', - '\\' : '\U00002a00', - '\\' : '\U00002296', - '\\' : '\U00002298', - '\\' : '\U00002026', - '\\' : '\U000022ef', - '\\' : '\U00002211', - '\\' : '\U0000220f', - '\\' : '\U00002210', - '\\' : '\U0000221e', - '\\' : '\U0000222b', - '\\' : '\U0000222e', - '\\' : '\U00002663', - '\\' : '\U00002662', - '\\' : '\U00002661', - '\\' : '\U00002660', - '\\' : '\U00002135', - '\\' : '\U00002205', - '\\' : '\U00002207', - '\\' : '\U00002202', - '\\' : '\U0000266d', - '\\' : '\U0000266e', - '\\' : '\U0000266f', - '\\' : '\U00002220', - '\\' : '\U000000a9', - '\\' : '\U000000ae', - '\\' : '\U000000ad', - '\\' : '\U000000af', - '\\' : '\U000000bc', - '\\' : '\U000000bd', - '\\' : '\U000000be', - '\\' : '\U000000aa', - '\\' : '\U000000ba', - '\\
' : '\U000000a7', - '\\' : '\U000000b6', - '\\' : '\U000000a1', - '\\' : '\U000000bf', - '\\' : '\U000020ac', - '\\' : '\U000000a3', - '\\' : '\U000000a5', - '\\' : '\U000000a2', - '\\' : '\U000000a4', - '\\' : '\U000000b0', - '\\' : '\U00002a3f', - '\\' : '\U00002127', - '\\' : '\U000025ca', - '\\' : '\U00002118', - '\\' : '\U00002240', - '\\' : '\U000022c4', - '\\' : '\U000000b4', - '\\' : '\U00000131', - '\\' : '\U000000a8', - '\\' : '\U000000b8', - '\\' : '\U000002dd', - '\\' : '\U000003f5', - '\\' : '\U000023ce', - '\\' : '\U00002039', - '\\' : '\U0000203a', - '\\' : '\U00002302', - '\\<^sub>' : '\U000021e9', - '\\<^sup>' : '\U000021e7', - '\\<^bold>' : '\U00002759', - '\\<^bsub>' : '\U000021d8', - '\\<^esub>' : '\U000021d9', - '\\<^bsup>' : '\U000021d7', - '\\<^esup>' : '\U000021d6', - } - - lang_map = {'isabelle' : isabelle_symbols, 'latex' : latex_symbols} - - def __init__(self, **options): - Filter.__init__(self, **options) - lang = get_choice_opt(options, 'lang', - ['isabelle', 'latex'], 'isabelle') - self.symbols = self.lang_map[lang] - - def filter(self, lexer, stream): - for ttype, value in stream: - if value in self.symbols: - yield ttype, self.symbols[value] - else: - yield ttype, value - - -class KeywordCaseFilter(Filter): - """Convert keywords to lowercase or uppercase or capitalize them. - - This means first letter uppercase, rest lowercase. - - This can be useful e.g. if you highlight Pascal code and want to adapt the - code to your styleguide. - - Options accepted: - - `case` : string - The casing to convert keywords to. Must be one of ``'lower'``, - ``'upper'`` or ``'capitalize'``. The default is ``'lower'``. - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - case = get_choice_opt(options, 'case', - ['lower', 'upper', 'capitalize'], 'lower') - self.convert = getattr(str, case) - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype in Keyword: - yield ttype, self.convert(value) - else: - yield ttype, value - - -class NameHighlightFilter(Filter): - """Highlight a normal Name (and Name.*) token with a different token type. - - Example:: - - filter = NameHighlightFilter( - names=['foo', 'bar', 'baz'], - tokentype=Name.Function, - ) - - This would highlight the names "foo", "bar" and "baz" - as functions. `Name.Function` is the default token type. - - Options accepted: - - `names` : list of strings - A list of names that should be given the different token type. - There is no default. - `tokentype` : TokenType or string - A token type or a string containing a token type name that is - used for highlighting the strings in `names`. The default is - `Name.Function`. - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - self.names = set(get_list_opt(options, 'names', [])) - tokentype = options.get('tokentype') - if tokentype: - self.tokentype = string_to_tokentype(tokentype) - else: - self.tokentype = Name.Function - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype in Name and value in self.names: - yield self.tokentype, value - else: - yield ttype, value - - -class ErrorToken(Exception): - pass - - -class RaiseOnErrorTokenFilter(Filter): - """Raise an exception when the lexer generates an error token. - - Options accepted: - - `excclass` : Exception class - The exception class to raise. - The default is `pygments.filters.ErrorToken`. - - .. versionadded:: 0.8 - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - self.exception = options.get('excclass', ErrorToken) - try: - # issubclass() will raise TypeError if first argument is not a class - if not issubclass(self.exception, Exception): - raise TypeError - except TypeError: - raise OptionError('excclass option is not an exception class') - - def filter(self, lexer, stream): - for ttype, value in stream: - if ttype is Error: - raise self.exception(value) - yield ttype, value - - -class VisibleWhitespaceFilter(Filter): - """Convert tabs, newlines and/or spaces to visible characters. - - Options accepted: - - `spaces` : string or bool - If this is a one-character string, spaces will be replaces by this string. - If it is another true value, spaces will be replaced by ``·`` (unicode - MIDDLE DOT). If it is a false value, spaces will not be replaced. The - default is ``False``. - `tabs` : string or bool - The same as for `spaces`, but the default replacement character is ``»`` - (unicode RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK). The default value - is ``False``. Note: this will not work if the `tabsize` option for the - lexer is nonzero, as tabs will already have been expanded then. - `tabsize` : int - If tabs are to be replaced by this filter (see the `tabs` option), this - is the total number of characters that a tab should be expanded to. - The default is ``8``. - `newlines` : string or bool - The same as for `spaces`, but the default replacement character is ``¶`` - (unicode PILCROW SIGN). The default value is ``False``. - `wstokentype` : bool - If true, give whitespace the special `Whitespace` token type. This allows - styling the visible whitespace differently (e.g. greyed out), but it can - disrupt background colors. The default is ``True``. - - .. versionadded:: 0.8 - """ - - def __init__(self, **options): - Filter.__init__(self, **options) - for name, default in [('spaces', '·'), - ('tabs', '»'), - ('newlines', '¶')]: - opt = options.get(name, False) - if isinstance(opt, str) and len(opt) == 1: - setattr(self, name, opt) - else: - setattr(self, name, (opt and default or '')) - tabsize = get_int_opt(options, 'tabsize', 8) - if self.tabs: - self.tabs += ' ' * (tabsize - 1) - if self.newlines: - self.newlines += '\n' - self.wstt = get_bool_opt(options, 'wstokentype', True) - - def filter(self, lexer, stream): - if self.wstt: - spaces = self.spaces or ' ' - tabs = self.tabs or '\t' - newlines = self.newlines or '\n' - regex = re.compile(r'\s') - - def replacefunc(wschar): - if wschar == ' ': - return spaces - elif wschar == '\t': - return tabs - elif wschar == '\n': - return newlines - return wschar - - for ttype, value in stream: - yield from _replace_special(ttype, value, regex, Whitespace, - replacefunc) - else: - spaces, tabs, newlines = self.spaces, self.tabs, self.newlines - # simpler processing - for ttype, value in stream: - if spaces: - value = value.replace(' ', spaces) - if tabs: - value = value.replace('\t', tabs) - if newlines: - value = value.replace('\n', newlines) - yield ttype, value - - -class GobbleFilter(Filter): - """Gobble source code lines (eats initial characters). - - This filter drops the first ``n`` characters off every line of code. This - may be useful when the source code fed to the lexer is indented by a fixed - amount of space that isn't desired in the output. - - Options accepted: - - `n` : int - The number of characters to gobble. - - .. versionadded:: 1.2 - """ - def __init__(self, **options): - Filter.__init__(self, **options) - self.n = get_int_opt(options, 'n', 0) - - def gobble(self, value, left): - if left < len(value): - return value[left:], 0 - else: - return '', left - len(value) - - def filter(self, lexer, stream): - n = self.n - left = n # How many characters left to gobble. - for ttype, value in stream: - # Remove ``left`` tokens from first line, ``n`` from all others. - parts = value.split('\n') - (parts[0], left) = self.gobble(parts[0], left) - for i in range(1, len(parts)): - (parts[i], left) = self.gobble(parts[i], n) - value = '\n'.join(parts) - - if value != '': - yield ttype, value - - -class TokenMergeFilter(Filter): - """Merge consecutive tokens with the same token type in the output stream. - - .. versionadded:: 1.2 - """ - def __init__(self, **options): - Filter.__init__(self, **options) - - def filter(self, lexer, stream): - current_type = None - current_value = None - for ttype, value in stream: - if ttype is current_type: - current_value += value - else: - if current_type is not None: - yield current_type, current_value - current_type = ttype - current_value = value - if current_type is not None: - yield current_type, current_value - - -FILTERS = { - 'codetagify': CodeTagFilter, - 'keywordcase': KeywordCaseFilter, - 'highlight': NameHighlightFilter, - 'raiseonerror': RaiseOnErrorTokenFilter, - 'whitespace': VisibleWhitespaceFilter, - 'gobble': GobbleFilter, - 'tokenmerge': TokenMergeFilter, - 'symbols': SymbolFilter, -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index ef9094acd7b9233e3c5eb85fae444a477fd626f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40166 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 B+JgW9 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py deleted file mode 100755 index d869b6c..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatter.py +++ /dev/null @@ -1,129 +0,0 @@ -""" - pygments.formatter - ~~~~~~~~~~~~~~~~~~ - - Base formatter class. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import codecs - -from pip._vendor.pygments.util import get_bool_opt -from pip._vendor.pygments.styles import get_style_by_name - -__all__ = ['Formatter'] - - -def _lookup_style(style): - if isinstance(style, str): - return get_style_by_name(style) - return style - - -class Formatter: - """ - Converts a token stream to text. - - Formatters should have attributes to help selecting them. These - are similar to the corresponding :class:`~pygments.lexer.Lexer` - attributes. - - .. autoattribute:: name - :no-value: - - .. autoattribute:: aliases - :no-value: - - .. autoattribute:: filenames - :no-value: - - You can pass options as keyword arguments to the constructor. - All formatters accept these basic options: - - ``style`` - The style to use, can be a string or a Style subclass - (default: "default"). Not used by e.g. the - TerminalFormatter. - ``full`` - Tells the formatter to output a "full" document, i.e. - a complete self-contained document. This doesn't have - any effect for some formatters (default: false). - ``title`` - If ``full`` is true, the title that should be used to - caption the document (default: ''). - ``encoding`` - If given, must be an encoding name. This will be used to - convert the Unicode token strings to byte strings in the - output. If it is "" or None, Unicode strings will be written - to the output file, which most file-like objects do not - support (default: None). - ``outencoding`` - Overrides ``encoding`` if given. - - """ - - #: Full name for the formatter, in human-readable form. - name = None - - #: A list of short, unique identifiers that can be used to lookup - #: the formatter from a list, e.g. using :func:`.get_formatter_by_name()`. - aliases = [] - - #: A list of fnmatch patterns that match filenames for which this - #: formatter can produce output. The patterns in this list should be unique - #: among all formatters. - filenames = [] - - #: If True, this formatter outputs Unicode strings when no encoding - #: option is given. - unicodeoutput = True - - def __init__(self, **options): - """ - As with lexers, this constructor takes arbitrary optional arguments, - and if you override it, you should first process your own options, then - call the base class implementation. - """ - self.style = _lookup_style(options.get('style', 'default')) - self.full = get_bool_opt(options, 'full', False) - self.title = options.get('title', '') - self.encoding = options.get('encoding', None) or None - if self.encoding in ('guess', 'chardet'): - # can happen for e.g. pygmentize -O encoding=guess - self.encoding = 'utf-8' - self.encoding = options.get('outencoding') or self.encoding - self.options = options - - def get_style_defs(self, arg=''): - """ - This method must return statements or declarations suitable to define - the current style for subsequent highlighted text (e.g. CSS classes - in the `HTMLFormatter`). - - The optional argument `arg` can be used to modify the generation and - is formatter dependent (it is standardized because it can be given on - the command line). - - This method is called by the ``-S`` :doc:`command-line option `, - the `arg` is then given by the ``-a`` option. - """ - return '' - - def format(self, tokensource, outfile): - """ - This method must format the tokens from the `tokensource` iterable and - write the formatted version to the file object `outfile`. - - Formatter options can control how exactly the tokens are converted. - """ - if self.encoding: - # wrap the outfile in a StreamWriter - outfile = codecs.lookup(self.encoding)[3](outfile) - return self.format_unencoded(tokensource, outfile) - - # Allow writing Formatter[str] or Formatter[bytes]. That's equivalent to - # Formatter. This helps when using third-party type stubs from typeshed. - def __class_getitem__(cls, name): - return cls diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py deleted file mode 100755 index c7c153b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__init__.py +++ /dev/null @@ -1,157 +0,0 @@ -""" - pygments.formatters - ~~~~~~~~~~~~~~~~~~~ - - Pygments formatters. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import types -import fnmatch -from os.path import basename - -from pip._vendor.pygments.formatters._mapping import FORMATTERS -from pip._vendor.pygments.plugin import find_plugin_formatters -from pip._vendor.pygments.util import ClassNotFound - -__all__ = ['get_formatter_by_name', 'get_formatter_for_filename', - 'get_all_formatters', 'load_formatter_from_file'] + list(FORMATTERS) - -_formatter_cache = {} # classes by name -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - - -def _load_formatters(module_name): - """Load a formatter (and all others in the module too).""" - mod = __import__(module_name, None, None, ['__all__']) - for formatter_name in mod.__all__: - cls = getattr(mod, formatter_name) - _formatter_cache[cls.name] = cls - - -def get_all_formatters(): - """Return a generator for all formatter classes.""" - # NB: this returns formatter classes, not info like get_all_lexers(). - for info in FORMATTERS.values(): - if info[1] not in _formatter_cache: - _load_formatters(info[0]) - yield _formatter_cache[info[1]] - for _, formatter in find_plugin_formatters(): - yield formatter - - -def find_formatter_class(alias): - """Lookup a formatter by alias. - - Returns None if not found. - """ - for module_name, name, aliases, _, _ in FORMATTERS.values(): - if alias in aliases: - if name not in _formatter_cache: - _load_formatters(module_name) - return _formatter_cache[name] - for _, cls in find_plugin_formatters(): - if alias in cls.aliases: - return cls - - -def get_formatter_by_name(_alias, **options): - """ - Return an instance of a :class:`.Formatter` subclass that has `alias` in its - aliases list. The formatter is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no formatter with that - alias is found. - """ - cls = find_formatter_class(_alias) - if cls is None: - raise ClassNotFound(f"no formatter found for name {_alias!r}") - return cls(**options) - - -def load_formatter_from_file(filename, formattername="CustomFormatter", **options): - """ - Return a `Formatter` subclass instance loaded from the provided file, relative - to the current directory. - - The file is expected to contain a Formatter class named ``formattername`` - (by default, CustomFormatter). Users should be very careful with the input, because - this method is equivalent to running ``eval()`` on the input file. The formatter is - given the `options` at its instantiation. - - :exc:`pygments.util.ClassNotFound` is raised if there are any errors loading - the formatter. - - .. versionadded:: 2.2 - """ - try: - # This empty dict will contain the namespace for the exec'd file - custom_namespace = {} - with open(filename, 'rb') as f: - exec(f.read(), custom_namespace) - # Retrieve the class `formattername` from that namespace - if formattername not in custom_namespace: - raise ClassNotFound(f'no valid {formattername} class found in {filename}') - formatter_class = custom_namespace[formattername] - # And finally instantiate it with the options - return formatter_class(**options) - except OSError as err: - raise ClassNotFound(f'cannot read {filename}: {err}') - except ClassNotFound: - raise - except Exception as err: - raise ClassNotFound(f'error when loading custom formatter: {err}') - - -def get_formatter_for_filename(fn, **options): - """ - Return a :class:`.Formatter` subclass instance that has a filename pattern - matching `fn`. The formatter is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no formatter for that filename - is found. - """ - fn = basename(fn) - for modname, name, _, filenames, _ in FORMATTERS.values(): - for filename in filenames: - if _fn_matches(fn, filename): - if name not in _formatter_cache: - _load_formatters(modname) - return _formatter_cache[name](**options) - for _name, cls in find_plugin_formatters(): - for filename in cls.filenames: - if _fn_matches(fn, filename): - return cls(**options) - raise ClassNotFound(f"no formatter found for file name {fn!r}") - - -class _automodule(types.ModuleType): - """Automatically import formatters.""" - - def __getattr__(self, name): - info = FORMATTERS.get(name) - if info: - _load_formatters(info[0]) - cls = _formatter_cache[info[1]] - setattr(self, name, cls) - return cls - raise AttributeError(name) - - -oldmod = sys.modules[__name__] -newmod = _automodule(__name__) -newmod.__dict__.update(oldmod.__dict__) -sys.modules[__name__] = newmod -del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index d21581a80cd147699783c624acfdb205523b9d0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7780 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 a9j`LJ!aJqcN>|Eb<%#{|ehU8x=Kl(XIFsA} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc deleted file mode 100755 index 078376b6ef840d5a75a9d8fea5e25d4f6335c845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4220 zcmd5`)SUDDoXrpg@5FxdcH!N005Hr=r+XfP8@ka?`25x3eUun5O_WD#LI0&Aj*Kz2Ce) z%O4gO=N$a~`%iy)ad_Qvej;Y{=N2zNpX24vj&yv-FMV6`%f1U*@vERS{uR(!|0?L5 zKM%U#FM=-l*FdlP%b>6MH$YeXo1nM+RnRs6Ht4#42lTFg5A=2aJ}C1afWF~Bl%?-W zUpfAp$4>37^xDS8rt-y>(migB(6#DtJst!-5t*dk8LcMucH4tkI%CCa<#eW4DYx5y zbB5np1I(xs5hd(Qnl9VeAeE%fnq83yRv42}!18s*wP5{3_^dr(Jsu5MyB~(a$cVKS z*M9PdC5jDHpLslDT^V#k{5Q0svD4R{AUpP~k;|+taE@THN?<5p(lFB%TGZ3!jb6Od zf(WDrRnjwRvK2{tz%($wy6a-f^lYdm?Yb*qgAhP zE{~FemkEWLkR$AHV7e+|q-JXVaKvHQnf7D!!I&spf$rmd` z^$b>qTT}8YS79RYcueRj=5=|5I{;)-1FcYL#v>nz7a5kAL5M6^d}ey#q)%(peCk3d ztvqY)?*YpSakcVr=G{8I5vX_$f4uAwPZ-Iwk65eqaT4?BlU9ov9w7ZU2Fw>7-Ve>A zJO@1ZgYsg?3lVvtq7p#TbJC2pC=?$dcM}nI*qP>WJR#!C(?W#3)9xcOk%!D$ks{F+ zQ?ZdMs^xV@Hm$;M61I7K%)F2%NnTNHB$hB#e3WA?FG=#fk$yd0*g4vqglc-RXfJgk zNQEM`r&n=X_R8MA3{c(@AXr>XBEIe;dXc0{)3ez{1tK5TDIeUO{q59^qrlc5UM6z- z@L>Cu<@EAy987mNZx}D)fN;Pgt-Odu;V#%=e_VpQhfiOfze{`QDCd)xIJE{tl1i(4 zyea;G0IHUEv1kFu%kYcK*NJ@3#V5O5B!q9$7gs4Zfb{2E* z1nn|GK^~y#PdIon)j@?6)x)bzac-E3!U3GDz$uefBB&Qmo}1z0&-*4uO;ASDKI=!e zDfs!AP}rhD)3I|69k`yZ9HMEceXdXX@q{14`_mc&>N-%pTz0sSD>AD|sO6jK{DjQZ z-UZ|)H46ZDOkR|59OF+gEg~Od%cr)6>396)HYV5+KWox_op4jXP2F)0JH_aw{L}m_ zow1YHLW70jr&g;FWAK7Atm7o~oCN)dQ`aD9a7{|nbjnSD!=&rssuqsSrFK5GA86A_ z-J|9f4I#W2=bO&(?=PJXDa?Jsomv&TAY0)rG0viPXh$Ur-6;bPPC~IB&R{@;>HL9yjuwHGW_W!2<+9e0DZeFJwzxmq}VUf z05tfTLG0o@7Ftr|Jgl>)-0QMXMuMqMo<%fK@+m^8PcuSalnnL$rE&SlO zPbQ$cm|9OjaU`40Pbk*hbbfMg4t^yn6tJ1PAhxjnaT(8i!hCjcyn`rc_K!!*qx`;Y z7THM)6Yp7}(J2fH#UZ$WJ$XVQvew9_aU=xSCFA*LY+=QqV7XzDIHPN^AF!s2mDqmn z5pabYXG)(C+*%_a!vU)MrK9jEes@|E8o8X#j#N$ z`@^!)8Fl)k@f<&OVw%M9;9~aUp7Q&l_(bpG%o6@5biX72;=|DoL*f1Nl6zg`&o(#@8Mf34Uzo5lWaIeUwE O2jrVM`lp`(xBmiecCkbN diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py deleted file mode 100755 index 72ca840..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/formatters/_mapping.py +++ /dev/null @@ -1,23 +0,0 @@ -# Automatically generated by scripts/gen_mapfiles.py. -# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. - -FORMATTERS = { - 'BBCodeFormatter': ('pygments.formatters.bbcode', 'BBCode', ('bbcode', 'bb'), (), 'Format tokens with BBcodes. These formatting codes are used by many bulletin boards, so you can highlight your sourcecode with pygments before posting it there.'), - 'BmpImageFormatter': ('pygments.formatters.img', 'img_bmp', ('bmp', 'bitmap'), ('*.bmp',), 'Create a bitmap image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'GifImageFormatter': ('pygments.formatters.img', 'img_gif', ('gif',), ('*.gif',), 'Create a GIF image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'GroffFormatter': ('pygments.formatters.groff', 'groff', ('groff', 'troff', 'roff'), (), 'Format tokens with groff escapes to change their color and font style.'), - 'HtmlFormatter': ('pygments.formatters.html', 'HTML', ('html',), ('*.html', '*.htm'), "Format tokens as HTML 4 ```` tags. By default, the content is enclosed in a ``
`` tag, itself wrapped in a ``
`` tag (but see the `nowrap` option). The ``
``'s CSS class can be set by the `cssclass` option."), - 'IRCFormatter': ('pygments.formatters.irc', 'IRC', ('irc', 'IRC'), (), 'Format tokens with IRC color sequences'), - 'ImageFormatter': ('pygments.formatters.img', 'img', ('img', 'IMG', 'png'), ('*.png',), 'Create a PNG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'JpgImageFormatter': ('pygments.formatters.img', 'img_jpg', ('jpg', 'jpeg'), ('*.jpg',), 'Create a JPEG image from source code. This uses the Python Imaging Library to generate a pixmap from the source code.'), - 'LatexFormatter': ('pygments.formatters.latex', 'LaTeX', ('latex', 'tex'), ('*.tex',), 'Format tokens as LaTeX code. This needs the `fancyvrb` and `color` standard packages.'), - 'NullFormatter': ('pygments.formatters.other', 'Text only', ('text', 'null'), ('*.txt',), 'Output the text unchanged without any formatting.'), - 'PangoMarkupFormatter': ('pygments.formatters.pangomarkup', 'Pango Markup', ('pango', 'pangomarkup'), (), 'Format tokens as Pango Markup code. It can then be rendered to an SVG.'), - 'RawTokenFormatter': ('pygments.formatters.other', 'Raw tokens', ('raw', 'tokens'), ('*.raw',), 'Format tokens as a raw representation for storing token streams.'), - 'RtfFormatter': ('pygments.formatters.rtf', 'RTF', ('rtf',), ('*.rtf',), 'Format tokens as RTF markup. This formatter automatically outputs full RTF documents with color information and other useful stuff. Perfect for Copy and Paste into Microsoft(R) Word(R) documents.'), - 'SvgFormatter': ('pygments.formatters.svg', 'SVG', ('svg',), ('*.svg',), 'Format tokens as an SVG graphics file. This formatter is still experimental. Each line of code is a ```` element with explicit ``x`` and ``y`` coordinates containing ```` elements with the individual token styles.'), - 'Terminal256Formatter': ('pygments.formatters.terminal256', 'Terminal256', ('terminal256', 'console256', '256'), (), 'Format tokens with ANSI color sequences, for output in a 256-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TerminalFormatter': ('pygments.formatters.terminal', 'Terminal', ('terminal', 'console'), (), 'Format tokens with ANSI color sequences, for output in a text console. Color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TerminalTrueColorFormatter': ('pygments.formatters.terminal256', 'TerminalTrueColor', ('terminal16m', 'console16m', '16m'), (), 'Format tokens with ANSI color sequences, for output in a true-color terminal or console. Like in `TerminalFormatter` color sequences are terminated at newlines, so that paging the output works correctly.'), - 'TestcaseFormatter': ('pygments.formatters.other', 'Testcase', ('testcase',), (), 'Format tokens as appropriate for a new testcase.'), -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py deleted file mode 100755 index a776bfa..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexer.py +++ /dev/null @@ -1,965 +0,0 @@ -""" - pygments.lexer - ~~~~~~~~~~~~~~ - - Base lexer classes. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import time - -from pip._vendor.pygments.filter import apply_filters, Filter -from pip._vendor.pygments.filters import get_filter_by_name -from pip._vendor.pygments.token import Error, Text, Other, Whitespace, _TokenType -from pip._vendor.pygments.util import get_bool_opt, get_int_opt, get_list_opt, \ - make_analysator, Future, guess_decode -from pip._vendor.pygments.regexopt import regex_opt - -__all__ = ['Lexer', 'RegexLexer', 'ExtendedRegexLexer', 'DelegatingLexer', - 'LexerContext', 'include', 'inherit', 'bygroups', 'using', 'this', - 'default', 'words', 'line_re'] - -line_re = re.compile('.*?\n') - -_encoding_map = [(b'\xef\xbb\xbf', 'utf-8'), - (b'\xff\xfe\0\0', 'utf-32'), - (b'\0\0\xfe\xff', 'utf-32be'), - (b'\xff\xfe', 'utf-16'), - (b'\xfe\xff', 'utf-16be')] - -_default_analyse = staticmethod(lambda x: 0.0) - - -class LexerMeta(type): - """ - This metaclass automagically converts ``analyse_text`` methods into - static methods which always return float values. - """ - - def __new__(mcs, name, bases, d): - if 'analyse_text' in d: - d['analyse_text'] = make_analysator(d['analyse_text']) - return type.__new__(mcs, name, bases, d) - - -class Lexer(metaclass=LexerMeta): - """ - Lexer for a specific language. - - See also :doc:`lexerdevelopment`, a high-level guide to writing - lexers. - - Lexer classes have attributes used for choosing the most appropriate - lexer based on various criteria. - - .. autoattribute:: name - :no-value: - .. autoattribute:: aliases - :no-value: - .. autoattribute:: filenames - :no-value: - .. autoattribute:: alias_filenames - .. autoattribute:: mimetypes - :no-value: - .. autoattribute:: priority - - Lexers included in Pygments should have two additional attributes: - - .. autoattribute:: url - :no-value: - .. autoattribute:: version_added - :no-value: - - Lexers included in Pygments may have additional attributes: - - .. autoattribute:: _example - :no-value: - - You can pass options to the constructor. The basic options recognized - by all lexers and processed by the base `Lexer` class are: - - ``stripnl`` - Strip leading and trailing newlines from the input (default: True). - ``stripall`` - Strip all leading and trailing whitespace from the input - (default: False). - ``ensurenl`` - Make sure that the input ends with a newline (default: True). This - is required for some lexers that consume input linewise. - - .. versionadded:: 1.3 - - ``tabsize`` - If given and greater than 0, expand tabs in the input (default: 0). - ``encoding`` - If given, must be an encoding name. This encoding will be used to - convert the input string to Unicode, if it is not already a Unicode - string (default: ``'guess'``, which uses a simple UTF-8 / Locale / - Latin1 detection. Can also be ``'chardet'`` to use the chardet - library, if it is installed. - ``inencoding`` - Overrides the ``encoding`` if given. - """ - - #: Full name of the lexer, in human-readable form - name = None - - #: A list of short, unique identifiers that can be used to look - #: up the lexer from a list, e.g., using `get_lexer_by_name()`. - aliases = [] - - #: A list of `fnmatch` patterns that match filenames which contain - #: content for this lexer. The patterns in this list should be unique among - #: all lexers. - filenames = [] - - #: A list of `fnmatch` patterns that match filenames which may or may not - #: contain content for this lexer. This list is used by the - #: :func:`.guess_lexer_for_filename()` function, to determine which lexers - #: are then included in guessing the correct one. That means that - #: e.g. every lexer for HTML and a template language should include - #: ``\*.html`` in this list. - alias_filenames = [] - - #: A list of MIME types for content that can be lexed with this lexer. - mimetypes = [] - - #: Priority, should multiple lexers match and no content is provided - priority = 0 - - #: URL of the language specification/definition. Used in the Pygments - #: documentation. Set to an empty string to disable. - url = None - - #: Version of Pygments in which the lexer was added. - version_added = None - - #: Example file name. Relative to the ``tests/examplefiles`` directory. - #: This is used by the documentation generator to show an example. - _example = None - - def __init__(self, **options): - """ - This constructor takes arbitrary options as keyword arguments. - Every subclass must first process its own options and then call - the `Lexer` constructor, since it processes the basic - options like `stripnl`. - - An example looks like this: - - .. sourcecode:: python - - def __init__(self, **options): - self.compress = options.get('compress', '') - Lexer.__init__(self, **options) - - As these options must all be specifiable as strings (due to the - command line usage), there are various utility functions - available to help with that, see `Utilities`_. - """ - self.options = options - self.stripnl = get_bool_opt(options, 'stripnl', True) - self.stripall = get_bool_opt(options, 'stripall', False) - self.ensurenl = get_bool_opt(options, 'ensurenl', True) - self.tabsize = get_int_opt(options, 'tabsize', 0) - self.encoding = options.get('encoding', 'guess') - self.encoding = options.get('inencoding') or self.encoding - self.filters = [] - for filter_ in get_list_opt(options, 'filters', ()): - self.add_filter(filter_) - - def __repr__(self): - if self.options: - return f'' - else: - return f'' - - def add_filter(self, filter_, **options): - """ - Add a new stream filter to this lexer. - """ - if not isinstance(filter_, Filter): - filter_ = get_filter_by_name(filter_, **options) - self.filters.append(filter_) - - def analyse_text(text): - """ - A static method which is called for lexer guessing. - - It should analyse the text and return a float in the range - from ``0.0`` to ``1.0``. If it returns ``0.0``, the lexer - will not be selected as the most probable one, if it returns - ``1.0``, it will be selected immediately. This is used by - `guess_lexer`. - - The `LexerMeta` metaclass automatically wraps this function so - that it works like a static method (no ``self`` or ``cls`` - parameter) and the return value is automatically converted to - `float`. If the return value is an object that is boolean `False` - it's the same as if the return values was ``0.0``. - """ - - def _preprocess_lexer_input(self, text): - """Apply preprocessing such as decoding the input, removing BOM and normalizing newlines.""" - - if not isinstance(text, str): - if self.encoding == 'guess': - text, _ = guess_decode(text) - elif self.encoding == 'chardet': - try: - # pip vendoring note: this code is not reachable by pip, - # removed import of chardet to make it clear. - raise ImportError('chardet is not vendored by pip') - except ImportError as e: - raise ImportError('To enable chardet encoding guessing, ' - 'please install the chardet library ' - 'from http://chardet.feedparser.org/') from e - # check for BOM first - decoded = None - for bom, encoding in _encoding_map: - if text.startswith(bom): - decoded = text[len(bom):].decode(encoding, 'replace') - break - # no BOM found, so use chardet - if decoded is None: - enc = chardet.detect(text[:1024]) # Guess using first 1KB - decoded = text.decode(enc.get('encoding') or 'utf-8', - 'replace') - text = decoded - else: - text = text.decode(self.encoding) - if text.startswith('\ufeff'): - text = text[len('\ufeff'):] - else: - if text.startswith('\ufeff'): - text = text[len('\ufeff'):] - - # text now *is* a unicode string - text = text.replace('\r\n', '\n') - text = text.replace('\r', '\n') - if self.stripall: - text = text.strip() - elif self.stripnl: - text = text.strip('\n') - if self.tabsize > 0: - text = text.expandtabs(self.tabsize) - if self.ensurenl and not text.endswith('\n'): - text += '\n' - - return text - - def get_tokens(self, text, unfiltered=False): - """ - This method is the basic interface of a lexer. It is called by - the `highlight()` function. It must process the text and return an - iterable of ``(tokentype, value)`` pairs from `text`. - - Normally, you don't need to override this method. The default - implementation processes the options recognized by all lexers - (`stripnl`, `stripall` and so on), and then yields all tokens - from `get_tokens_unprocessed()`, with the ``index`` dropped. - - If `unfiltered` is set to `True`, the filtering mechanism is - bypassed even if filters are defined. - """ - text = self._preprocess_lexer_input(text) - - def streamer(): - for _, t, v in self.get_tokens_unprocessed(text): - yield t, v - stream = streamer() - if not unfiltered: - stream = apply_filters(stream, self.filters, self) - return stream - - def get_tokens_unprocessed(self, text): - """ - This method should process the text and return an iterable of - ``(index, tokentype, value)`` tuples where ``index`` is the starting - position of the token within the input text. - - It must be overridden by subclasses. It is recommended to - implement it as a generator to maximize effectiveness. - """ - raise NotImplementedError - - -class DelegatingLexer(Lexer): - """ - This lexer takes two lexer as arguments. A root lexer and - a language lexer. First everything is scanned using the language - lexer, afterwards all ``Other`` tokens are lexed using the root - lexer. - - The lexers from the ``template`` lexer package use this base lexer. - """ - - def __init__(self, _root_lexer, _language_lexer, _needle=Other, **options): - self.root_lexer = _root_lexer(**options) - self.language_lexer = _language_lexer(**options) - self.needle = _needle - Lexer.__init__(self, **options) - - def get_tokens_unprocessed(self, text): - buffered = '' - insertions = [] - lng_buffer = [] - for i, t, v in self.language_lexer.get_tokens_unprocessed(text): - if t is self.needle: - if lng_buffer: - insertions.append((len(buffered), lng_buffer)) - lng_buffer = [] - buffered += v - else: - lng_buffer.append((i, t, v)) - if lng_buffer: - insertions.append((len(buffered), lng_buffer)) - return do_insertions(insertions, - self.root_lexer.get_tokens_unprocessed(buffered)) - - -# ------------------------------------------------------------------------------ -# RegexLexer and ExtendedRegexLexer -# - - -class include(str): # pylint: disable=invalid-name - """ - Indicates that a state should include rules from another state. - """ - pass - - -class _inherit: - """ - Indicates the a state should inherit from its superclass. - """ - def __repr__(self): - return 'inherit' - -inherit = _inherit() # pylint: disable=invalid-name - - -class combined(tuple): # pylint: disable=invalid-name - """ - Indicates a state combined from multiple states. - """ - - def __new__(cls, *args): - return tuple.__new__(cls, args) - - def __init__(self, *args): - # tuple.__init__ doesn't do anything - pass - - -class _PseudoMatch: - """ - A pseudo match object constructed from a string. - """ - - def __init__(self, start, text): - self._text = text - self._start = start - - def start(self, arg=None): - return self._start - - def end(self, arg=None): - return self._start + len(self._text) - - def group(self, arg=None): - if arg: - raise IndexError('No such group') - return self._text - - def groups(self): - return (self._text,) - - def groupdict(self): - return {} - - -def bygroups(*args): - """ - Callback that yields multiple actions for each group in the match. - """ - def callback(lexer, match, ctx=None): - for i, action in enumerate(args): - if action is None: - continue - elif type(action) is _TokenType: - data = match.group(i + 1) - if data: - yield match.start(i + 1), action, data - else: - data = match.group(i + 1) - if data is not None: - if ctx: - ctx.pos = match.start(i + 1) - for item in action(lexer, - _PseudoMatch(match.start(i + 1), data), ctx): - if item: - yield item - if ctx: - ctx.pos = match.end() - return callback - - -class _This: - """ - Special singleton used for indicating the caller class. - Used by ``using``. - """ - -this = _This() - - -def using(_other, **kwargs): - """ - Callback that processes the match with a different lexer. - - The keyword arguments are forwarded to the lexer, except `state` which - is handled separately. - - `state` specifies the state that the new lexer will start in, and can - be an enumerable such as ('root', 'inline', 'string') or a simple - string which is assumed to be on top of the root state. - - Note: For that to work, `_other` must not be an `ExtendedRegexLexer`. - """ - gt_kwargs = {} - if 'state' in kwargs: - s = kwargs.pop('state') - if isinstance(s, (list, tuple)): - gt_kwargs['stack'] = s - else: - gt_kwargs['stack'] = ('root', s) - - if _other is this: - def callback(lexer, match, ctx=None): - # if keyword arguments are given the callback - # function has to create a new lexer instance - if kwargs: - # XXX: cache that somehow - d = dict(lexer.options) - d.update(kwargs) - lx = lexer.__class__(**d) - else: - lx = lexer - s = match.start() - for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs): - yield i + s, t, v - if ctx: - ctx.pos = match.end() - else: - def callback(lexer, match, ctx=None): - # XXX: cache that somehow - d = dict(lexer.options) - d.update(kwargs) - lx = _other(**d) - - s = match.start() - for i, t, v in lx.get_tokens_unprocessed(match.group(), **gt_kwargs): - yield i + s, t, v - if ctx: - ctx.pos = match.end() - return callback - - -class default: - """ - Indicates a state or state action (e.g. #pop) to apply. - For example default('#pop') is equivalent to ('', Token, '#pop') - Note that state tuples may be used as well. - - .. versionadded:: 2.0 - """ - def __init__(self, state): - self.state = state - - -class words(Future): - """ - Indicates a list of literal words that is transformed into an optimized - regex that matches any of the words. - - .. versionadded:: 2.0 - """ - def __init__(self, words, prefix='', suffix=''): - self.words = words - self.prefix = prefix - self.suffix = suffix - - def get(self): - return regex_opt(self.words, prefix=self.prefix, suffix=self.suffix) - - -class RegexLexerMeta(LexerMeta): - """ - Metaclass for RegexLexer, creates the self._tokens attribute from - self.tokens on the first instantiation. - """ - - def _process_regex(cls, regex, rflags, state): - """Preprocess the regular expression component of a token definition.""" - if isinstance(regex, Future): - regex = regex.get() - return re.compile(regex, rflags).match - - def _process_token(cls, token): - """Preprocess the token component of a token definition.""" - assert type(token) is _TokenType or callable(token), \ - f'token type must be simple type or callable, not {token!r}' - return token - - def _process_new_state(cls, new_state, unprocessed, processed): - """Preprocess the state transition action of a token definition.""" - if isinstance(new_state, str): - # an existing state - if new_state == '#pop': - return -1 - elif new_state in unprocessed: - return (new_state,) - elif new_state == '#push': - return new_state - elif new_state[:5] == '#pop:': - return -int(new_state[5:]) - else: - assert False, f'unknown new state {new_state!r}' - elif isinstance(new_state, combined): - # combine a new state from existing ones - tmp_state = '_tmp_%d' % cls._tmpname - cls._tmpname += 1 - itokens = [] - for istate in new_state: - assert istate != new_state, f'circular state ref {istate!r}' - itokens.extend(cls._process_state(unprocessed, - processed, istate)) - processed[tmp_state] = itokens - return (tmp_state,) - elif isinstance(new_state, tuple): - # push more than one state - for istate in new_state: - assert (istate in unprocessed or - istate in ('#pop', '#push')), \ - 'unknown new state ' + istate - return new_state - else: - assert False, f'unknown new state def {new_state!r}' - - def _process_state(cls, unprocessed, processed, state): - """Preprocess a single state definition.""" - assert isinstance(state, str), f"wrong state name {state!r}" - assert state[0] != '#', f"invalid state name {state!r}" - if state in processed: - return processed[state] - tokens = processed[state] = [] - rflags = cls.flags - for tdef in unprocessed[state]: - if isinstance(tdef, include): - # it's a state reference - assert tdef != state, f"circular state reference {state!r}" - tokens.extend(cls._process_state(unprocessed, processed, - str(tdef))) - continue - if isinstance(tdef, _inherit): - # should be processed already, but may not in the case of: - # 1. the state has no counterpart in any parent - # 2. the state includes more than one 'inherit' - continue - if isinstance(tdef, default): - new_state = cls._process_new_state(tdef.state, unprocessed, processed) - tokens.append((re.compile('').match, None, new_state)) - continue - - assert type(tdef) is tuple, f"wrong rule def {tdef!r}" - - try: - rex = cls._process_regex(tdef[0], rflags, state) - except Exception as err: - raise ValueError(f"uncompilable regex {tdef[0]!r} in state {state!r} of {cls!r}: {err}") from err - - token = cls._process_token(tdef[1]) - - if len(tdef) == 2: - new_state = None - else: - new_state = cls._process_new_state(tdef[2], - unprocessed, processed) - - tokens.append((rex, token, new_state)) - return tokens - - def process_tokendef(cls, name, tokendefs=None): - """Preprocess a dictionary of token definitions.""" - processed = cls._all_tokens[name] = {} - tokendefs = tokendefs or cls.tokens[name] - for state in list(tokendefs): - cls._process_state(tokendefs, processed, state) - return processed - - def get_tokendefs(cls): - """ - Merge tokens from superclasses in MRO order, returning a single tokendef - dictionary. - - Any state that is not defined by a subclass will be inherited - automatically. States that *are* defined by subclasses will, by - default, override that state in the superclass. If a subclass wishes to - inherit definitions from a superclass, it can use the special value - "inherit", which will cause the superclass' state definition to be - included at that point in the state. - """ - tokens = {} - inheritable = {} - for c in cls.__mro__: - toks = c.__dict__.get('tokens', {}) - - for state, items in toks.items(): - curitems = tokens.get(state) - if curitems is None: - # N.b. because this is assigned by reference, sufficiently - # deep hierarchies are processed incrementally (e.g. for - # A(B), B(C), C(RegexLexer), B will be premodified so X(B) - # will not see any inherits in B). - tokens[state] = items - try: - inherit_ndx = items.index(inherit) - except ValueError: - continue - inheritable[state] = inherit_ndx - continue - - inherit_ndx = inheritable.pop(state, None) - if inherit_ndx is None: - continue - - # Replace the "inherit" value with the items - curitems[inherit_ndx:inherit_ndx+1] = items - try: - # N.b. this is the index in items (that is, the superclass - # copy), so offset required when storing below. - new_inh_ndx = items.index(inherit) - except ValueError: - pass - else: - inheritable[state] = inherit_ndx + new_inh_ndx - - return tokens - - def __call__(cls, *args, **kwds): - """Instantiate cls after preprocessing its token definitions.""" - if '_tokens' not in cls.__dict__: - cls._all_tokens = {} - cls._tmpname = 0 - if hasattr(cls, 'token_variants') and cls.token_variants: - # don't process yet - pass - else: - cls._tokens = cls.process_tokendef('', cls.get_tokendefs()) - - return type.__call__(cls, *args, **kwds) - - -class RegexLexer(Lexer, metaclass=RegexLexerMeta): - """ - Base for simple stateful regular expression-based lexers. - Simplifies the lexing process so that you need only - provide a list of states and regular expressions. - """ - - #: Flags for compiling the regular expressions. - #: Defaults to MULTILINE. - flags = re.MULTILINE - - #: At all time there is a stack of states. Initially, the stack contains - #: a single state 'root'. The top of the stack is called "the current state". - #: - #: Dict of ``{'state': [(regex, tokentype, new_state), ...], ...}`` - #: - #: ``new_state`` can be omitted to signify no state transition. - #: If ``new_state`` is a string, it is pushed on the stack. This ensure - #: the new current state is ``new_state``. - #: If ``new_state`` is a tuple of strings, all of those strings are pushed - #: on the stack and the current state will be the last element of the list. - #: ``new_state`` can also be ``combined('state1', 'state2', ...)`` - #: to signify a new, anonymous state combined from the rules of two - #: or more existing ones. - #: Furthermore, it can be '#pop' to signify going back one step in - #: the state stack, or '#push' to push the current state on the stack - #: again. Note that if you push while in a combined state, the combined - #: state itself is pushed, and not only the state in which the rule is - #: defined. - #: - #: The tuple can also be replaced with ``include('state')``, in which - #: case the rules from the state named by the string are included in the - #: current one. - tokens = {} - - def get_tokens_unprocessed(self, text, stack=('root',)): - """ - Split ``text`` into (tokentype, text) pairs. - - ``stack`` is the initial stack (default: ``['root']``) - """ - pos = 0 - tokendefs = self._tokens - statestack = list(stack) - statetokens = tokendefs[statestack[-1]] - while 1: - for rexmatch, action, new_state in statetokens: - m = rexmatch(text, pos) - if m: - if action is not None: - if type(action) is _TokenType: - yield pos, action, m.group() - else: - yield from action(self, m) - pos = m.end() - if new_state is not None: - # state transition - if isinstance(new_state, tuple): - for state in new_state: - if state == '#pop': - if len(statestack) > 1: - statestack.pop() - elif state == '#push': - statestack.append(statestack[-1]) - else: - statestack.append(state) - elif isinstance(new_state, int): - # pop, but keep at least one state on the stack - # (random code leading to unexpected pops should - # not allow exceptions) - if abs(new_state) >= len(statestack): - del statestack[1:] - else: - del statestack[new_state:] - elif new_state == '#push': - statestack.append(statestack[-1]) - else: - assert False, f"wrong state def: {new_state!r}" - statetokens = tokendefs[statestack[-1]] - break - else: - # We are here only if all state tokens have been considered - # and there was not a match on any of them. - try: - if text[pos] == '\n': - # at EOL, reset state to "root" - statestack = ['root'] - statetokens = tokendefs['root'] - yield pos, Whitespace, '\n' - pos += 1 - continue - yield pos, Error, text[pos] - pos += 1 - except IndexError: - break - - -class LexerContext: - """ - A helper object that holds lexer position data. - """ - - def __init__(self, text, pos, stack=None, end=None): - self.text = text - self.pos = pos - self.end = end or len(text) # end=0 not supported ;-) - self.stack = stack or ['root'] - - def __repr__(self): - return f'LexerContext({self.text!r}, {self.pos!r}, {self.stack!r})' - - -class ExtendedRegexLexer(RegexLexer): - """ - A RegexLexer that uses a context object to store its state. - """ - - def get_tokens_unprocessed(self, text=None, context=None): - """ - Split ``text`` into (tokentype, text) pairs. - If ``context`` is given, use this lexer context instead. - """ - tokendefs = self._tokens - if not context: - ctx = LexerContext(text, 0) - statetokens = tokendefs['root'] - else: - ctx = context - statetokens = tokendefs[ctx.stack[-1]] - text = ctx.text - while 1: - for rexmatch, action, new_state in statetokens: - m = rexmatch(text, ctx.pos, ctx.end) - if m: - if action is not None: - if type(action) is _TokenType: - yield ctx.pos, action, m.group() - ctx.pos = m.end() - else: - yield from action(self, m, ctx) - if not new_state: - # altered the state stack? - statetokens = tokendefs[ctx.stack[-1]] - # CAUTION: callback must set ctx.pos! - if new_state is not None: - # state transition - if isinstance(new_state, tuple): - for state in new_state: - if state == '#pop': - if len(ctx.stack) > 1: - ctx.stack.pop() - elif state == '#push': - ctx.stack.append(ctx.stack[-1]) - else: - ctx.stack.append(state) - elif isinstance(new_state, int): - # see RegexLexer for why this check is made - if abs(new_state) >= len(ctx.stack): - del ctx.stack[1:] - else: - del ctx.stack[new_state:] - elif new_state == '#push': - ctx.stack.append(ctx.stack[-1]) - else: - assert False, f"wrong state def: {new_state!r}" - statetokens = tokendefs[ctx.stack[-1]] - break - else: - try: - if ctx.pos >= ctx.end: - break - if text[ctx.pos] == '\n': - # at EOL, reset state to "root" - ctx.stack = ['root'] - statetokens = tokendefs['root'] - yield ctx.pos, Text, '\n' - ctx.pos += 1 - continue - yield ctx.pos, Error, text[ctx.pos] - ctx.pos += 1 - except IndexError: - break - - -def do_insertions(insertions, tokens): - """ - Helper for lexers which must combine the results of several - sublexers. - - ``insertions`` is a list of ``(index, itokens)`` pairs. - Each ``itokens`` iterable should be inserted at position - ``index`` into the token stream given by the ``tokens`` - argument. - - The result is a combined token stream. - - TODO: clean up the code here. - """ - insertions = iter(insertions) - try: - index, itokens = next(insertions) - except StopIteration: - # no insertions - yield from tokens - return - - realpos = None - insleft = True - - # iterate over the token stream where we want to insert - # the tokens from the insertion list. - for i, t, v in tokens: - # first iteration. store the position of first item - if realpos is None: - realpos = i - oldi = 0 - while insleft and i + len(v) >= index: - tmpval = v[oldi:index - i] - if tmpval: - yield realpos, t, tmpval - realpos += len(tmpval) - for it_index, it_token, it_value in itokens: - yield realpos, it_token, it_value - realpos += len(it_value) - oldi = index - i - try: - index, itokens = next(insertions) - except StopIteration: - insleft = False - break # not strictly necessary - if oldi < len(v): - yield realpos, t, v[oldi:] - realpos += len(v) - oldi - - # leftover tokens - while insleft: - # no normal tokens, set realpos to zero - realpos = realpos or 0 - for p, t, v in itokens: - yield realpos, t, v - realpos += len(v) - try: - index, itokens = next(insertions) - except StopIteration: - insleft = False - break # not strictly necessary - - -class ProfilingRegexLexerMeta(RegexLexerMeta): - """Metaclass for ProfilingRegexLexer, collects regex timing info.""" - - def _process_regex(cls, regex, rflags, state): - if isinstance(regex, words): - rex = regex_opt(regex.words, prefix=regex.prefix, - suffix=regex.suffix) - else: - rex = regex - compiled = re.compile(rex, rflags) - - def match_func(text, pos, endpos=sys.maxsize): - info = cls._prof_data[-1].setdefault((state, rex), [0, 0.0]) - t0 = time.time() - res = compiled.match(text, pos, endpos) - t1 = time.time() - info[0] += 1 - info[1] += t1 - t0 - return res - return match_func - - -class ProfilingRegexLexer(RegexLexer, metaclass=ProfilingRegexLexerMeta): - """Drop-in replacement for RegexLexer that does profiling of its regexes.""" - - _prof_data = [] - _prof_sort_index = 4 # defaults to time per call - - def get_tokens_unprocessed(self, text, stack=('root',)): - # this needs to be a stack, since using(this) will produce nested calls - self.__class__._prof_data.append({}) - yield from RegexLexer.get_tokens_unprocessed(self, text, stack) - rawdata = self.__class__._prof_data.pop() - data = sorted(((s, repr(r).strip('u\'').replace('\\\\', '\\')[:65], - n, 1000 * t, 1000 * t / n) - for ((s, r), (n, t)) in rawdata.items()), - key=lambda x: x[self._prof_sort_index], - reverse=True) - sum_total = sum(x[3] for x in data) - - print() - print('Profiling result for %s lexing %d chars in %.3f ms' % - (self.__class__.__name__, len(text), sum_total)) - print('=' * 110) - print('%-20s %-64s ncalls tottime percall' % ('state', 'regex')) - print('-' * 110) - for d in data: - print('%-20s %-65s %5d %8.4f %8.4f' % d) - print('=' * 110) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py deleted file mode 100755 index 7dcb103..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__init__.py +++ /dev/null @@ -1,362 +0,0 @@ -""" - pygments.lexers - ~~~~~~~~~~~~~~~ - - Pygments lexers. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -import sys -import types -import fnmatch -from os.path import basename - -from pip._vendor.pygments.lexers._mapping import LEXERS -from pip._vendor.pygments.modeline import get_filetype_from_buffer -from pip._vendor.pygments.plugin import find_plugin_lexers -from pip._vendor.pygments.util import ClassNotFound, guess_decode - -COMPAT = { - 'Python3Lexer': 'PythonLexer', - 'Python3TracebackLexer': 'PythonTracebackLexer', - 'LeanLexer': 'Lean3Lexer', -} - -__all__ = ['get_lexer_by_name', 'get_lexer_for_filename', 'find_lexer_class', - 'guess_lexer', 'load_lexer_from_file'] + list(LEXERS) + list(COMPAT) - -_lexer_cache = {} -_pattern_cache = {} - - -def _fn_matches(fn, glob): - """Return whether the supplied file name fn matches pattern filename.""" - if glob not in _pattern_cache: - pattern = _pattern_cache[glob] = re.compile(fnmatch.translate(glob)) - return pattern.match(fn) - return _pattern_cache[glob].match(fn) - - -def _load_lexers(module_name): - """Load a lexer (and all others in the module too).""" - mod = __import__(module_name, None, None, ['__all__']) - for lexer_name in mod.__all__: - cls = getattr(mod, lexer_name) - _lexer_cache[cls.name] = cls - - -def get_all_lexers(plugins=True): - """Return a generator of tuples in the form ``(name, aliases, - filenames, mimetypes)`` of all know lexers. - - If *plugins* is true (the default), plugin lexers supplied by entrypoints - are also returned. Otherwise, only builtin ones are considered. - """ - for item in LEXERS.values(): - yield item[1:] - if plugins: - for lexer in find_plugin_lexers(): - yield lexer.name, lexer.aliases, lexer.filenames, lexer.mimetypes - - -def find_lexer_class(name): - """ - Return the `Lexer` subclass that with the *name* attribute as given by - the *name* argument. - """ - if name in _lexer_cache: - return _lexer_cache[name] - # lookup builtin lexers - for module_name, lname, aliases, _, _ in LEXERS.values(): - if name == lname: - _load_lexers(module_name) - return _lexer_cache[name] - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if cls.name == name: - return cls - - -def find_lexer_class_by_name(_alias): - """ - Return the `Lexer` subclass that has `alias` in its aliases list, without - instantiating it. - - Like `get_lexer_by_name`, but does not instantiate the class. - - Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is - found. - - .. versionadded:: 2.2 - """ - if not _alias: - raise ClassNotFound(f'no lexer for alias {_alias!r} found') - # lookup builtin lexers - for module_name, name, aliases, _, _ in LEXERS.values(): - if _alias.lower() in aliases: - if name not in _lexer_cache: - _load_lexers(module_name) - return _lexer_cache[name] - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if _alias.lower() in cls.aliases: - return cls - raise ClassNotFound(f'no lexer for alias {_alias!r} found') - - -def get_lexer_by_name(_alias, **options): - """ - Return an instance of a `Lexer` subclass that has `alias` in its - aliases list. The lexer is given the `options` at its - instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if no lexer with that alias is - found. - """ - if not _alias: - raise ClassNotFound(f'no lexer for alias {_alias!r} found') - - # lookup builtin lexers - for module_name, name, aliases, _, _ in LEXERS.values(): - if _alias.lower() in aliases: - if name not in _lexer_cache: - _load_lexers(module_name) - return _lexer_cache[name](**options) - # continue with lexers from setuptools entrypoints - for cls in find_plugin_lexers(): - if _alias.lower() in cls.aliases: - return cls(**options) - raise ClassNotFound(f'no lexer for alias {_alias!r} found') - - -def load_lexer_from_file(filename, lexername="CustomLexer", **options): - """Load a lexer from a file. - - This method expects a file located relative to the current working - directory, which contains a Lexer class. By default, it expects the - Lexer to be name CustomLexer; you can specify your own class name - as the second argument to this function. - - Users should be very careful with the input, because this method - is equivalent to running eval on the input file. - - Raises ClassNotFound if there are any problems importing the Lexer. - - .. versionadded:: 2.2 - """ - try: - # This empty dict will contain the namespace for the exec'd file - custom_namespace = {} - with open(filename, 'rb') as f: - exec(f.read(), custom_namespace) - # Retrieve the class `lexername` from that namespace - if lexername not in custom_namespace: - raise ClassNotFound(f'no valid {lexername} class found in {filename}') - lexer_class = custom_namespace[lexername] - # And finally instantiate it with the options - return lexer_class(**options) - except OSError as err: - raise ClassNotFound(f'cannot read {filename}: {err}') - except ClassNotFound: - raise - except Exception as err: - raise ClassNotFound(f'error when loading custom lexer: {err}') - - -def find_lexer_class_for_filename(_fn, code=None): - """Get a lexer for a filename. - - If multiple lexers match the filename pattern, use ``analyse_text()`` to - figure out which one is more appropriate. - - Returns None if not found. - """ - matches = [] - fn = basename(_fn) - for modname, name, _, filenames, _ in LEXERS.values(): - for filename in filenames: - if _fn_matches(fn, filename): - if name not in _lexer_cache: - _load_lexers(modname) - matches.append((_lexer_cache[name], filename)) - for cls in find_plugin_lexers(): - for filename in cls.filenames: - if _fn_matches(fn, filename): - matches.append((cls, filename)) - - if isinstance(code, bytes): - # decode it, since all analyse_text functions expect unicode - code = guess_decode(code) - - def get_rating(info): - cls, filename = info - # explicit patterns get a bonus - bonus = '*' not in filename and 0.5 or 0 - # The class _always_ defines analyse_text because it's included in - # the Lexer class. The default implementation returns None which - # gets turned into 0.0. Run scripts/detect_missing_analyse_text.py - # to find lexers which need it overridden. - if code: - return cls.analyse_text(code) + bonus, cls.__name__ - return cls.priority + bonus, cls.__name__ - - if matches: - matches.sort(key=get_rating) - # print "Possible lexers, after sort:", matches - return matches[-1][0] - - -def get_lexer_for_filename(_fn, code=None, **options): - """Get a lexer for a filename. - - Return a `Lexer` subclass instance that has a filename pattern - matching `fn`. The lexer is given the `options` at its - instantiation. - - Raise :exc:`pygments.util.ClassNotFound` if no lexer for that filename - is found. - - If multiple lexers match the filename pattern, use their ``analyse_text()`` - methods to figure out which one is more appropriate. - """ - res = find_lexer_class_for_filename(_fn, code) - if not res: - raise ClassNotFound(f'no lexer for filename {_fn!r} found') - return res(**options) - - -def get_lexer_for_mimetype(_mime, **options): - """ - Return a `Lexer` subclass instance that has `mime` in its mimetype - list. The lexer is given the `options` at its instantiation. - - Will raise :exc:`pygments.util.ClassNotFound` if not lexer for that mimetype - is found. - """ - for modname, name, _, _, mimetypes in LEXERS.values(): - if _mime in mimetypes: - if name not in _lexer_cache: - _load_lexers(modname) - return _lexer_cache[name](**options) - for cls in find_plugin_lexers(): - if _mime in cls.mimetypes: - return cls(**options) - raise ClassNotFound(f'no lexer for mimetype {_mime!r} found') - - -def _iter_lexerclasses(plugins=True): - """Return an iterator over all lexer classes.""" - for key in sorted(LEXERS): - module_name, name = LEXERS[key][:2] - if name not in _lexer_cache: - _load_lexers(module_name) - yield _lexer_cache[name] - if plugins: - yield from find_plugin_lexers() - - -def guess_lexer_for_filename(_fn, _text, **options): - """ - As :func:`guess_lexer()`, but only lexers which have a pattern in `filenames` - or `alias_filenames` that matches `filename` are taken into consideration. - - :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can - handle the content. - """ - fn = basename(_fn) - primary = {} - matching_lexers = set() - for lexer in _iter_lexerclasses(): - for filename in lexer.filenames: - if _fn_matches(fn, filename): - matching_lexers.add(lexer) - primary[lexer] = True - for filename in lexer.alias_filenames: - if _fn_matches(fn, filename): - matching_lexers.add(lexer) - primary[lexer] = False - if not matching_lexers: - raise ClassNotFound(f'no lexer for filename {fn!r} found') - if len(matching_lexers) == 1: - return matching_lexers.pop()(**options) - result = [] - for lexer in matching_lexers: - rv = lexer.analyse_text(_text) - if rv == 1.0: - return lexer(**options) - result.append((rv, lexer)) - - def type_sort(t): - # sort by: - # - analyse score - # - is primary filename pattern? - # - priority - # - last resort: class name - return (t[0], primary[t[1]], t[1].priority, t[1].__name__) - result.sort(key=type_sort) - - return result[-1][1](**options) - - -def guess_lexer(_text, **options): - """ - Return a `Lexer` subclass instance that's guessed from the text in - `text`. For that, the :meth:`.analyse_text()` method of every known lexer - class is called with the text as argument, and the lexer which returned the - highest value will be instantiated and returned. - - :exc:`pygments.util.ClassNotFound` is raised if no lexer thinks it can - handle the content. - """ - - if not isinstance(_text, str): - inencoding = options.get('inencoding', options.get('encoding')) - if inencoding: - _text = _text.decode(inencoding or 'utf8') - else: - _text, _ = guess_decode(_text) - - # try to get a vim modeline first - ft = get_filetype_from_buffer(_text) - - if ft is not None: - try: - return get_lexer_by_name(ft, **options) - except ClassNotFound: - pass - - best_lexer = [0.0, None] - for lexer in _iter_lexerclasses(): - rv = lexer.analyse_text(_text) - if rv == 1.0: - return lexer(**options) - if rv > best_lexer[0]: - best_lexer[:] = (rv, lexer) - if not best_lexer[0] or best_lexer[1] is None: - raise ClassNotFound('no lexer matching the text found') - return best_lexer[1](**options) - - -class _automodule(types.ModuleType): - """Automatically import lexers.""" - - def __getattr__(self, name): - info = LEXERS.get(name) - if info: - _load_lexers(info[0]) - cls = _lexer_cache[info[1]] - setattr(self, name, cls) - return cls - if name in COMPAT: - return getattr(self, COMPAT[name]) - raise AttributeError(name) - - -oldmod = sys.modules[__name__] -newmod = _automodule(__name__) -newmod.__dict__.update(oldmod.__dict__) -sys.modules[__name__] = newmod -del newmod.newmod, newmod.oldmod, newmod.sys, newmod.types diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index d490fa249fa7a8476e7cd38c492f0ac917455cd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16434 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc deleted file mode 100755 index af4c1d91f6c40b85ccbd1d9e507342ee2a155d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70550 zcma%^37lM6RsWN&rK_s9B(o1&!?5*)PG%-E1IVJC&OTXs(mk2LfT6lxb$4~wmRHqV z0g4KuqJk{4FNz2Qiu;E9zRQ4$`dmOo+%<}*wD|Y`J?Gr}UR7nNOg`yXzkBYv=kD9N z=iT?gv9ZD~{(b7r?^vzhv3u8Fi^KoRIPm$;-LPxdTX$7<1-pXXZ`vIU1u35CAj2~o z4D-wdd7gz}gy(25#&bNF;JGK*%X43F9nb578+hIr+{E+d;1-^@29M+U_}~dVpBOxe z=Vb8YH|-{#rv$g*dTQ`Ao=*>+!Sk8H6wlj({XCx)O!GVt9OQXNa3{~ZfCk>C?NKNdYYoAgPx)2nV=~}w}bX8dKPF} z(E-pwMR$Pij8l6Tu0u+{8+4DNdqK}u^c>K06@3Nhd5WG7dV!)Bg1%DGSAk{}9R|%R zIs!VX=osj@q7$H#icW#2E9hnH-cWP=$k;_tms=n zuT%7`pl?(3?V#5ydIRV?6ulAjCPi-sy+zS?g5DaZ_HDS{uJm_+-l^zapm!^J59qy$ z-Us?FMc)m2zoPE}eL&Iof$#;N^(xc(3N5aZ*Jj*mmZ5GbXzG$^Ae3mR6G z1LYMJKqHDqL1T)>K@*Dhfc7fd2f9wt^`ILR-3Yo#(aoS+6x|AXoTA5ro}lQ7peMQ1 z4h56Ao~-nzfNoRtRM68DJstE6Mb89HDY_lBU(vHb(~1s&4l23>bf==bK!+6F4Z26s zy`X0+dJgEhioOE$JVnn3y+F|mL0_rpt3WexY7gU@Rr(RoQANi<#}%Cbom6xRbf2Qr zpfifjg3c+L1KqFaJZN6g0_Xun7eEgxx(Iraq8Ec6QuGqgOBH=J=#rwBfr^S2L8Umg z0j{#rmq5#kRzMX+tDrSSRZvY)9n?_N1YK4Xf?A5&pmjwXpiMIz^xvQ_D%t`4 zkD@Pu{#Vie1N|Q;#n_nAu`$Kin9{K^6{JBK_058Y73DyAMFr4^qEXP8OKmC`$2Fn! zJ)pgc_JOWbbUo+>MK^+OQgk!u7Dcy$9;fK>peHDLBIrqqCP7bD^c2u-ik=F3nxdzJ zo}uWOpeaSSgZ3+W7HC@00nouXwRhmUQ|Whs4k@}DbdREYLC;q79ME$WeFf-wik=U8 zfua|JzEaUwfo2pP2F)ru0y?Vb80fg76QGldPJ!-IbQ*L<(OJ+rMRTD0J=vzRqQ}nH%Z&UQ`pw}yU1L!*xy%F>#MQ;YZB~I;k;(Dvn-v)ZS zqIZDaspwsxcPn}i=)H>G2l_5W-wk@dqVEBHK+*StKB(wJpobNG81xZE-v|1BMIQzI zfTAA+{g9#`2K|Vl9|irGq8|tSM4Z~6#Pw53{}||}75xn8XBGV%=;syv0_YbN{SxSx z75xh6R~7vl=+_nf2Iw~x{TArA75xtAcNP5}=;MkW0ewQzCqcij=np`DsOVFmKT`C^ zpg)OI8{zs>rT-b|&lUXz=+lZm1Nuuve+Bw$MV|%zjiS$i{#Mc7f&O06KY;#G(LaIy zS<%0M{#DTx(7!4AchKh*{Rij^ivAPyUyA-4^hHHGp#Oa^w@liEUJhS`_D_;(jS5yFvC>jNgDH;b&DB1(st7sqSIz`umZcub1=q5!s zgKklDE9h~G9uIngOKm!MBCaPXeG>F!MNa|Urs%1lrzv_m=oyNh37S%LJ7~Y6XMv^_ z9RM9vbO-28MR$P?DY_eUkD_})&sOvt&~p`i1?YK-o)3C~q8Ea`GEVJR;hItUVbH9i zBcP*-j)9IVIsrPV=oIKaMW;b$6rBZ~Q#1#?nqgV@;o9j{5f)Gd6C{w#TncELkTE&NV zMLE*zg*|DYux2$%!Hk$xv00rO78w9daI?DPejDz$?tV+|x6;YoejwN`RvXJ<9`!gy zwOC*BMfI#fF)xS3TCEsfsyEujcBN65B0GD`imbjwX0*r@B}G+ViuTQvgnhmgR+{ZY zKB{L9imIp~S{kA=-W`7O(9}>g*6n|Ya%dfTcy}jFIkcuyoyQfM&1$8jX_V^fl69za zy|2U`>OQ6Ra7KH(qjjkc_eqhBcKeW=(e8lJP_Y$q+^~z3-1_BH(z)(Y64KdwRXS)G zLGiIQjG#!v2#QlF3Iv?t@!Wf&VSetq~D(SBO?Q>5AoJ|zSqwyLk8rwy#3 zu(VQcZ#T=tdBhrHP@PJfRBMbuwWUoWaE&skZuus+9Or50wn4G16kBWMYL%8o2yJQl zt6~ksEe&T>m{}>WSA6;h_WN?H(JqITQk2m!$j%fcFy%2!F$uK97G|o|#O z7j3akywWk`*IGF}!oo`cx__(yd-*NJw` zi`*I5h}vbO6x-!iXX3=dnbVW|C%p(#n_EH5{`&G=V4?w7G-IB}661B6C2=Xw zYXNSYskf_Pcc1mOIk32!#jwQ;(Rt#`*@e^RCm*b|S0=lKOfD3|<#L;;VqZ}r=ox4_ zIY(#iO(e%vDuN1?k&%^V{L+ARgm}YNF=IK@G2Qv1 zOGpW7mym+eBwM<#SLSnzt7V4cjq+@Fu+HPVVoq4DiodbATI!15vN2Z#Sw0WuE9$WbV&OFS9<^e1a1CX4)mm3FaIVrkSFG2#K? z=!}}vP!4NZ&%$vBz7|0TWHKEa& zFj%kD8$P0eE3wk0YGth)4ZASJFkH0YHpn0cFz&}`^P<$ku(9bP=sbDQ6i^gS8oc~y zgEydaK)7is9+?T->!DBZHI|Ob%FT~6s4Nw+Eh+c3lF0%?kHOcE(I;t2K<&wf<`>L)LM%Q;t1}#=bk&C z8;vDcyd-4UDo&+4*Gs+mHCc1HIlWfiZgp3B{cT!*JB2J1`RD|^W$;wm(S-1>G}<%`pR^50TA>)zr-s6gkW$5!H6~tJ(5|d$ zZLO@aEJ+5VI0OrWO~1Svyc3kflmpU{BE(dhI5yX!^s+u{`mFPG#iC$ucSB?Zgn#Vt z;n~B*R>gP3oq?mpqHuQdgqhSp6jN?-v7}^+2$vf)U}^+$6B#(lu}NE7Z$?=QB4v*l z0;?qC`f@jFG^Ct(CAutI}UbxO96*372ke1*Zq_+m|j{v`6wk&msi{gC8{B z#R$X_&QfY4LP`}P~{c(zbk;9e6h4Mw; zD&8pR&l(M>SwDR6i(JasKs+|u=rVD*T4{G^OYw*vzFGto61ps;7ln)NfIcC$cqkyv z&FXrKbV_;`r3(e+lIj5RKH-bZ6%y)9amy!BCFeYqMCMd(t++-1=IPQ|6A)KbZ7Ui- zTwO0W!%E#x&z*t0?nTc{d-RYB&Bt^XPqhi~tB2S#${mh39pSi?Mar~*DfEagq=Gnw z>@ISL8-7=Ljk%$L5({Q+pz@qYH9Wn#ue1_`iKE4AGf}A(m&@pTw-zhy z8jAab(5!4hhzheZ`T9J)U7Bu2NyMBf$wW+E=&A}kGS=#^AHt1+5-i?(kFWKA7XjlXD3dI7%C*I6In?5ULLZ>nwJc&n#hUPN zl28<>DZ0}od|c6jjJ+^hY#ur7W6}PSQIfW;VpBtqv62rkj&FS~Y_$D=Hh9b~!QB+@ z&IkdYQJ>VHPIz4gYH7I2q^CM?g^Tf$Xt0ioSnRY>K0*(HD*RPz;HHVr%tm$T)czV<0Tkr)<^V^AuTRf z_J-mCLD)uS%iGmB*Ws#ETh?fr67_Z2@;J_x5~A_hrE-0lBSC*qW!vNY?6IRpmSMZ( zd7@Nl=@0^?=`C5#CT7t<*oxJc%bcX6AoO`X(LzK)^c2QL!vecZ2^xyGu?bWEIy3Ph z(<{Yh*=swmQPs*yndq+$$^2abxC4_t zvn%CtySUPI3ZN?b&Zy}4_d8z}|D&qlM~x}moiTN_nw9oag&o+4IGvxSCN7qqP_`%N z4SJ)CLbTPr6(J`Doqa;Liii`F?(7pawsG(GNh++iVtiefzfWXm1P1T0L}ojay=&2~ zU|#GkZVC7(UN@=Nqj>b_ytbyhIDGt_Tdx)y``z3x*ZV}&v6jDYt9qD19V?LrLLDoN zay|$ZK`UuA z`b%0UgiW)x7ImETFhlXsg_C4e%SFG19lSp(2`7n?A5D}3)rM6{S}8#(?!nc@DmqhN zyE-Bc&l*u{*C69qb(MOQ8LGN!XgC(qL8ui&@eg|OPdpz-)#E%kX`V=jqG`l6I z=)5jrI+2_sn}CVLZ&D@`lTdRtxm43ev{aLctakvIF2#vr@QJanW*ziKN=q#aTgqY{ zWP)w2V(o&$suioxxx)pyMh_L>Qhf1uE1WgU?$T~!gFVvl!_;>TuS8B~hom|c_ z;T0d-!l8kprBUzfiNj7>V6rxWaFf?md922LQkvE`q9Kd4uBXql{$v1}3oNQ#45ibegLw2W%A7+8X&fyC=RlbP!} zJpTtN^3?49{p2pi=CqS4f%jNg&C?1*X|((I%g+iwQt~B+7rJJRi zoYu$=MF^5UOG!_Z)N49$;yMLKD78e7Ok)FB@n3JD&xtt~ zhb3N17rs*3&K@T^_9a8?yCtQu$OcCXI+FrK@;X+Qy2W#W=Sv(g`@u}5jykF8L)cN1 z$V>xgEEkt0RmduEe74m(vRbS!`z^Cg3VTFLVf2HiD)rSOBFS%Sf1tdbyx>*mVakgG zt9OaoACCj-ahH^tE|I&!SxblmM4M{ec zu-@yv*1AG}Ch{@nob4RkhIEi8&ZGr_Gh7PmL{oB-Ic#qw^d_w&NAC zhA&7)jgAPds+MwjDM_A;&I)clHW>7)>IaU@&>GVveCTBBl$H#^>zax66$Ho2YvCA~ z-EMNAZHf~Xox5tbL* zTT!OD9ddM;l8A8Y&z8u@E-+>GHN?oQD)R(Q!bryQk1)tOdMs!R;nPY#I$P{FNHPc5Zsh(Kp z8|xuk~Qb$O#wD!17+x{P%O)=dzzM};IP!xdHH1wAE0WAL*Gk_|l!D;Umkw zQr;-do0pEMzn=!eCLI}P#~&yL%TfLaoymuIw}eOwMTSY~W>IEceuz_=Ge}lszNf_< zMCg78tDbb1t0&#j-U*kQQ=TZJ^Qkrk;(1c9{>ONxoz*YLQvC-7 zfwNdp=NwA7rQ3J(SF-1jm8I~Eusp)j!k3P;3i`a#WKqLP318|*e|-lse{tzpVBG92 zb$Z;A6{XzWTVNW!cj0X!cIMWc^s?0#|X?CqT4Vk)Kk9EA^L91IR z%pkl7RAvXbss=EttwtSf7uZ!Zeo`Ld3ni{)A$y1TMSG8IS9JgqBMDbZI|I+{0twI= z({PiCImMXLr9jl&qF~OjtmkC=!qS`Yb1$6GyQvY=@QdhHoOF zooys^Qd_{b&~aHomOJeo3bIxdU5~dHPMD(n(c~2*wTzC^M-SVZMP)N8panbR8?88_ zk)w=Oakm((TPrJTl(irvGiwx*#O7R1@BKvLIQJc`R<9~-S zmGV~HF{pc-HZbmvb@d$16UDSyG?_&bnNp%}2LCE;KWj8uFIo_q1nY_NR%2h>GfG0NG-1)0#@#}^ z`)3;qQ$S|LFS!P943J)7lsP&rzswpEU4_0~R*j<+kAm?UH7T|T;Zo^2cilyi_wE`g z*7Jw8Sd%T{6MAP#*+zEFle7tKS-vn_n@}2pvexdV(pp8Ks)$$kky2>M3a!h6-c4N= zBHCke=f&c!TR2Tvg-^oQ-Gp&cx~z)lpztZYGE(j&3wAua~dV;g0Ajpm`Er z&-wP3mDl$U8+i0k&pgP#GWaCQHj+M}G|j(5nlg`jOwPBaouqLK)qnC-kdr4buv3t; zCJW%x)O(Z_dq-nOw-~oMFZO9uL%$qjxKbJH_YUcLO#u)n%+_4vq73(Fhdlhz+=@D7L1R zCQ~lCsblr-TEVq)Bdn4e`6V|g#2{2ELP1~Cg(&=mV>0&p7zVD*m=r6h6EuM4N8PEV zs_2#_nyQ-H@FRUVt{3GRIaaRM<4HBtfj4V3ZAa=$lIt?SimbY>y!h$fA7debkSKqw zvgG&ZgQtfj7^AeX6H8iMDW0xaD$crM{8$Bh-|pc``y1gHjWiqz=ll{bol{AnG(Vj3 zTWu6&p}ntntQFsA>=^GMc6VddWam7UI?63M4nHEqO~BEk@nh9S&jILQlb)q&!=0_= z2%7HGpQ{&XTBT*vX(UhP~X>(sS>a z()n%ajzik&o_mM<95dH3d=sU*4>WSDv4x$K?=b_HZcB|VPK@Z28e|GxgrlT3mYS$f zs+A^h2u7JLY?<8A@!a|2l7wdHUXdA$4d-$sLRD>ym`!t!?un)lyuv_&5whCMy&G}%IW^UP2hn5*o z!b{SX{0YL=wD;}wt{Gx_Gw>hfYdp9RM?6Be(#ah!#)?4Ii&C=lWSNrXv_Mp# zL*WoRk{$XmCkL@9wRjhf%S%SSw+&Q~EemH=HoBecGSwZ3`X-}PgtD(!Xh|BeGZ9}_ zw)QjH6y4Mvd!*Lbt?RnY2%TYB!$CwIB_{yOlHQTuarSM)VT~qC{sMgr{V8ePXmI}Ucsa;n3I27%e`l}riWW8YGc%u;Ff-iq9h$KM>!viy2+_Pp>oTfXnv&;Zb*AD zr(e8!Hm8=`s0Wr530XKEV&~<{>a{XQWt4;(DzhwpQKqgxsT$jsw2a#i-8uc-mr68H zB+fh4PUcWkY_$58nw)fT)L^UX8GOO6=VTYEsk| z@yikU6UD^D^>;**mlldfufNh&AJX3!q$~;9R8qgWs5A7x4K>(8ob_KG2Up{ z1)_Y09j&XR3nyBM8dI&oqRff;nUgY5XI8{7O7TNMNJAGl(9cNbj|lEL=qc8Wl86xz z_z@&``#b;%R>2d}I_)gb2UHu6z1l&{!&&8Ewy4d{P60awb=ZlYVxv!GWjGW+G18%@ z0|ga$3CvS5TQev|J!;9LOy(Mo8P!b%b*U3w+&21&3^NR3umIcIt|uF&tTYcKSq5zV z=I$qAwWuXQ(R9V*mUwv)>jk>*Z)U4$iF_)p-5;d=vt5(A(Om8@EYO-{;C9VPn0imA zHTf)ZX-#)PI zEi)q#pPiD6cm5>jwoce!L#Fk51=c7n0i>wKMT%*+g5>w)?76d6fQ6GmSGIM$&L~O7 zCi+i>ttCH}a|3>4GT;2k zwDXKXYHm)KFYyAf+-BIxS-{DAiD;OYctuDwRKbF1hx&tHdB5Jt_v=gF{I1aaI(xm0 zNoNxwlV7TGuUmcsOo&V5vwH&j1Ux%Qz_UpJPHByG)p}H(?F@`y_NR3ALR;$O*^^9X zsY<;fR`|Mp~l_^!S0i+c|4?iyn9XlX5qhR5wW)8&Qj{t?yH6PAnhfn$)&0qz1 zMYl%L&`H_u3{|9RNV5LM6>poQla1t!UE3rHMeCMd!pcHl!pg6o;wyN`7HjlmSUTN^ zUzHAJaG>7K&rY&&rlXO2j8~ZkZ$GeE<{TXjFdORRAQ)c=(b&mWagmd)c(pKaso!2H zW5!yeTe?uhljDw0m4I-HwXH*jUxItTDC=(+>I^i4UX6C2LgsF{OGsLpzCGiOhE}7o zQ)iCO&lM9T@xaZ)Drc2g`K&}aAB?ii#nhoynKLNgRi{16pPE0t;76N*J#m%kD@qGH ziA{?ONel}P`6ZpQl#%{!wI9}_xK&FP z8A-0sv-TUNEqtC?oCh;|`Wv``ky0ce;Tfo@hnYR+% zLT68xuP(JZIXo3n7*ae~K;I>Mb^*3v%J!RWb;)pIpV+$^=wh%)yn$4ghYRVCi@SU* z$c?&c?jpMYrW@#@D|@6baay+fPS-mVr;@@_)9iF-qAR>vXj2Lb#=Cs5*zRQUh%L8M zoxWrFE@lmFiSBtFQ|YEL=;Q9L<40L)-gqiWwt1VDG2Iy>O}3zvGV0`GXXl2lD7rYh z+k}y|b+R|8swa--*WRfE-ZmS938`T!KkmQGMQ%D3xLyTBy9aL0zv)a~0p1vLxQyl`yw3=Kb(45w;4}R$Xg~Wt$LNE0l&n+73EL0mSatnUOL0f za{QQ%tN8et1(fPtcdz2xf8eV$Tc`_+3a2od^fyEdK2sI*%6p>Bsrhqfxh{fi1KadTdjRLqcEJ3EZOiQLF zyt&6~SbnFga`M6c*@)nt$*vmg7Y`}ec)_m%BMSE1S)?&#v&!WScVw9bHd}L@zahK) z@{S`b%|JOv=PFGxh2@mJv?g@!o>|9mmc_$XX)4oSEePp(dAlo~{(X*%pl7=(?A2aI zmC!0*jz&-6nJf+lYgZ(cTop9z0#U14ezt%>72z0Uj^q+F!shSP{6%UfB{&n7v5Rr5BQ)UD zil^9m5GHrexZKojy^|=nqP?fqtCiwxuW94J1DI6_&>7QklWYUTxR-QfR;#kzE2y^~ z)poVlf^z#=;UvwKt|M|ZpaABADy1U}Owq;0t22$Pr@>NG8ertqdb=Gj#Y3HHvPPro zva9OrTE1cKcIY0fjia~eh;We_Z@8V)7OCclviJFpJaBn_Iof?6DcLO>5)Mh-TaLN= zit(VQX-+|aEwv^;vOX1nYFn2<;Lb#Mq9H`1_u1~tm#3Pr4?E&iIvQRx|ERzlgzJVo zqu8{p%Uic%p57V5Tpg<%=bTD+axVDoH1ApEVdr{#XOwjYoW-iTuEUS5DtMIJRkdR$dUnfHk{nmI7BiZzsf0VzE zONE_`!J6we7^AeXYXbFGTJ)N`(6VsfdMml*XJ98=6V5230i=_!ab%QHBJ-NG5e~~J zDy4MNyuavA?K#r$`L!w4&NxzX#G$RrfS*$3Tx0As7a%o~mj&%*%DlXrr#^(!Hz(yn zNIQd!>s;RNQ*tz}tfGJP(d$51Q0=c5W18MBIVop8ry5M9_aB>^e$l-8*5F-U4?X9( zFO9C(Xk_H=U4$kh^1NQU<8p;MxNGrbG02`skv2by`pfTcEWo4eV$9>J-HMWc|CdCHeWM7ny!n{;s|g)eLt*WEsquhQA=G(LAT45*~L!&gJ>t~BwDMo(iN z-qr73BgcZnjwnM2N9r;lX(ANG<%0(|sUvBOihf@m{=D1Mb-G}@s8qM-8g;+?9DFEUg_%nsf+**Mk+Ynq5-S5_b=!vf!s$wF z(f5wQt2NZBOfn3S8bk|P!lKIlb8?SZ8{w)#q(xUQuO~14$bcZ(78(KGVs*np)ku~W zN|u?g*e=TlM|{c36x1RA<}<0^B0)LN?VZXxU6gN+(2wnlB-(WiCMDU;dA*nPD0dWe z_IS@pe^~)Lnm8tZYeBB+QCg5|Er$HybXA}@-bXn=?TXi*q;|*a4^4Abk5W}VRb^5# za8<0Hai7o7$^Jut&barQR6hoZ@i@_@_@}z`c!2v&^n5`2gdxAf?h7z+n$JksfbVP1 zv=IrN?p~fn`AP92*jN?L=^C#CEke-dXl-)TiSQZH;5i?hkU1X` zOobrAcdQ16GA`KQFEH2+kCLEkNg(Z73evKQ-ID&gRnezvYqo0L2K}t<8Z8F4#xgc( z-imba`4I;)gks#YFvK^ETY@wDNvm2$)5VYXj+dK`!oac~cTl(HS(hbZs>+XvSTD*T zx@m-X?E|%M69xm-yIzcqjZ|J*C|bSxtK%`qigx16tXSg8Nzh{|Ulhu``%%Qiy^w^I zmRKu^8Loa#D+Q(oIgLn&xUD57q-gBS>^!%1)Z*;_q|7}zPbJB@TB)TR1n1zq%Vj5u zo)G2FoIG>XWnl0sw^pfP1R?BFB;wM7pwCX!)~oFbU(0D9tcjI(XKz9X%kp`jpmRe) zDpnZ_`I3XQHKL!Je~i&LdCynaE&8S$3Q)PVN>g8U6Cc-G&YU|Z_h&h=_JZQDBU0kS zwMIh>PNNjSbr=PHKjZ!Po|!*#Zr?xpG7;$!L)UoOt3g0nN$GMWHO#rTW6@5ZBq#4tR=ECK{@7 zI=9#ggn%ALMv3B@id+jnPV)&r!J|_+E3UUvxHGOUtfa&(<=ewoGpgwWmMUj<^K-L>`? zu^n_hni?%v8gt)fqo4gz6#gpaDuusLr7qX}x<FcC4hjOH9@8D(=u3(=qF9oTrcGEf3uwv1BgDI7g3?4-E)Q$ zTE_b}pSbZc>T3@pT^>`JXap9|$M9A|y;fh0hBmP~-IO~Iv6#+ED(Z_;p`~C+e(H-& zO<7T%n`())S#6=P?NQHmN$%X%-O9vb)Cs4c0k(vZ#0~$jN&@AV7EJ<`GR!o<$9o`!f6HdkMh$1!Q8>ew z41GJiM&}kzI=B2FJ%bLeQQsNSAFh7q6ChKmFq@XOsnHruS(mh!(1r7obN1bau6}d} zEJ2R=#;F$%Wt61d0l(NvE}lq)C{`L1!q>ZG*Y%f*G&-p*u!8azCJ)tQg)aSDRsm)a z#+V6%eK54oSgkAM*co~6q^ldLu|dvLNo)=sr*gO$WN?m??7SG6`MK?%35r~BZFV(7NN@D!G*9`;sb?i zl}Q=v*13KWLo{g9o6s1^;PF$0FRjEof2OhOXQ^wf0byiR=Sdcjy4qN$wd}g`-Zy`M z7-e`DQWnzf2OKdTGx51qbjEz^LuC1-0jai-zFRqLCxYmPBpnt1H*KM!SgN0L)&yOWvfer}ROX)3n`_42vbG$RhMTlKWCT%d|qTH=DI!*JIhNi2r zZVLJkXlVFN+I5LE^aB3HQ=5Fp5ydW_GjWX#oyru=LBm;K8mLdo)k`!@QJ2|EZ^F7Q z8+uZVb_G)vpS&BB82G4TDY-e(Qn*)w8a+wmvw9QRRbCg@V>Pyw*Tn};_aHW zUwJ``6O=oXEQ0j9^wb&FKpAFZRQWvamd8CbnakC?_36ILi;vdg<$LT$Ud#47RtY+C zrd7h=!na6$J2`7KT4T1RzQ}HgJ)5l7Xm;8h3TM{m_-=u`YB!b9H!f*ELeloL&XuSH zkfGFVZ1ZPWH+uGc(i_ufSaQOhuHgf-^mC9GzdfJi`1N8_n>n*>FBoQO+q~VQd<2VE zi$aXX&uokOv8#pJ!GW|;^CE~|4Omk~FU5vpZM8~g_R!y}_7P@E9E&nj;$B%@ro`qE z-C+DzH&#ttw<(4b+-r(qQaWOwW6)AP$n3@ic@$F&=W~@Q26XHPX%L!kUsI;sG#Yi4 zwa^Sj(iXPc(Wopq<(122_Tv<7?@nRb*nO>BOj>}|itafyKB*NdzbAjY`(AX7y`$XO z_-(bprpa}=A_-=ao&pn#tV|WyiKsB-&(5Fp+JaDSsf*G=nc}64dP{7GdCJ4R?F z=rtvN9#Y2qS#0-w$?03J>9gGaCvCir&s1uM*a7kbU0S@-{R(kwTAb0Ivpg~J=z5dG zuHls%>x8Im42u^TamW%c!+8%3iDd+jKLRfD{I!bF=vnTd4&xnL_(|!7!;VNIhwJ7a z-avOl$he*vlPDuoPUTkbEmCQ|a6hZrL+eQh*#pRL60)VY=1ve2bp=aL_1X(Ia{fPjrdGu;QpYltWnm2$guAyDSoZ11Joo( zIVFDIG%6S*pRM>>y+&u0Z(zbq2_aePR|==%Di|@|TIE_|uvUSYgl6iMEfmB^a~EG4 zNK&^&XJUAwkh`v*)BSko@#4XpKY9M>+-Yxl(zW#})bU?!$t?kXl8DPW_MuNT+O_rM zbA0-q$gm@7vowDdp^vC=c76WL1=kM-XSG$^h%(BKs7!qwx0MKwM*={y z05vXtmFe1;NAX!Ko;>g49=N@z3vUH2f(E*D@;v38Q{pA4!_HgU0+lGdkZCM&Gk2t9 zEO7EhA7x~VhTQq#v{;6tL=(v9`?B|kWdl7D)2C;r_^22B#>SSIHa;-ZywO!%3z1`h0icVUt zbeCLC3&;ZaCF;+R?66|5%lK2h9uZx6^=ACme!KE|syDBzU3p!#ysm0qSHmZnLgMO7 z66PG=T8md`x9W=P+^oJr8f6;dM=Y|S(=oMH)k&~cbuQUH`IVS5M^%A0nd6funG{2=ZYob6L21o^gYseWG{*4jYD!17)Rw2^#U)+U07QP1U+XowbMZa$ zgL^Cb|0o4B2~B}XC*zv|KOzZB?p)LBZ9*;P6a)<;KN?0s9Hv=}#?J9Qy`w?$)l7a^~=9mMi+zy)s8`JW!$fT3XSNep%Z=p5q=@#!i zA13od#=w_8Bp6?Q;Ba0NHb1MI0Zo)pt==5!F~sK60ZGU(HuKWGQtn*1Jc))w-jPi; zLQeL0pv~asRDf8H$+A-lI+RyzY*iLB4Zdwc-a)Nk8#f{=l*xt$)JCeP zYXqH`EAo{-xlg&rJR&M2bix(TKf=YyjhwrUm`f*X*P`ZMW3d8c`ZHXKF}sEYe9m1IhNzb zVqXlMJ9=EpQSTX*bSUsW2^TfR5;%SHtX~BkCb{^IrR@-7Ec4Z{iVwaxN{uv}u`C17lv|8d-&`4hQA?|CPSVw#byTL z>{qR6`25^TvQ!&ff-n*}Pi-UmE9Fq$+LVsr7Li=*y+w5C?As%m2a+bPm%BtTAG)? zPHV0@Cs!)@x)rrZCpUNcU~}0tBg4&VGrn_)uznxr$V86D7JKCQOAdo?l52WyvhATJ zFL7u#+gul=N+H&<%qVAK zwA5?&HbblD7UxL?#hZ+0HmSrZ#+0;x&OVVP;V-KNwO((%$J1mxClt+&B*J%^B#a1& z;zS(XYF7F9ug|R};?}N29KASqdgkQW$$$xu#W5n2xXKn58beXy@E;cRX(FA@Ga7S} zy){s%@!i-JpJd#}_IlTI6M_PcVqerC$;L^Jtsg+Irx=@2>s@b|zs;PFTi>Gy`Hd7%a zcTRT&ChJ~o-w~ghc=H9b%`P9Joep{iY9v!|8Z(f-@HU~xQIb5r`#wx=x(-|Go&KTn`lkq#w5jZfc@{RGMx(P5E zVX{s2WipbB%fmn(a&>^tO%!ijlV;N;!fMIINCR~mNEY>W)`GaWpdgi#2=leF9TgVL ziF_LEW2BBqz+qv=e=4g*#`Z_1N@(f~YtmI5iw+o}PO8Kc555+jh8VKU4cnD++*wQs zme6%5in*c@-j4P`5QqU+kJ}FgVoWlf_|PZigT9B?<0Y!BF*_1{8w;iCBtBTX%66VW z?Z)Ezk~9+#acDCETG{01!g#j1#&`}Rv()ZWd-1($VIkr7&b78% zD}AHrCuDW<1bpUC!~>{151-_6gh{=MgbYZ~t}c_CYdQ>nRhwZU#7xUUv`UQjnUubEr4iidB5=hOtN&0fHn$;m#!X!R zEbOg>oi9ssS*cU2np;1Vs5&ldw5c4!o%*u=X6Yjrx%-kkBqet!$}AQ;9K+`1n(Hd( z?Lw_gO=ug?&ww_!H??tYtHJE*wlp-6vqLN4bFzhb$znTPFJTR;*vuAa&x;*;=ivut z?~5{rA2@mXNM}TU4p@x&2hW|qZ+>oO_Na(&7j1IbE>EG)^2-fPdjIi`WvH*N4?TKa zA7Y83LgI?-E~d^N^X#f-*{*E27o{c+QQ5Y#hG3O$BySyV2}$Zae&5_Y4kbRUfi)HV z?-{!$?LJFSRVD8jH@D+=j7RR*Pm}wUznXzH${LN1kiE<$zLkFSz5E5N9AM1bsl7CpE!SZR=!Hgo3O5`25bMqda1MLJPU=b>9fcAWR`}cSVqFS z+(fI+CPA}z`(OPoVqX%jYU(?W_y&NFZ(lZoA| zZZv6?421X+_gdRd#{kka_zB#v%+bE98+(6OcS4A2xm=A;0iUlc3#Cm~>XWmRCs@*x z*kLXfmiIv)))_2x`kFBdoaoRs_}(P=+?*GXcLJFFD#>b6Ib)-PzQ~XGur6|5@Q6e1 z(~w8GG&Tt0o5%H&FdaS#V$@0HA@MnjyIkuMFs`0*fbZ)`V>h{yb@B2ED3}0QmvxCK zsEF?1QASBJp=k(h5Y{TLSD$n7xkGob&MoRGvBnHZ(YwgygrO^POaFPkM$jWENxyhm z`niNjQ!}ksj<~|$iy}#BQjePp+=UcxGCv|~G@{s?Yzui(E*(fRLy`8GKR36RcSn(Cg=doz=eCH>&Pc%Jx&S*Nq0eWqHXY?na)oaK6lkwO#q_41A$B6i%w|C?5dV>JvAei_tsOcn(=SvPSV5 zI}1Z1wl%84+L~ZX^lS1`-W$?6xh(^zs19=0% z*YGoCb{cj>QaKE-U5PD8EV(h7P|I=&mk*_T5>g|YFiLT`!iqu`i&}1?kn(fxW~GkZ zbc>hsjVH<@DW0$f>IDgc!Jn`bNm^XU)qE=QD`jOvYWxkE!P6Emg|NyIc9SZ=a{rLM z@gO~#GGW!M{y3AJbeT~oB!xB} z-{?b}l+R<nKA5!hYrH2cym69I6m+6z3Ki?=__N^<&BDFIjlu6VG zTth+|OO+azX~57}VLkw*0g zUV!KZa_3ud7&|jNuh%W7LVp#30XqN$ONe+-lcU6FPgtJU-O)M&p`7%Q323%s5}NFF z7>L=((J%G8hLRNf)Q}^@NrGxS&Su!+>pI-xN5z*bb>S!Kw%74=rUum_o75#Pesrqm zF}6nHG<`M0!&t9>Dr`#wl0>zg#(j^>+r4Yx@X2y4pdOQzFnODRJ#8r8ZI#;z<4;KY zU9*e~y`PKAi)3H_B9d+?!v|VxVP|V3edweM-`C4TUnB z%5tEkouWmDgkZJ=!qFAK)aLxmyeo*oTY#2)%K~P4UkZ#!stULKh?{TAx$QJAcT_E? zZ_5KI%K8{>L9|<}5i_l3b-fks=D*n7)}@+RaGdYt51e0Nnr?*K0_lcQiUP~^jY^2+ z_^`{+{Ip2uWHlA@$qH!NrYx7Ft?4jE=i}EP!f79eH}wyt$7}87=Fgn=O+`!^IwSM$ zYL`i-BPk86M^ai0w$*EKX$*zJE2UdP;kgMK5f#Fn=r*&5M&@VaF zjV`F$vPYGd5?YL|HMCk^GdaMmuq!m{XF{{!_U(V*s<&AWw=DrAKH2P{*Up2;-rB!mPVSw~n$~xJt8dLvn)deMjO7a?4Xf{Yj zBkx2YzOG@G)S#(VDu)lzg5%mW9%>WYaNmAhGr*=?D-0i3VTR&nfRn)^S?|A6W}y@W zI&-R34*1@LK3hC(umH$t`OtFfr9$&Mqb<&c0%~IA=$7Al4?ZLh19bYzPC;fk*4o0_ zO@3TL4Y~e-gZ!-|+c{Mrq=lmS(_d|nf|9`*dG-FmS!g7*>r1YKkE>e3NmAuUo1+39 zI9rtsZ7)Lc?WIx$`)c@<6lZo`X{Of6G>v@K7j-RFhXOs2CfzT;V3i-uHXBpq9Z zZ$G;veAg2`Y#(Q-dyLDllXK94I#IcRaiT9ESxDKfjxroAyPLE}lq+r(_Qr$J2#{?_ zcrQXuC8;QikKXn%0cp^;1<0)Z@$5$DM^PKyoW~9s?3at z4youEtLTOkU6|($H-FxCjgBUqv{Cty_Qe_^Y*d29W;DcKrloWS(ix*4Saio}Bl8Um zkK$eFz>d&TR!UZXwPYQVR2R7vT>JCHylM%=Ce9b;Pe=zKH==5AwsJ#yaicVMxxg`A z{3wf>$n7z9`Al)Vff226XYY~nVx?H0G=JW9kR41RD06$H$me794v5#zsB>_$jdZN= zx$!VIGLOAqvIYAunWwXy|JW`p%f;QY|FRYGWohIMS5L`((!PN8MWQ@LCi|64iRLkfaaU2N zcBH*>+AO{5vVQr4Lv%%YC$&{uZaygs+m4zwRSL$3cZY{5H^jzEcQ&K@2vKSGzgD1O z3k1UJ5F0Jp$*^-tMQg<3*gj>l8a9gWV1B`&;*RdoYj1K>?+;f;n}AkCD~NPq6Y{Q23FXOErpCE1GY z(JBgkSd;F+kH1~)(9 zr1{B@Ha~R_1@fIcdS%eiK8-UKt8R&>U34wLaNm6jN~Bq=W8g8{s4~*U%ap+ifR=>7 zC__Wgy1NCCxUpXUA>OhY3ZF-R4L`?&1owOvu!q^b$l$yYa@TG&?1xXaSz}tl#nuRzS2#-YpAUkf)l< zN@-Hw-QmvQ1^IRas|$qddv#P3z=Y=)&Lx|7EuOScq*BSGY}?6^plI0L#EeCIqs*az z-pEW+dyIROb8Lb456Z{m9mU|4L0g!42|3F7V6^;POdV>wW1zO(^$_J3y3S+=o-<&| zfbK`wH9PvN*#Wt6W1$$d4*79LKc13Zm^m^(d5931ws&fympV;RBM43p^|j&=Q@4uuy>U73kMU zoxB$dvo;BSwCA=*&n)&3Yc*KU2%&#JfDNrlNYG}_wx!C_v99`3=@X-9qk3`>A z;OBK*WTBi?@8FgNBl+S<^LUfZw30IjmW;6l?r`MK@9(bB1@yv4j0qtO_PDXy(AT8&Yt0hrnl64qY#u>2x*MZ-Sh~6HlVkhqX3nQHTf~^4?rT| z>!3T*F!W7}q+x8u3jqxx%_Mn|S_I9sraQDBnPEIS%oSV6R z!Zq53G6#$FY!{5~G}Nw8;?9S7qGmo?qxI`zjY`939eCAs8g?z8cv0PU zNZmGvjHZUV&Zvb#_v7i)r9*pKD5NSa{#vU@>%00+gHEtGdem!N6FN0hNQ#2aCdysu zVxo2K+5a-q#9u#%=g5Q<-H6bJo#oB8TJnu$m*|~=-!Ml4w?2lIW;@z@l>{=mH(@}* z+-qtR-IRoovhIpBe1xis_Fe6d$bE@OF$L(8DTU_p;Y(d*6%sl!q|jWtDKNI#J#N2* zNQjXHj};t)bv%UP94?~)h$^FQVv+G-TUN_{pJI%;KI6_P1%YrW`)mxMVuQ}Y1Kk!g zpOtlZhHo5*QA79{Y1=8;%&bcTSie)BX5k!-JfI&c^aY|JvqmGPtbNANl2|FpcGbGJ z`@G=ugQw-&3ho97z51M{7ZnJ)CA)ok0Cx++VGeEXHj+&|5H7mA z%v`z#A3UwY9u*{zJ8`BKg=Vdf68K9SmHJwJ!V(c<^(Zg8b{W;_`4VC{5LY^4{s}R@ zS3bFSwYRysIW22~=_Ejud!Xg_YlBDn^;SUD&L5$4Qi9Vw+#S6jStJX=%4Y1sVauei zu~*Azn)6iZEVr@fGOnv(T++T^Fafy>@tre+P46-K<3>5wy9AI%w;{`H5oN%y`f;(s ziYDNiuUEQX2Ka(>)RBZPwLc>4#@31oiNhDG?_Y^ewD-cS%oU>NSobq$_zcnYjduHx z#L*45LuD);gi|H@EFVAZi_2^-E*!TkExRm*O{YZ9U+6lZG}VAmNO^jLUwJkw44~AB zxa}8;?-yIs$~Jys@oc$0(`v@cHo2r`XSfJudV?iFI6O>S`VvG-VnGA=L<(~!d*Sc_ z`O404C%dsID9UUs>QA+S@imtj*iTD-I-?tv)_Rduhgxorm`fd`mR`THXy)6=o3|>= zDT5?YMM}EN$B9scUp2jr>8-Qgo7|4c__}|?@%!4d`xtt>qA?%JXHI9joTqAobz)pf zYocLT5-C z8`&<$L)*lsgzV_tVb{cU7s<5Sfc1VdoPg} z_sUd}^lhx>^%m%+y^=*?uE#4$dwU9kmZkh?S#pYCwhk9qRQX&FUKVT!XOz(Z2+OD& zanhpvHy|E7Qdx?X=ijY3O6?!n}Uao|^bH+j8?qx;%om21-; zEHBPDhYWg~MHVcn&7%8?7C?$cs1}LvcYR-Z;OP_b$fYF11evtYEN6{G(y2tlCN}@z za%?6yc<$eXv2zn5kIy|YIlofm29@Q>y%SCZ&At20mWTBDR#)Auq z1#~t`$Q3rfada%bJ2n$O&g6CE>Mz&sk>nfwpdI{SZz}l+l-E8_q@Q#p z63dl*kd|!;O#X|sLw)z&B*A-MhJ>!7D9Bp%Xz0}$_GK%*I9)9xiAYi)_K8-e@dsb~ zZ3Y}yltZ2`TpJe27HuPi9GhYQJ5rQ%R(`@(EBv_F*C|O?xSK7T!8Th<(pR?@xwHe{ zW_`cX9neg(_(@1LdYO{+@L2A{TURZsab%ht!dugDg@d^4VxEVX>3kndUQp5nW$L0_)kUQ=o1N4aSSKu8#-G2)H>i7RF@4c}otkPx zmmXda*>SyLLo(D`-mqO=-V#>JyKs@N?KedB+31XtXeb%!_Of(g3iHtKh1E@Maiw@{ zO5tqmwvIuB`NcFI9L?_0eiRgGJLu8bfbj3*$omN_sB;%=s zuvMKPNdtl@8b28bRl>)GF?fR9hEar{)$>hpA&Va7P>&W`c@Z6Y4bQbihwO-6G;@AN zmI~Vhi&8wTT^UFcjc5MF<+6Ws(_R%%3q=BV_>EGF92Dr@N}Q5&2-amXp}apIWnWyz z*hLnD*^WcP26k+NXPXW>ht!Kz#g+nFLJimuBRDfym0fJ2HRiV9&g9J5`4`Pk%9T?! zjuAPf49eI8*C(Z&>XmGmETTf)=EE!!$YO(FNlir~mKkjYQI2FeS;8_x zwhm&yfAA7)K_i68UR*nt1#xBlt>oS7zeMu3dZ24_z5nLT*=P&m((V zSMusA?8@AN_v6l_u8b&QbXVqP2)7e{E`Rtd@=3SYakbKKSLsxE5!mS$g;+4m#>+wYV$Sv(FPf*tr zcV(`Br|-(#@W_p? zxbh5jJyR2N;mVY{Zr_!891@>!a_Gu_B|OV9Ppj*IlRrCj<)9Moz#IOXP7MA3s?Kw} zts_gLHYj=41X~g*$+B#B_skni&NIw86Ceo^nIHfn6FCrI&pe^|dS!?VH!jUsekC?@s^mTYQ_Z>_1)nmxtxX{@ZEwTkol9Yu`Gr!#lZz?olsK@@!G?GfW)wNw5^uwP?exWyLwzSEMeh1l_fmz>Dx?&lE=rY9eyut= zB2`9lyA7*|zYbNEGH&I;YAWNut_gMX)(|&gzd}4>k5Vm^uglGdwWT_!pTGPvw63@p zdSP5EEMa{q{=67sTD75g1p8uMir83+p98)A>C5MaO~h09GrjzB8L?-n)g_;atgZQO zV(Tzr>)M8xKlkbGuOhZ3wT<%S^p4z-+C?qX@q6ZDPii0K3(aK74x|p}eeEpSk<{0b zJEoXO)$BxNr?4l*nfM%LXk)t&N5w;ni7#QlJC^M$scY1H<&R6ZtF({E)VW`0G$LDPxhE+M~+&|Fa6u)6m-D4$S3h))n_)zoWi*0Q(X?6pvuf zK+6+021!rn32dgjW$3fs#$ z#h#KoQHqn!as+dOR5m6gqUzQMX3^sv1IK*T!!hjXcci4 z{y>u-Q{<6U9mO4XtRZfyiE`GY?)*66a0S00b?Sb!i?y_p2e%Le;Wb&_?jPNU)E7nd9)4jW~ee_1KAR9 ztNht^#Jei**q(S_Z$nM1jnB=HiQCxyOm)YbWq{?%}Q(cj&qPR-jYT~+jsaQkYgt@o8J&Ief51jq5 zE!9DJy2r>7sUFJjxWR_yY9U~Qc`@S{s>KM!b!s*i^N(7DXgu3QJcW7eiuNpCeCRwRyi7iOlWwkO_)xoXJ{#D}oQFu|fDb&Pt) zWUf>qb|Q6(B0a};CO(Im8MZ2M6!xVoCccCj1?L^{HT;<_e_30yxT}R|-Ke{w-Ku&* z&F?KKPQi4~h9%B~a=Ke)KC)6dRY};LI1l>+b}uf7vsM)I`)EaT_mw?JmH%InJ5p7Y zUx?Sdnp7R-6JJ}hhEy{&4C}?CxD{H>-bJk~?uc{N7589fdT4#|0QQVyM;S_uP^5a= z#?A}TdQx|Jo2c#-=2qMGEMEOHzkJQs{2lpa9VU8p+YoQUKhJ*Y*_L=)`p2_uXX&& z?xhMSf95JnR+K8u8}2XJgH(CmFui0IscNV-`&_r0xDGR)MQezg@I0{|rCKPaF=cIW z2mU`li;i@b%eXCUWitXG7rT)?_8>$NBPQkFD`^0!}+TyE{QAlATGnqSJNuuD(pu% z-ZW}bbriQk?ueV};=vxpE!dxgwzxCzf@4)zs)zDht+8844d#kfeke6U`7^{1ON%qG?|f%VmX*q(xR;jQiSz2B zZ}-j%8CIZ-^ch)EbxWabxTy<{JW^$p4~nB*MXDNV&3HYkiR+;kTCJ2L){ttV{MdW< z+8(9&Y#j2aYHe``_BE_4?y0XCWqs{&`AfSFtg}LZKC|Xk63i1woweXWjoFbVcVsQaopOT>h8ln4xXw5sY6vs z*pc`c=59xJB0hy#ew%hCK8OE64F86VyO4^aex3b}7j*IEyo)RGHSBrJWW}X!Pz*Y6 zx8elMK$Dgfr(k9-YiV&tusd-c_M^wWxB&Z3$5vF7DxrLlB0nBnErhD9 z9-pnE>Q$J9G;K9;9rnoc^3srM1~q%vw?}ac_FN(~ZK)25C#z*$aZgRk))x<8#{FnR z@hH?Mx*s@bjisJYBnms1cnbRp&Q+eJR{zqY$yY)D-2bu;Gxn%$h&RO#wk6(%eV{A} zJ5swS2AZ@z@jlFi+}MHhLZ}W^7PBMOJq~Tdp!r^KB6X_nx^^Z$hduEg$Qr3A%2)Vd z#9~sH^ICac%B8MR{%{fYxYP~GpU+!y0%jV@mK3K#Im3C+UY(Z8pa=-*BhHC4b|=om z{-iZ|DVHkD74L0Dsghbv>_J?H8A!@1;wsE!wyoy85VN}4#;l>bP1vtU_m5I76!+1! zwzwmXTUXpu7j^542e5}G#;HeY6q<1B%e)DWrJmFaFXiHC=!GipLi$Lp^5-Fs&e~sT z-GLcM%QnQDFb^B)Bi@F|m9p)KcU4}qJ@LNU$L&CT2$R8WI}#tmo(v&hTrGs^lw#kc zTM;``i}Sf+iM^1DhEBPUj~s<#QkN*^qi09^W~%>RYkGuK3Yv& zhkaTa;%4A5bDR(!T`h#IMKR+_T3gjSu#bz6Z(XV0T=5C0FEv2N|>PhHPW#HTRX*|#(CIqYLklRK^!!WIq1vz4;NRQ(dB z`=(uqujl1)@eR!W_-MD{1kA(Hwxl=(lTnwJ7H43O6SJ0;%BjiJ?!0(1_ z6XnN7zL#%FZKM3!XKY?lyC{EB_Qd<*j2(y%1BWN)kyEnNv8oL0M0^VSmdK`YCUuVT z3uTtL)?V@KG}#L zrCKPiTDP{iqb5(*757wLu)cTzbBVeQofqOXqKvnvsf|_lNo^B05l>-{(6e~;jX!q0 zZTasPUe;m8Qnd~7W+*4_Kk`6qNo}L}-cz+5@h;48Mz$y37vI@|_)yHYB|e6E2=aC! zJ{6bjOneSA1pfFbj;ejeV&Y4fg{o^;;%nGbj&JyJshiM*QNQO&zjd_`qy)uWVQ5KJ zPr<$ivS6mAGANyN#5vd(bGG|CsXWRh5cbC zg=QZH3YJ1@j3Lm5xQz_O~FgSm;J-HG!saf#WzxFF71 zQCxz3=E5c=RaO^IRuNZ2mD&4-)x>pmQMQJ-3D2|tQL2UFz9-fecVJ%zy5b(}CoK+N zeW?M;k9b4z2>u-t_6OGNvDDMN6&uY&YKkHaD)ua1edo6uwKe@B>g%sJ>y%NqY#Uzo zvI+aTwk6(%eNbF+M{0Mjc)Q<|+Mg>P-UF#a6fw@*k@y(q?)gi(_*CVrIO6kp7o`4$ zR20P_vSKmurJBU-N_-6yz@f#(H?SuXAIWZ|5-5MT`L$S5DuwcQHNHfpr7|eS*0QWP z2m5Nq2h}@Q3+a_t^`YIXdI2UE+Ex^oV8&Iq2XPtpZ00*n` zNVg-YW0XgaA7z|KorYTBFRN$b^UzWFY zls_}K;snekvX&I5VCB}5rKK{Vm)X09WyLvh)$YXkIp2#5Vm2mcMeC)s{LTB+w|{z@ b{?ps%m)ch)D*xkm|MT4+zia(3zpDH{k?d1d diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc deleted file mode 100755 index 590ccfbfe2dc8c1d9cad48b7ac2a98fb01375283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43954 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
  • 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py deleted file mode 100755 index 3e91bf5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/_mapping.py +++ /dev/null @@ -1,603 +0,0 @@ -# Automatically generated by scripts/gen_mapfiles.py. -# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. - -LEXERS = { - 'ABAPLexer': ('pip._vendor.pygments.lexers.business', 'ABAP', ('abap',), ('*.abap', '*.ABAP'), ('text/x-abap',)), - 'AMDGPULexer': ('pip._vendor.pygments.lexers.amdgpu', 'AMDGPU', ('amdgpu',), ('*.isa',), ()), - 'APLLexer': ('pip._vendor.pygments.lexers.apl', 'APL', ('apl',), ('*.apl', '*.aplf', '*.aplo', '*.apln', '*.aplc', '*.apli', '*.dyalog'), ()), - 'AbnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'ABNF', ('abnf',), ('*.abnf',), ('text/x-abnf',)), - 'ActionScript3Lexer': ('pip._vendor.pygments.lexers.actionscript', 'ActionScript 3', ('actionscript3', 'as3'), ('*.as',), ('application/x-actionscript3', 'text/x-actionscript3', 'text/actionscript3')), - 'ActionScriptLexer': ('pip._vendor.pygments.lexers.actionscript', 'ActionScript', ('actionscript', 'as'), ('*.as',), ('application/x-actionscript', 'text/x-actionscript', 'text/actionscript')), - 'AdaLexer': ('pip._vendor.pygments.lexers.ada', 'Ada', ('ada', 'ada95', 'ada2005'), ('*.adb', '*.ads', '*.ada'), ('text/x-ada',)), - 'AdlLexer': ('pip._vendor.pygments.lexers.archetype', 'ADL', ('adl',), ('*.adl', '*.adls', '*.adlf', '*.adlx'), ()), - 'AgdaLexer': ('pip._vendor.pygments.lexers.haskell', 'Agda', ('agda',), ('*.agda',), ('text/x-agda',)), - 'AheuiLexer': ('pip._vendor.pygments.lexers.esoteric', 'Aheui', ('aheui',), ('*.aheui',), ()), - 'AlloyLexer': ('pip._vendor.pygments.lexers.dsls', 'Alloy', ('alloy',), ('*.als',), ('text/x-alloy',)), - 'AmbientTalkLexer': ('pip._vendor.pygments.lexers.ambient', 'AmbientTalk', ('ambienttalk', 'ambienttalk/2', 'at'), ('*.at',), ('text/x-ambienttalk',)), - 'AmplLexer': ('pip._vendor.pygments.lexers.ampl', 'Ampl', ('ampl',), ('*.run',), ()), - 'Angular2HtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML + Angular2', ('html+ng2',), ('*.ng2',), ()), - 'Angular2Lexer': ('pip._vendor.pygments.lexers.templates', 'Angular2', ('ng2',), (), ()), - 'AntlrActionScriptLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With ActionScript Target', ('antlr-actionscript', 'antlr-as'), ('*.G', '*.g'), ()), - 'AntlrCSharpLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With C# Target', ('antlr-csharp', 'antlr-c#'), ('*.G', '*.g'), ()), - 'AntlrCppLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With CPP Target', ('antlr-cpp',), ('*.G', '*.g'), ()), - 'AntlrJavaLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Java Target', ('antlr-java',), ('*.G', '*.g'), ()), - 'AntlrLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR', ('antlr',), (), ()), - 'AntlrObjectiveCLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With ObjectiveC Target', ('antlr-objc',), ('*.G', '*.g'), ()), - 'AntlrPerlLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Perl Target', ('antlr-perl',), ('*.G', '*.g'), ()), - 'AntlrPythonLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Python Target', ('antlr-python',), ('*.G', '*.g'), ()), - 'AntlrRubyLexer': ('pip._vendor.pygments.lexers.parsers', 'ANTLR With Ruby Target', ('antlr-ruby', 'antlr-rb'), ('*.G', '*.g'), ()), - 'ApacheConfLexer': ('pip._vendor.pygments.lexers.configs', 'ApacheConf', ('apacheconf', 'aconf', 'apache'), ('.htaccess', 'apache.conf', 'apache2.conf'), ('text/x-apacheconf',)), - 'AppleScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'AppleScript', ('applescript',), ('*.applescript',), ()), - 'ArduinoLexer': ('pip._vendor.pygments.lexers.c_like', 'Arduino', ('arduino',), ('*.ino',), ('text/x-arduino',)), - 'ArrowLexer': ('pip._vendor.pygments.lexers.arrow', 'Arrow', ('arrow',), ('*.arw',), ()), - 'ArturoLexer': ('pip._vendor.pygments.lexers.arturo', 'Arturo', ('arturo', 'art'), ('*.art',), ()), - 'AscLexer': ('pip._vendor.pygments.lexers.asc', 'ASCII armored', ('asc', 'pem'), ('*.asc', '*.pem', 'id_dsa', 'id_ecdsa', 'id_ecdsa_sk', 'id_ed25519', 'id_ed25519_sk', 'id_rsa'), ('application/pgp-keys', 'application/pgp-encrypted', 'application/pgp-signature', 'application/pem-certificate-chain')), - 'Asn1Lexer': ('pip._vendor.pygments.lexers.asn1', 'ASN.1', ('asn1',), ('*.asn1',), ()), - 'AspectJLexer': ('pip._vendor.pygments.lexers.jvm', 'AspectJ', ('aspectj',), ('*.aj',), ('text/x-aspectj',)), - 'AsymptoteLexer': ('pip._vendor.pygments.lexers.graphics', 'Asymptote', ('asymptote', 'asy'), ('*.asy',), ('text/x-asymptote',)), - 'AugeasLexer': ('pip._vendor.pygments.lexers.configs', 'Augeas', ('augeas',), ('*.aug',), ()), - 'AutoItLexer': ('pip._vendor.pygments.lexers.automation', 'AutoIt', ('autoit',), ('*.au3',), ('text/x-autoit',)), - 'AutohotkeyLexer': ('pip._vendor.pygments.lexers.automation', 'autohotkey', ('autohotkey', 'ahk'), ('*.ahk', '*.ahkl'), ('text/x-autohotkey',)), - 'AwkLexer': ('pip._vendor.pygments.lexers.textedit', 'Awk', ('awk', 'gawk', 'mawk', 'nawk'), ('*.awk',), ('application/x-awk',)), - 'BBCBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BBC Basic', ('bbcbasic',), ('*.bbc',), ()), - 'BBCodeLexer': ('pip._vendor.pygments.lexers.markup', 'BBCode', ('bbcode',), (), ('text/x-bbcode',)), - 'BCLexer': ('pip._vendor.pygments.lexers.algebra', 'BC', ('bc',), ('*.bc',), ()), - 'BQNLexer': ('pip._vendor.pygments.lexers.bqn', 'BQN', ('bqn',), ('*.bqn',), ()), - 'BSTLexer': ('pip._vendor.pygments.lexers.bibtex', 'BST', ('bst', 'bst-pybtex'), ('*.bst',), ()), - 'BareLexer': ('pip._vendor.pygments.lexers.bare', 'BARE', ('bare',), ('*.bare',), ()), - 'BaseMakefileLexer': ('pip._vendor.pygments.lexers.make', 'Base Makefile', ('basemake',), (), ()), - 'BashLexer': ('pip._vendor.pygments.lexers.shell', 'Bash', ('bash', 'sh', 'ksh', 'zsh', 'shell', 'openrc'), ('*.sh', '*.ksh', '*.bash', '*.ebuild', '*.eclass', '*.exheres-0', '*.exlib', '*.zsh', '.bashrc', 'bashrc', '.bash_*', 'bash_*', 'zshrc', '.zshrc', '.kshrc', 'kshrc', 'PKGBUILD'), ('application/x-sh', 'application/x-shellscript', 'text/x-shellscript')), - 'BashSessionLexer': ('pip._vendor.pygments.lexers.shell', 'Bash Session', ('console', 'shell-session'), ('*.sh-session', '*.shell-session'), ('application/x-shell-session', 'application/x-sh-session')), - 'BatchLexer': ('pip._vendor.pygments.lexers.shell', 'Batchfile', ('batch', 'bat', 'dosbatch', 'winbatch'), ('*.bat', '*.cmd'), ('application/x-dos-batch',)), - 'BddLexer': ('pip._vendor.pygments.lexers.bdd', 'Bdd', ('bdd',), ('*.feature',), ('text/x-bdd',)), - 'BefungeLexer': ('pip._vendor.pygments.lexers.esoteric', 'Befunge', ('befunge',), ('*.befunge',), ('application/x-befunge',)), - 'BerryLexer': ('pip._vendor.pygments.lexers.berry', 'Berry', ('berry', 'be'), ('*.be',), ('text/x-berry', 'application/x-berry')), - 'BibTeXLexer': ('pip._vendor.pygments.lexers.bibtex', 'BibTeX', ('bibtex', 'bib'), ('*.bib',), ('text/x-bibtex',)), - 'BlitzBasicLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzBasic', ('blitzbasic', 'b3d', 'bplus'), ('*.bb', '*.decls'), ('text/x-bb',)), - 'BlitzMaxLexer': ('pip._vendor.pygments.lexers.basic', 'BlitzMax', ('blitzmax', 'bmax'), ('*.bmx',), ('text/x-bmx',)), - 'BlueprintLexer': ('pip._vendor.pygments.lexers.blueprint', 'Blueprint', ('blueprint',), ('*.blp',), ('text/x-blueprint',)), - 'BnfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'BNF', ('bnf',), ('*.bnf',), ('text/x-bnf',)), - 'BoaLexer': ('pip._vendor.pygments.lexers.boa', 'Boa', ('boa',), ('*.boa',), ()), - 'BooLexer': ('pip._vendor.pygments.lexers.dotnet', 'Boo', ('boo',), ('*.boo',), ('text/x-boo',)), - 'BoogieLexer': ('pip._vendor.pygments.lexers.verification', 'Boogie', ('boogie',), ('*.bpl',), ()), - 'BrainfuckLexer': ('pip._vendor.pygments.lexers.esoteric', 'Brainfuck', ('brainfuck', 'bf'), ('*.bf', '*.b'), ('application/x-brainfuck',)), - 'BugsLexer': ('pip._vendor.pygments.lexers.modeling', 'BUGS', ('bugs', 'winbugs', 'openbugs'), ('*.bug',), ()), - 'CAmkESLexer': ('pip._vendor.pygments.lexers.esoteric', 'CAmkES', ('camkes', 'idl4'), ('*.camkes', '*.idl4'), ()), - 'CLexer': ('pip._vendor.pygments.lexers.c_cpp', 'C', ('c',), ('*.c', '*.h', '*.idc', '*.x[bp]m'), ('text/x-chdr', 'text/x-csrc', 'image/x-xbitmap', 'image/x-xpixmap')), - 'CMakeLexer': ('pip._vendor.pygments.lexers.make', 'CMake', ('cmake',), ('*.cmake', 'CMakeLists.txt'), ('text/x-cmake',)), - 'CObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'c-objdump', ('c-objdump',), ('*.c-objdump',), ('text/x-c-objdump',)), - 'CPSALexer': ('pip._vendor.pygments.lexers.lisp', 'CPSA', ('cpsa',), ('*.cpsa',), ()), - 'CSSUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'CSS+UL4', ('css+ul4',), ('*.cssul4',), ()), - 'CSharpAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-cs', ('aspx-cs',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'CSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'C#', ('csharp', 'c#', 'cs'), ('*.cs',), ('text/x-csharp',)), - 'Ca65Lexer': ('pip._vendor.pygments.lexers.asm', 'ca65 assembler', ('ca65',), ('*.s',), ()), - 'CadlLexer': ('pip._vendor.pygments.lexers.archetype', 'cADL', ('cadl',), ('*.cadl',), ()), - 'CapDLLexer': ('pip._vendor.pygments.lexers.esoteric', 'CapDL', ('capdl',), ('*.cdl',), ()), - 'CapnProtoLexer': ('pip._vendor.pygments.lexers.capnproto', "Cap'n Proto", ('capnp',), ('*.capnp',), ()), - 'CarbonLexer': ('pip._vendor.pygments.lexers.carbon', 'Carbon', ('carbon',), ('*.carbon',), ('text/x-carbon',)), - 'CbmBasicV2Lexer': ('pip._vendor.pygments.lexers.basic', 'CBM BASIC V2', ('cbmbas',), ('*.bas',), ()), - 'CddlLexer': ('pip._vendor.pygments.lexers.cddl', 'CDDL', ('cddl',), ('*.cddl',), ('text/x-cddl',)), - 'CeylonLexer': ('pip._vendor.pygments.lexers.jvm', 'Ceylon', ('ceylon',), ('*.ceylon',), ('text/x-ceylon',)), - 'Cfengine3Lexer': ('pip._vendor.pygments.lexers.configs', 'CFEngine3', ('cfengine3', 'cf3'), ('*.cf',), ()), - 'ChaiscriptLexer': ('pip._vendor.pygments.lexers.scripting', 'ChaiScript', ('chaiscript', 'chai'), ('*.chai',), ('text/x-chaiscript', 'application/x-chaiscript')), - 'ChapelLexer': ('pip._vendor.pygments.lexers.chapel', 'Chapel', ('chapel', 'chpl'), ('*.chpl',), ()), - 'CharmciLexer': ('pip._vendor.pygments.lexers.c_like', 'Charmci', ('charmci',), ('*.ci',), ()), - 'CheetahHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Cheetah', ('html+cheetah', 'html+spitfire', 'htmlcheetah'), (), ('text/html+cheetah', 'text/html+spitfire')), - 'CheetahJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Cheetah', ('javascript+cheetah', 'js+cheetah', 'javascript+spitfire', 'js+spitfire'), (), ('application/x-javascript+cheetah', 'text/x-javascript+cheetah', 'text/javascript+cheetah', 'application/x-javascript+spitfire', 'text/x-javascript+spitfire', 'text/javascript+spitfire')), - 'CheetahLexer': ('pip._vendor.pygments.lexers.templates', 'Cheetah', ('cheetah', 'spitfire'), ('*.tmpl', '*.spt'), ('application/x-cheetah', 'application/x-spitfire')), - 'CheetahXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Cheetah', ('xml+cheetah', 'xml+spitfire'), (), ('application/xml+cheetah', 'application/xml+spitfire')), - 'CirruLexer': ('pip._vendor.pygments.lexers.webmisc', 'Cirru', ('cirru',), ('*.cirru',), ('text/x-cirru',)), - 'ClayLexer': ('pip._vendor.pygments.lexers.c_like', 'Clay', ('clay',), ('*.clay',), ('text/x-clay',)), - 'CleanLexer': ('pip._vendor.pygments.lexers.clean', 'Clean', ('clean',), ('*.icl', '*.dcl'), ()), - 'ClojureLexer': ('pip._vendor.pygments.lexers.jvm', 'Clojure', ('clojure', 'clj'), ('*.clj', '*.cljc'), ('text/x-clojure', 'application/x-clojure')), - 'ClojureScriptLexer': ('pip._vendor.pygments.lexers.jvm', 'ClojureScript', ('clojurescript', 'cljs'), ('*.cljs',), ('text/x-clojurescript', 'application/x-clojurescript')), - 'CobolFreeformatLexer': ('pip._vendor.pygments.lexers.business', 'COBOLFree', ('cobolfree',), ('*.cbl', '*.CBL'), ()), - 'CobolLexer': ('pip._vendor.pygments.lexers.business', 'COBOL', ('cobol',), ('*.cob', '*.COB', '*.cpy', '*.CPY'), ('text/x-cobol',)), - 'CodeQLLexer': ('pip._vendor.pygments.lexers.codeql', 'CodeQL', ('codeql', 'ql'), ('*.ql', '*.qll'), ()), - 'CoffeeScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'CoffeeScript', ('coffeescript', 'coffee-script', 'coffee'), ('*.coffee',), ('text/coffeescript',)), - 'ColdfusionCFCLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion CFC', ('cfc',), ('*.cfc',), ()), - 'ColdfusionHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'Coldfusion HTML', ('cfm',), ('*.cfm', '*.cfml'), ('application/x-coldfusion',)), - 'ColdfusionLexer': ('pip._vendor.pygments.lexers.templates', 'cfstatement', ('cfs',), (), ()), - 'Comal80Lexer': ('pip._vendor.pygments.lexers.comal', 'COMAL-80', ('comal', 'comal80'), ('*.cml', '*.comal'), ()), - 'CommonLispLexer': ('pip._vendor.pygments.lexers.lisp', 'Common Lisp', ('common-lisp', 'cl', 'lisp'), ('*.cl', '*.lisp'), ('text/x-common-lisp',)), - 'ComponentPascalLexer': ('pip._vendor.pygments.lexers.oberon', 'Component Pascal', ('componentpascal', 'cp'), ('*.cp', '*.cps'), ('text/x-component-pascal',)), - 'CplintLexer': ('pip._vendor.pygments.lexers.cplint', 'cplint', ('cplint',), ('*.ecl', '*.prolog', '*.pro', '*.pl', '*.P', '*.lpad', '*.cpl'), ('text/x-cplint',)), - 'CppLexer': ('pip._vendor.pygments.lexers.c_cpp', 'C++', ('cpp', 'c++'), ('*.cpp', '*.hpp', '*.c++', '*.h++', '*.cc', '*.hh', '*.cxx', '*.hxx', '*.C', '*.H', '*.cp', '*.CPP', '*.tpp', '*.cppm', '*.ixx', '*.mxx'), ('text/x-c++hdr', 'text/x-c++src')), - 'CppObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'cpp-objdump', ('cpp-objdump', 'c++-objdumb', 'cxx-objdump'), ('*.cpp-objdump', '*.c++-objdump', '*.cxx-objdump'), ('text/x-cpp-objdump',)), - 'CrmshLexer': ('pip._vendor.pygments.lexers.dsls', 'Crmsh', ('crmsh', 'pcmk'), ('*.crmsh', '*.pcmk'), ()), - 'CrocLexer': ('pip._vendor.pygments.lexers.d', 'Croc', ('croc',), ('*.croc',), ('text/x-crocsrc',)), - 'CryptolLexer': ('pip._vendor.pygments.lexers.haskell', 'Cryptol', ('cryptol', 'cry'), ('*.cry',), ('text/x-cryptol',)), - 'CrystalLexer': ('pip._vendor.pygments.lexers.crystal', 'Crystal', ('cr', 'crystal'), ('*.cr',), ('text/x-crystal',)), - 'CsoundDocumentLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Document', ('csound-document', 'csound-csd'), ('*.csd',), ()), - 'CsoundOrchestraLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Orchestra', ('csound', 'csound-orc'), ('*.orc', '*.udo'), ()), - 'CsoundScoreLexer': ('pip._vendor.pygments.lexers.csound', 'Csound Score', ('csound-score', 'csound-sco'), ('*.sco',), ()), - 'CssDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Django/Jinja', ('css+django', 'css+jinja'), ('*.css.j2', '*.css.jinja2'), ('text/css+django', 'text/css+jinja')), - 'CssErbLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Ruby', ('css+ruby', 'css+erb'), (), ('text/css+ruby',)), - 'CssGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Genshi Text', ('css+genshitext', 'css+genshi'), (), ('text/css+genshi',)), - 'CssLexer': ('pip._vendor.pygments.lexers.css', 'CSS', ('css',), ('*.css',), ('text/css',)), - 'CssPhpLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+PHP', ('css+php',), (), ('text/css+php',)), - 'CssSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Smarty', ('css+smarty',), (), ('text/css+smarty',)), - 'CudaLexer': ('pip._vendor.pygments.lexers.c_like', 'CUDA', ('cuda', 'cu'), ('*.cu', '*.cuh'), ('text/x-cuda',)), - 'CypherLexer': ('pip._vendor.pygments.lexers.graph', 'Cypher', ('cypher',), ('*.cyp', '*.cypher'), ()), - 'CythonLexer': ('pip._vendor.pygments.lexers.python', 'Cython', ('cython', 'pyx', 'pyrex'), ('*.pyx', '*.pxd', '*.pxi'), ('text/x-cython', 'application/x-cython')), - 'DLexer': ('pip._vendor.pygments.lexers.d', 'D', ('d',), ('*.d', '*.di'), ('text/x-dsrc',)), - 'DObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'd-objdump', ('d-objdump',), ('*.d-objdump',), ('text/x-d-objdump',)), - 'DarcsPatchLexer': ('pip._vendor.pygments.lexers.diff', 'Darcs Patch', ('dpatch',), ('*.dpatch', '*.darcspatch'), ()), - 'DartLexer': ('pip._vendor.pygments.lexers.javascript', 'Dart', ('dart',), ('*.dart',), ('text/x-dart',)), - 'Dasm16Lexer': ('pip._vendor.pygments.lexers.asm', 'DASM16', ('dasm16',), ('*.dasm16', '*.dasm'), ('text/x-dasm16',)), - 'DaxLexer': ('pip._vendor.pygments.lexers.dax', 'Dax', ('dax',), ('*.dax',), ()), - 'DebianControlLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Control file', ('debcontrol', 'control'), ('control',), ()), - 'DebianSourcesLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sources file', ('debian.sources',), ('*.sources',), ()), - 'DelphiLexer': ('pip._vendor.pygments.lexers.pascal', 'Delphi', ('delphi', 'pas', 'pascal', 'objectpascal'), ('*.pas', '*.dpr'), ('text/x-pascal',)), - 'DesktopLexer': ('pip._vendor.pygments.lexers.configs', 'Desktop file', ('desktop',), ('*.desktop',), ('application/x-desktop',)), - 'DevicetreeLexer': ('pip._vendor.pygments.lexers.devicetree', 'Devicetree', ('devicetree', 'dts'), ('*.dts', '*.dtsi'), ('text/x-c',)), - 'DgLexer': ('pip._vendor.pygments.lexers.python', 'dg', ('dg',), ('*.dg',), ('text/x-dg',)), - 'DiffLexer': ('pip._vendor.pygments.lexers.diff', 'Diff', ('diff', 'udiff'), ('*.diff', '*.patch'), ('text/x-diff', 'text/x-patch')), - 'DjangoLexer': ('pip._vendor.pygments.lexers.templates', 'Django/Jinja', ('django', 'jinja'), (), ('application/x-django-templating', 'application/x-jinja')), - 'DnsZoneLexer': ('pip._vendor.pygments.lexers.dns', 'Zone', ('zone',), ('*.zone',), ('text/dns',)), - 'DockerLexer': ('pip._vendor.pygments.lexers.configs', 'Docker', ('docker', 'dockerfile'), ('Dockerfile', '*.docker'), ('text/x-dockerfile-config',)), - 'DtdLexer': ('pip._vendor.pygments.lexers.html', 'DTD', ('dtd',), ('*.dtd',), ('application/xml-dtd',)), - 'DuelLexer': ('pip._vendor.pygments.lexers.webmisc', 'Duel', ('duel', 'jbst', 'jsonml+bst'), ('*.duel', '*.jbst'), ('text/x-duel', 'text/x-jbst')), - 'DylanConsoleLexer': ('pip._vendor.pygments.lexers.dylan', 'Dylan session', ('dylan-console', 'dylan-repl'), ('*.dylan-console',), ('text/x-dylan-console',)), - 'DylanLexer': ('pip._vendor.pygments.lexers.dylan', 'Dylan', ('dylan',), ('*.dylan', '*.dyl', '*.intr'), ('text/x-dylan',)), - 'DylanLidLexer': ('pip._vendor.pygments.lexers.dylan', 'DylanLID', ('dylan-lid', 'lid'), ('*.lid', '*.hdp'), ('text/x-dylan-lid',)), - 'ECLLexer': ('pip._vendor.pygments.lexers.ecl', 'ECL', ('ecl',), ('*.ecl',), ('application/x-ecl',)), - 'ECLexer': ('pip._vendor.pygments.lexers.c_like', 'eC', ('ec',), ('*.ec', '*.eh'), ('text/x-echdr', 'text/x-ecsrc')), - 'EarlGreyLexer': ('pip._vendor.pygments.lexers.javascript', 'Earl Grey', ('earl-grey', 'earlgrey', 'eg'), ('*.eg',), ('text/x-earl-grey',)), - 'EasytrieveLexer': ('pip._vendor.pygments.lexers.scripting', 'Easytrieve', ('easytrieve',), ('*.ezt', '*.mac'), ('text/x-easytrieve',)), - 'EbnfLexer': ('pip._vendor.pygments.lexers.parsers', 'EBNF', ('ebnf',), ('*.ebnf',), ('text/x-ebnf',)), - 'EiffelLexer': ('pip._vendor.pygments.lexers.eiffel', 'Eiffel', ('eiffel',), ('*.e',), ('text/x-eiffel',)), - 'ElixirConsoleLexer': ('pip._vendor.pygments.lexers.erlang', 'Elixir iex session', ('iex',), (), ('text/x-elixir-shellsession',)), - 'ElixirLexer': ('pip._vendor.pygments.lexers.erlang', 'Elixir', ('elixir', 'ex', 'exs'), ('*.ex', '*.eex', '*.exs', '*.leex'), ('text/x-elixir',)), - 'ElmLexer': ('pip._vendor.pygments.lexers.elm', 'Elm', ('elm',), ('*.elm',), ('text/x-elm',)), - 'ElpiLexer': ('pip._vendor.pygments.lexers.elpi', 'Elpi', ('elpi',), ('*.elpi',), ('text/x-elpi',)), - 'EmacsLispLexer': ('pip._vendor.pygments.lexers.lisp', 'EmacsLisp', ('emacs-lisp', 'elisp', 'emacs'), ('*.el',), ('text/x-elisp', 'application/x-elisp')), - 'EmailLexer': ('pip._vendor.pygments.lexers.email', 'E-mail', ('email', 'eml'), ('*.eml',), ('message/rfc822',)), - 'ErbLexer': ('pip._vendor.pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)), - 'ErlangLexer': ('pip._vendor.pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)), - 'ErlangShellLexer': ('pip._vendor.pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)), - 'EvoqueHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), (), ('text/html+evoque',)), - 'EvoqueLexer': ('pip._vendor.pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)), - 'EvoqueXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), (), ('application/xml+evoque',)), - 'ExeclineLexer': ('pip._vendor.pygments.lexers.shell', 'execline', ('execline',), ('*.exec',), ()), - 'EzhilLexer': ('pip._vendor.pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)), - 'FSharpLexer': ('pip._vendor.pygments.lexers.dotnet', 'F#', ('fsharp', 'f#'), ('*.fs', '*.fsi', '*.fsx'), ('text/x-fsharp',)), - 'FStarLexer': ('pip._vendor.pygments.lexers.ml', 'FStar', ('fstar',), ('*.fst', '*.fsti'), ('text/x-fstar',)), - 'FactorLexer': ('pip._vendor.pygments.lexers.factor', 'Factor', ('factor',), ('*.factor',), ('text/x-factor',)), - 'FancyLexer': ('pip._vendor.pygments.lexers.ruby', 'Fancy', ('fancy', 'fy'), ('*.fy', '*.fancypack'), ('text/x-fancysrc',)), - 'FantomLexer': ('pip._vendor.pygments.lexers.fantom', 'Fantom', ('fan',), ('*.fan',), ('application/x-fantom',)), - 'FelixLexer': ('pip._vendor.pygments.lexers.felix', 'Felix', ('felix', 'flx'), ('*.flx', '*.flxh'), ('text/x-felix',)), - 'FennelLexer': ('pip._vendor.pygments.lexers.lisp', 'Fennel', ('fennel', 'fnl'), ('*.fnl', '*.fnlm'), ('text/x-fennel',)), - 'FiftLexer': ('pip._vendor.pygments.lexers.fift', 'Fift', ('fift', 'fif'), ('*.fif',), ()), - 'FishShellLexer': ('pip._vendor.pygments.lexers.shell', 'Fish', ('fish', 'fishshell'), ('*.fish', '*.load'), ('application/x-fish',)), - 'FlatlineLexer': ('pip._vendor.pygments.lexers.dsls', 'Flatline', ('flatline',), (), ('text/x-flatline',)), - 'FloScriptLexer': ('pip._vendor.pygments.lexers.floscript', 'FloScript', ('floscript', 'flo'), ('*.flo',), ()), - 'ForthLexer': ('pip._vendor.pygments.lexers.forth', 'Forth', ('forth',), ('*.frt', '*.fs'), ('application/x-forth',)), - 'FortranFixedLexer': ('pip._vendor.pygments.lexers.fortran', 'FortranFixed', ('fortranfixed',), ('*.f', '*.F'), ()), - 'FortranLexer': ('pip._vendor.pygments.lexers.fortran', 'Fortran', ('fortran', 'f90'), ('*.f03', '*.f90', '*.F03', '*.F90'), ('text/x-fortran',)), - 'FoxProLexer': ('pip._vendor.pygments.lexers.foxpro', 'FoxPro', ('foxpro', 'vfp', 'clipper', 'xbase'), ('*.PRG', '*.prg'), ()), - 'FreeFemLexer': ('pip._vendor.pygments.lexers.freefem', 'Freefem', ('freefem',), ('*.edp',), ('text/x-freefem',)), - 'FuncLexer': ('pip._vendor.pygments.lexers.func', 'FunC', ('func', 'fc'), ('*.fc', '*.func'), ()), - 'FutharkLexer': ('pip._vendor.pygments.lexers.futhark', 'Futhark', ('futhark',), ('*.fut',), ('text/x-futhark',)), - 'GAPConsoleLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP session', ('gap-console', 'gap-repl'), ('*.tst',), ()), - 'GAPLexer': ('pip._vendor.pygments.lexers.algebra', 'GAP', ('gap',), ('*.g', '*.gd', '*.gi', '*.gap'), ()), - 'GDScriptLexer': ('pip._vendor.pygments.lexers.gdscript', 'GDScript', ('gdscript', 'gd'), ('*.gd',), ('text/x-gdscript', 'application/x-gdscript')), - 'GLShaderLexer': ('pip._vendor.pygments.lexers.graphics', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), - 'GSQLLexer': ('pip._vendor.pygments.lexers.gsql', 'GSQL', ('gsql',), ('*.gsql',), ()), - 'GasLexer': ('pip._vendor.pygments.lexers.asm', 'GAS', ('gas', 'asm'), ('*.s', '*.S'), ('text/x-gas',)), - 'GcodeLexer': ('pip._vendor.pygments.lexers.gcodelexer', 'g-code', ('gcode',), ('*.gcode',), ()), - 'GenshiLexer': ('pip._vendor.pygments.lexers.templates', 'Genshi', ('genshi', 'kid', 'xml+genshi', 'xml+kid'), ('*.kid',), ('application/x-genshi', 'application/x-kid')), - 'GenshiTextLexer': ('pip._vendor.pygments.lexers.templates', 'Genshi Text', ('genshitext',), (), ('application/x-genshi-text', 'text/x-genshi')), - 'GettextLexer': ('pip._vendor.pygments.lexers.textfmts', 'Gettext Catalog', ('pot', 'po'), ('*.pot', '*.po'), ('application/x-gettext', 'text/x-gettext', 'text/gettext')), - 'GherkinLexer': ('pip._vendor.pygments.lexers.testing', 'Gherkin', ('gherkin', 'cucumber'), ('*.feature',), ('text/x-gherkin',)), - 'GleamLexer': ('pip._vendor.pygments.lexers.gleam', 'Gleam', ('gleam',), ('*.gleam',), ('text/x-gleam',)), - 'GnuplotLexer': ('pip._vendor.pygments.lexers.graphics', 'Gnuplot', ('gnuplot',), ('*.plot', '*.plt'), ('text/x-gnuplot',)), - 'GoLexer': ('pip._vendor.pygments.lexers.go', 'Go', ('go', 'golang'), ('*.go',), ('text/x-gosrc',)), - 'GoloLexer': ('pip._vendor.pygments.lexers.jvm', 'Golo', ('golo',), ('*.golo',), ()), - 'GoodDataCLLexer': ('pip._vendor.pygments.lexers.business', 'GoodData-CL', ('gooddata-cl',), ('*.gdc',), ('text/x-gooddata-cl',)), - 'GoogleSqlLexer': ('pip._vendor.pygments.lexers.sql', 'GoogleSQL', ('googlesql', 'zetasql'), ('*.googlesql', '*.googlesql.sql'), ('text/x-google-sql', 'text/x-google-sql-aux')), - 'GosuLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu', ('gosu',), ('*.gs', '*.gsx', '*.gsp', '*.vark'), ('text/x-gosu',)), - 'GosuTemplateLexer': ('pip._vendor.pygments.lexers.jvm', 'Gosu Template', ('gst',), ('*.gst',), ('text/x-gosu-template',)), - 'GraphQLLexer': ('pip._vendor.pygments.lexers.graphql', 'GraphQL', ('graphql',), ('*.graphql',), ()), - 'GraphvizLexer': ('pip._vendor.pygments.lexers.graphviz', 'Graphviz', ('graphviz', 'dot'), ('*.gv', '*.dot'), ('text/x-graphviz', 'text/vnd.graphviz')), - 'GroffLexer': ('pip._vendor.pygments.lexers.markup', 'Groff', ('groff', 'nroff', 'man'), ('*.[1-9]', '*.man', '*.1p', '*.3pm'), ('application/x-troff', 'text/troff')), - 'GroovyLexer': ('pip._vendor.pygments.lexers.jvm', 'Groovy', ('groovy',), ('*.groovy', '*.gradle'), ('text/x-groovy',)), - 'HLSLShaderLexer': ('pip._vendor.pygments.lexers.graphics', 'HLSL', ('hlsl',), ('*.hlsl', '*.hlsli'), ('text/x-hlsl',)), - 'HTMLUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'HTML+UL4', ('html+ul4',), ('*.htmlul4',), ()), - 'HamlLexer': ('pip._vendor.pygments.lexers.html', 'Haml', ('haml',), ('*.haml',), ('text/x-haml',)), - 'HandlebarsHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Handlebars', ('html+handlebars',), ('*.handlebars', '*.hbs'), ('text/html+handlebars', 'text/x-handlebars-template')), - 'HandlebarsLexer': ('pip._vendor.pygments.lexers.templates', 'Handlebars', ('handlebars',), (), ()), - 'HareLexer': ('pip._vendor.pygments.lexers.hare', 'Hare', ('hare',), ('*.ha',), ('text/x-hare',)), - 'HaskellLexer': ('pip._vendor.pygments.lexers.haskell', 'Haskell', ('haskell', 'hs'), ('*.hs',), ('text/x-haskell',)), - 'HaxeLexer': ('pip._vendor.pygments.lexers.haxe', 'Haxe', ('haxe', 'hxsl', 'hx'), ('*.hx', '*.hxsl'), ('text/haxe', 'text/x-haxe', 'text/x-hx')), - 'HexdumpLexer': ('pip._vendor.pygments.lexers.hexdump', 'Hexdump', ('hexdump',), (), ()), - 'HsailLexer': ('pip._vendor.pygments.lexers.asm', 'HSAIL', ('hsail', 'hsa'), ('*.hsail',), ('text/x-hsail',)), - 'HspecLexer': ('pip._vendor.pygments.lexers.haskell', 'Hspec', ('hspec',), ('*Spec.hs',), ()), - 'HtmlDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Django/Jinja', ('html+django', 'html+jinja', 'htmldjango'), ('*.html.j2', '*.htm.j2', '*.xhtml.j2', '*.html.jinja2', '*.htm.jinja2', '*.xhtml.jinja2'), ('text/html+django', 'text/html+jinja')), - 'HtmlGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Genshi', ('html+genshi', 'html+kid'), (), ('text/html+genshi',)), - 'HtmlLexer': ('pip._vendor.pygments.lexers.html', 'HTML', ('html',), ('*.html', '*.htm', '*.xhtml', '*.xslt'), ('text/html', 'application/xhtml+xml')), - 'HtmlPhpLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+PHP', ('html+php',), ('*.phtml',), ('application/x-php', 'application/x-httpd-php', 'application/x-httpd-php3', 'application/x-httpd-php4', 'application/x-httpd-php5')), - 'HtmlSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Smarty', ('html+smarty',), (), ('text/html+smarty',)), - 'HttpLexer': ('pip._vendor.pygments.lexers.textfmts', 'HTTP', ('http',), (), ()), - 'HxmlLexer': ('pip._vendor.pygments.lexers.haxe', 'Hxml', ('haxeml', 'hxml'), ('*.hxml',), ()), - 'HyLexer': ('pip._vendor.pygments.lexers.lisp', 'Hy', ('hylang', 'hy'), ('*.hy',), ('text/x-hy', 'application/x-hy')), - 'HybrisLexer': ('pip._vendor.pygments.lexers.scripting', 'Hybris', ('hybris',), ('*.hyb',), ('text/x-hybris', 'application/x-hybris')), - 'IDLLexer': ('pip._vendor.pygments.lexers.idl', 'IDL', ('idl',), ('*.pro',), ('text/idl',)), - 'IconLexer': ('pip._vendor.pygments.lexers.unicon', 'Icon', ('icon',), ('*.icon', '*.ICON'), ()), - 'IdrisLexer': ('pip._vendor.pygments.lexers.haskell', 'Idris', ('idris', 'idr'), ('*.idr',), ('text/x-idris',)), - 'IgorLexer': ('pip._vendor.pygments.lexers.igor', 'Igor', ('igor', 'igorpro'), ('*.ipf',), ('text/ipf',)), - 'Inform6Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6', ('inform6', 'i6'), ('*.inf',), ()), - 'Inform6TemplateLexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 6 template', ('i6t',), ('*.i6t',), ()), - 'Inform7Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'Inform 7', ('inform7', 'i7'), ('*.ni', '*.i7x'), ()), - 'IniLexer': ('pip._vendor.pygments.lexers.configs', 'INI', ('ini', 'cfg', 'dosini'), ('*.ini', '*.cfg', '*.inf', '.editorconfig'), ('text/x-ini', 'text/inf')), - 'IoLexer': ('pip._vendor.pygments.lexers.iolang', 'Io', ('io',), ('*.io',), ('text/x-iosrc',)), - 'IokeLexer': ('pip._vendor.pygments.lexers.jvm', 'Ioke', ('ioke', 'ik'), ('*.ik',), ('text/x-iokesrc',)), - 'IrcLogsLexer': ('pip._vendor.pygments.lexers.textfmts', 'IRC logs', ('irc',), ('*.weechatlog',), ('text/x-irclog',)), - 'IsabelleLexer': ('pip._vendor.pygments.lexers.theorem', 'Isabelle', ('isabelle',), ('*.thy',), ('text/x-isabelle',)), - 'JLexer': ('pip._vendor.pygments.lexers.j', 'J', ('j',), ('*.ijs',), ('text/x-j',)), - 'JMESPathLexer': ('pip._vendor.pygments.lexers.jmespath', 'JMESPath', ('jmespath', 'jp'), ('*.jp',), ()), - 'JSLTLexer': ('pip._vendor.pygments.lexers.jslt', 'JSLT', ('jslt',), ('*.jslt',), ('text/x-jslt',)), - 'JagsLexer': ('pip._vendor.pygments.lexers.modeling', 'JAGS', ('jags',), ('*.jag', '*.bug'), ()), - 'JanetLexer': ('pip._vendor.pygments.lexers.lisp', 'Janet', ('janet',), ('*.janet', '*.jdn'), ('text/x-janet', 'application/x-janet')), - 'JasminLexer': ('pip._vendor.pygments.lexers.jvm', 'Jasmin', ('jasmin', 'jasminxt'), ('*.j',), ()), - 'JavaLexer': ('pip._vendor.pygments.lexers.jvm', 'Java', ('java',), ('*.java',), ('text/x-java',)), - 'JavascriptDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Django/Jinja', ('javascript+django', 'js+django', 'javascript+jinja', 'js+jinja'), ('*.js.j2', '*.js.jinja2'), ('application/x-javascript+django', 'application/x-javascript+jinja', 'text/x-javascript+django', 'text/x-javascript+jinja', 'text/javascript+django', 'text/javascript+jinja')), - 'JavascriptErbLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Ruby', ('javascript+ruby', 'js+ruby', 'javascript+erb', 'js+erb'), (), ('application/x-javascript+ruby', 'text/x-javascript+ruby', 'text/javascript+ruby')), - 'JavascriptGenshiLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Genshi Text', ('js+genshitext', 'js+genshi', 'javascript+genshitext', 'javascript+genshi'), (), ('application/x-javascript+genshi', 'text/x-javascript+genshi', 'text/javascript+genshi')), - 'JavascriptLexer': ('pip._vendor.pygments.lexers.javascript', 'JavaScript', ('javascript', 'js'), ('*.js', '*.jsm', '*.mjs', '*.cjs'), ('application/javascript', 'application/x-javascript', 'text/x-javascript', 'text/javascript')), - 'JavascriptPhpLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+PHP', ('javascript+php', 'js+php'), (), ('application/x-javascript+php', 'text/x-javascript+php', 'text/javascript+php')), - 'JavascriptSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Smarty', ('javascript+smarty', 'js+smarty'), (), ('application/x-javascript+smarty', 'text/x-javascript+smarty', 'text/javascript+smarty')), - 'JavascriptUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Javascript+UL4', ('js+ul4',), ('*.jsul4',), ()), - 'JclLexer': ('pip._vendor.pygments.lexers.scripting', 'JCL', ('jcl',), ('*.jcl',), ('text/x-jcl',)), - 'JsgfLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'JSGF', ('jsgf',), ('*.jsgf',), ('application/jsgf', 'application/x-jsgf', 'text/jsgf')), - 'Json5Lexer': ('pip._vendor.pygments.lexers.json5', 'JSON5', ('json5',), ('*.json5',), ()), - 'JsonBareObjectLexer': ('pip._vendor.pygments.lexers.data', 'JSONBareObject', (), (), ()), - 'JsonLdLexer': ('pip._vendor.pygments.lexers.data', 'JSON-LD', ('jsonld', 'json-ld'), ('*.jsonld',), ('application/ld+json',)), - 'JsonLexer': ('pip._vendor.pygments.lexers.data', 'JSON', ('json', 'json-object'), ('*.json', '*.jsonl', '*.ndjson', 'Pipfile.lock', '*.module', '*.xc'), ('application/json', 'application/json-object', 'application/x-ndjson', 'application/jsonl', 'application/json-seq')), - 'JsonnetLexer': ('pip._vendor.pygments.lexers.jsonnet', 'Jsonnet', ('jsonnet',), ('*.jsonnet', '*.libsonnet'), ()), - 'JspLexer': ('pip._vendor.pygments.lexers.templates', 'Java Server Page', ('jsp',), ('*.jsp',), ('application/x-jsp',)), - 'JsxLexer': ('pip._vendor.pygments.lexers.jsx', 'JSX', ('jsx', 'react'), ('*.jsx', '*.react'), ('text/jsx', 'text/typescript-jsx')), - 'JuliaConsoleLexer': ('pip._vendor.pygments.lexers.julia', 'Julia console', ('jlcon', 'julia-repl'), (), ()), - 'JuliaLexer': ('pip._vendor.pygments.lexers.julia', 'Julia', ('julia', 'jl'), ('*.jl',), ('text/x-julia', 'application/x-julia')), - 'JuttleLexer': ('pip._vendor.pygments.lexers.javascript', 'Juttle', ('juttle',), ('*.juttle',), ('application/juttle', 'application/x-juttle', 'text/x-juttle', 'text/juttle')), - 'KLexer': ('pip._vendor.pygments.lexers.q', 'K', ('k',), ('*.k',), ()), - 'KalLexer': ('pip._vendor.pygments.lexers.javascript', 'Kal', ('kal',), ('*.kal',), ('text/kal', 'application/kal')), - 'KconfigLexer': ('pip._vendor.pygments.lexers.configs', 'Kconfig', ('kconfig', 'menuconfig', 'linux-config', 'kernel-config'), ('Kconfig*', '*Config.in*', 'external.in*', 'standard-modules.in'), ('text/x-kconfig',)), - 'KernelLogLexer': ('pip._vendor.pygments.lexers.textfmts', 'Kernel log', ('kmsg', 'dmesg'), ('*.kmsg', '*.dmesg'), ()), - 'KokaLexer': ('pip._vendor.pygments.lexers.haskell', 'Koka', ('koka',), ('*.kk', '*.kki'), ('text/x-koka',)), - 'KotlinLexer': ('pip._vendor.pygments.lexers.jvm', 'Kotlin', ('kotlin',), ('*.kt', '*.kts'), ('text/x-kotlin',)), - 'KuinLexer': ('pip._vendor.pygments.lexers.kuin', 'Kuin', ('kuin',), ('*.kn',), ()), - 'KustoLexer': ('pip._vendor.pygments.lexers.kusto', 'Kusto', ('kql', 'kusto'), ('*.kql', '*.kusto', '.csl'), ()), - 'LSLLexer': ('pip._vendor.pygments.lexers.scripting', 'LSL', ('lsl',), ('*.lsl',), ('text/x-lsl',)), - 'LassoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Lasso', ('css+lasso',), (), ('text/css+lasso',)), - 'LassoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Lasso', ('html+lasso',), (), ('text/html+lasso', 'application/x-httpd-lasso', 'application/x-httpd-lasso[89]')), - 'LassoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Lasso', ('javascript+lasso', 'js+lasso'), (), ('application/x-javascript+lasso', 'text/x-javascript+lasso', 'text/javascript+lasso')), - 'LassoLexer': ('pip._vendor.pygments.lexers.javascript', 'Lasso', ('lasso', 'lassoscript'), ('*.lasso', '*.lasso[89]'), ('text/x-lasso',)), - 'LassoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Lasso', ('xml+lasso',), (), ('application/xml+lasso',)), - 'LdaprcLexer': ('pip._vendor.pygments.lexers.ldap', 'LDAP configuration file', ('ldapconf', 'ldaprc'), ('.ldaprc', 'ldaprc', 'ldap.conf'), ('text/x-ldapconf',)), - 'LdifLexer': ('pip._vendor.pygments.lexers.ldap', 'LDIF', ('ldif',), ('*.ldif',), ('text/x-ldif',)), - 'Lean3Lexer': ('pip._vendor.pygments.lexers.lean', 'Lean', ('lean', 'lean3'), ('*.lean',), ('text/x-lean', 'text/x-lean3')), - 'Lean4Lexer': ('pip._vendor.pygments.lexers.lean', 'Lean4', ('lean4',), ('*.lean',), ('text/x-lean4',)), - 'LessCssLexer': ('pip._vendor.pygments.lexers.css', 'LessCss', ('less',), ('*.less',), ('text/x-less-css',)), - 'LighttpdConfLexer': ('pip._vendor.pygments.lexers.configs', 'Lighttpd configuration file', ('lighttpd', 'lighty'), ('lighttpd.conf',), ('text/x-lighttpd-conf',)), - 'LilyPondLexer': ('pip._vendor.pygments.lexers.lilypond', 'LilyPond', ('lilypond',), ('*.ly',), ()), - 'LimboLexer': ('pip._vendor.pygments.lexers.inferno', 'Limbo', ('limbo',), ('*.b',), ('text/limbo',)), - 'LiquidLexer': ('pip._vendor.pygments.lexers.templates', 'liquid', ('liquid',), ('*.liquid',), ()), - 'LiterateAgdaLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Agda', ('literate-agda', 'lagda'), ('*.lagda',), ('text/x-literate-agda',)), - 'LiterateCryptolLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Cryptol', ('literate-cryptol', 'lcryptol', 'lcry'), ('*.lcry',), ('text/x-literate-cryptol',)), - 'LiterateHaskellLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Haskell', ('literate-haskell', 'lhaskell', 'lhs'), ('*.lhs',), ('text/x-literate-haskell',)), - 'LiterateIdrisLexer': ('pip._vendor.pygments.lexers.haskell', 'Literate Idris', ('literate-idris', 'lidris', 'lidr'), ('*.lidr',), ('text/x-literate-idris',)), - 'LiveScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'LiveScript', ('livescript', 'live-script'), ('*.ls',), ('text/livescript',)), - 'LlvmLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM', ('llvm',), ('*.ll',), ('text/x-llvm',)), - 'LlvmMirBodyLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM-MIR Body', ('llvm-mir-body',), (), ()), - 'LlvmMirLexer': ('pip._vendor.pygments.lexers.asm', 'LLVM-MIR', ('llvm-mir',), ('*.mir',), ()), - 'LogosLexer': ('pip._vendor.pygments.lexers.objective', 'Logos', ('logos',), ('*.x', '*.xi', '*.xm', '*.xmi'), ('text/x-logos',)), - 'LogtalkLexer': ('pip._vendor.pygments.lexers.prolog', 'Logtalk', ('logtalk',), ('*.lgt', '*.logtalk'), ('text/x-logtalk',)), - 'LuaLexer': ('pip._vendor.pygments.lexers.scripting', 'Lua', ('lua',), ('*.lua', '*.wlua'), ('text/x-lua', 'application/x-lua')), - 'LuauLexer': ('pip._vendor.pygments.lexers.scripting', 'Luau', ('luau',), ('*.luau',), ()), - 'MCFunctionLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCFunction', ('mcfunction', 'mcf'), ('*.mcfunction',), ('text/mcfunction',)), - 'MCSchemaLexer': ('pip._vendor.pygments.lexers.minecraft', 'MCSchema', ('mcschema',), ('*.mcschema',), ('text/mcschema',)), - 'MIMELexer': ('pip._vendor.pygments.lexers.mime', 'MIME', ('mime',), (), ('multipart/mixed', 'multipart/related', 'multipart/alternative')), - 'MIPSLexer': ('pip._vendor.pygments.lexers.mips', 'MIPS', ('mips',), ('*.mips', '*.MIPS'), ()), - 'MOOCodeLexer': ('pip._vendor.pygments.lexers.scripting', 'MOOCode', ('moocode', 'moo'), ('*.moo',), ('text/x-moocode',)), - 'MSDOSSessionLexer': ('pip._vendor.pygments.lexers.shell', 'MSDOS Session', ('doscon',), (), ()), - 'Macaulay2Lexer': ('pip._vendor.pygments.lexers.macaulay2', 'Macaulay2', ('macaulay2',), ('*.m2',), ()), - 'MakefileLexer': ('pip._vendor.pygments.lexers.make', 'Makefile', ('make', 'makefile', 'mf', 'bsdmake'), ('*.mak', '*.mk', 'Makefile', 'makefile', 'Makefile.*', 'GNUmakefile'), ('text/x-makefile',)), - 'MakoCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Mako', ('css+mako',), (), ('text/css+mako',)), - 'MakoHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Mako', ('html+mako',), (), ('text/html+mako',)), - 'MakoJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Mako', ('javascript+mako', 'js+mako'), (), ('application/x-javascript+mako', 'text/x-javascript+mako', 'text/javascript+mako')), - 'MakoLexer': ('pip._vendor.pygments.lexers.templates', 'Mako', ('mako',), ('*.mao',), ('application/x-mako',)), - 'MakoXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Mako', ('xml+mako',), (), ('application/xml+mako',)), - 'MapleLexer': ('pip._vendor.pygments.lexers.maple', 'Maple', ('maple',), ('*.mpl', '*.mi', '*.mm'), ('text/x-maple',)), - 'MaqlLexer': ('pip._vendor.pygments.lexers.business', 'MAQL', ('maql',), ('*.maql',), ('text/x-gooddata-maql', 'application/x-gooddata-maql')), - 'MarkdownLexer': ('pip._vendor.pygments.lexers.markup', 'Markdown', ('markdown', 'md'), ('*.md', '*.markdown'), ('text/x-markdown',)), - 'MaskLexer': ('pip._vendor.pygments.lexers.javascript', 'Mask', ('mask',), ('*.mask',), ('text/x-mask',)), - 'MasonLexer': ('pip._vendor.pygments.lexers.templates', 'Mason', ('mason',), ('*.m', '*.mhtml', '*.mc', '*.mi', 'autohandler', 'dhandler'), ('application/x-mason',)), - 'MathematicaLexer': ('pip._vendor.pygments.lexers.algebra', 'Mathematica', ('mathematica', 'mma', 'nb', 'wl', 'wolfram'), ('*.nb', '*.cdf', '*.nbp', '*.ma', '*.wl', '*.wls'), ('application/mathematica', 'application/vnd.wolfram.mathematica', 'application/vnd.wolfram.mathematica.package', 'application/vnd.wolfram.cdf', 'application/vnd.wolfram.wl')), - 'MatlabLexer': ('pip._vendor.pygments.lexers.matlab', 'Matlab', ('matlab',), ('*.m',), ('text/matlab',)), - 'MatlabSessionLexer': ('pip._vendor.pygments.lexers.matlab', 'Matlab session', ('matlabsession',), (), ()), - 'MaximaLexer': ('pip._vendor.pygments.lexers.maxima', 'Maxima', ('maxima', 'macsyma'), ('*.mac', '*.max'), ()), - 'MesonLexer': ('pip._vendor.pygments.lexers.meson', 'Meson', ('meson', 'meson.build'), ('meson.build', 'meson.options', 'meson_options.txt'), ('text/x-meson',)), - 'MiniDLexer': ('pip._vendor.pygments.lexers.d', 'MiniD', ('minid',), (), ('text/x-minidsrc',)), - 'MiniScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'MiniScript', ('miniscript', 'ms'), ('*.ms',), ('text/x-minicript', 'application/x-miniscript')), - 'ModelicaLexer': ('pip._vendor.pygments.lexers.modeling', 'Modelica', ('modelica',), ('*.mo',), ('text/x-modelica',)), - 'Modula2Lexer': ('pip._vendor.pygments.lexers.modula2', 'Modula-2', ('modula2', 'm2'), ('*.def', '*.mod'), ('text/x-modula2',)), - 'MoinWikiLexer': ('pip._vendor.pygments.lexers.markup', 'MoinMoin/Trac Wiki markup', ('trac-wiki', 'moin'), (), ('text/x-trac-wiki',)), - 'MojoLexer': ('pip._vendor.pygments.lexers.mojo', 'Mojo', ('mojo', '🔥'), ('*.mojo', '*.🔥'), ('text/x-mojo', 'application/x-mojo')), - 'MonkeyLexer': ('pip._vendor.pygments.lexers.basic', 'Monkey', ('monkey',), ('*.monkey',), ('text/x-monkey',)), - 'MonteLexer': ('pip._vendor.pygments.lexers.monte', 'Monte', ('monte',), ('*.mt',), ()), - 'MoonScriptLexer': ('pip._vendor.pygments.lexers.scripting', 'MoonScript', ('moonscript', 'moon'), ('*.moon',), ('text/x-moonscript', 'application/x-moonscript')), - 'MoselLexer': ('pip._vendor.pygments.lexers.mosel', 'Mosel', ('mosel',), ('*.mos',), ()), - 'MozPreprocCssLexer': ('pip._vendor.pygments.lexers.markup', 'CSS+mozpreproc', ('css+mozpreproc',), ('*.css.in',), ()), - 'MozPreprocHashLexer': ('pip._vendor.pygments.lexers.markup', 'mozhashpreproc', ('mozhashpreproc',), (), ()), - 'MozPreprocJavascriptLexer': ('pip._vendor.pygments.lexers.markup', 'Javascript+mozpreproc', ('javascript+mozpreproc',), ('*.js.in',), ()), - 'MozPreprocPercentLexer': ('pip._vendor.pygments.lexers.markup', 'mozpercentpreproc', ('mozpercentpreproc',), (), ()), - 'MozPreprocXulLexer': ('pip._vendor.pygments.lexers.markup', 'XUL+mozpreproc', ('xul+mozpreproc',), ('*.xul.in',), ()), - 'MqlLexer': ('pip._vendor.pygments.lexers.c_like', 'MQL', ('mql', 'mq4', 'mq5', 'mql4', 'mql5'), ('*.mq4', '*.mq5', '*.mqh'), ('text/x-mql',)), - 'MscgenLexer': ('pip._vendor.pygments.lexers.dsls', 'Mscgen', ('mscgen', 'msc'), ('*.msc',), ()), - 'MuPADLexer': ('pip._vendor.pygments.lexers.algebra', 'MuPAD', ('mupad',), ('*.mu',), ()), - 'MxmlLexer': ('pip._vendor.pygments.lexers.actionscript', 'MXML', ('mxml',), ('*.mxml',), ()), - 'MySqlLexer': ('pip._vendor.pygments.lexers.sql', 'MySQL', ('mysql',), (), ('text/x-mysql',)), - 'MyghtyCssLexer': ('pip._vendor.pygments.lexers.templates', 'CSS+Myghty', ('css+myghty',), (), ('text/css+myghty',)), - 'MyghtyHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Myghty', ('html+myghty',), (), ('text/html+myghty',)), - 'MyghtyJavascriptLexer': ('pip._vendor.pygments.lexers.templates', 'JavaScript+Myghty', ('javascript+myghty', 'js+myghty'), (), ('application/x-javascript+myghty', 'text/x-javascript+myghty', 'text/javascript+mygthy')), - 'MyghtyLexer': ('pip._vendor.pygments.lexers.templates', 'Myghty', ('myghty',), ('*.myt', 'autodelegate'), ('application/x-myghty',)), - 'MyghtyXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Myghty', ('xml+myghty',), (), ('application/xml+myghty',)), - 'NCLLexer': ('pip._vendor.pygments.lexers.ncl', 'NCL', ('ncl',), ('*.ncl',), ('text/ncl',)), - 'NSISLexer': ('pip._vendor.pygments.lexers.installers', 'NSIS', ('nsis', 'nsi', 'nsh'), ('*.nsi', '*.nsh'), ('text/x-nsis',)), - 'NasmLexer': ('pip._vendor.pygments.lexers.asm', 'NASM', ('nasm',), ('*.asm', '*.ASM', '*.nasm'), ('text/x-nasm',)), - 'NasmObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'objdump-nasm', ('objdump-nasm',), ('*.objdump-intel',), ('text/x-nasm-objdump',)), - 'NemerleLexer': ('pip._vendor.pygments.lexers.dotnet', 'Nemerle', ('nemerle',), ('*.n',), ('text/x-nemerle',)), - 'NesCLexer': ('pip._vendor.pygments.lexers.c_like', 'nesC', ('nesc',), ('*.nc',), ('text/x-nescsrc',)), - 'NestedTextLexer': ('pip._vendor.pygments.lexers.configs', 'NestedText', ('nestedtext', 'nt'), ('*.nt',), ()), - 'NewLispLexer': ('pip._vendor.pygments.lexers.lisp', 'NewLisp', ('newlisp',), ('*.lsp', '*.nl', '*.kif'), ('text/x-newlisp', 'application/x-newlisp')), - 'NewspeakLexer': ('pip._vendor.pygments.lexers.smalltalk', 'Newspeak', ('newspeak',), ('*.ns2',), ('text/x-newspeak',)), - 'NginxConfLexer': ('pip._vendor.pygments.lexers.configs', 'Nginx configuration file', ('nginx',), ('nginx.conf',), ('text/x-nginx-conf',)), - 'NimrodLexer': ('pip._vendor.pygments.lexers.nimrod', 'Nimrod', ('nimrod', 'nim'), ('*.nim', '*.nimrod'), ('text/x-nim',)), - 'NitLexer': ('pip._vendor.pygments.lexers.nit', 'Nit', ('nit',), ('*.nit',), ()), - 'NixLexer': ('pip._vendor.pygments.lexers.nix', 'Nix', ('nixos', 'nix'), ('*.nix',), ('text/x-nix',)), - 'NodeConsoleLexer': ('pip._vendor.pygments.lexers.javascript', 'Node.js REPL console session', ('nodejsrepl',), (), ('text/x-nodejsrepl',)), - 'NotmuchLexer': ('pip._vendor.pygments.lexers.textfmts', 'Notmuch', ('notmuch',), (), ()), - 'NuSMVLexer': ('pip._vendor.pygments.lexers.smv', 'NuSMV', ('nusmv',), ('*.smv',), ()), - 'NumPyLexer': ('pip._vendor.pygments.lexers.python', 'NumPy', ('numpy',), (), ()), - 'NumbaIRLexer': ('pip._vendor.pygments.lexers.numbair', 'Numba_IR', ('numba_ir', 'numbair'), ('*.numba_ir',), ('text/x-numba_ir', 'text/x-numbair')), - 'ObjdumpLexer': ('pip._vendor.pygments.lexers.asm', 'objdump', ('objdump',), ('*.objdump',), ('text/x-objdump',)), - 'ObjectiveCLexer': ('pip._vendor.pygments.lexers.objective', 'Objective-C', ('objective-c', 'objectivec', 'obj-c', 'objc'), ('*.m', '*.h'), ('text/x-objective-c',)), - 'ObjectiveCppLexer': ('pip._vendor.pygments.lexers.objective', 'Objective-C++', ('objective-c++', 'objectivec++', 'obj-c++', 'objc++'), ('*.mm', '*.hh'), ('text/x-objective-c++',)), - 'ObjectiveJLexer': ('pip._vendor.pygments.lexers.javascript', 'Objective-J', ('objective-j', 'objectivej', 'obj-j', 'objj'), ('*.j',), ('text/x-objective-j',)), - 'OcamlLexer': ('pip._vendor.pygments.lexers.ml', 'OCaml', ('ocaml',), ('*.ml', '*.mli', '*.mll', '*.mly'), ('text/x-ocaml',)), - 'OctaveLexer': ('pip._vendor.pygments.lexers.matlab', 'Octave', ('octave',), ('*.m',), ('text/octave',)), - 'OdinLexer': ('pip._vendor.pygments.lexers.archetype', 'ODIN', ('odin',), ('*.odin',), ('text/odin',)), - 'OmgIdlLexer': ('pip._vendor.pygments.lexers.c_like', 'OMG Interface Definition Language', ('omg-idl',), ('*.idl', '*.pidl'), ()), - 'OocLexer': ('pip._vendor.pygments.lexers.ooc', 'Ooc', ('ooc',), ('*.ooc',), ('text/x-ooc',)), - 'OpaLexer': ('pip._vendor.pygments.lexers.ml', 'Opa', ('opa',), ('*.opa',), ('text/x-opa',)), - 'OpenEdgeLexer': ('pip._vendor.pygments.lexers.business', 'OpenEdge ABL', ('openedge', 'abl', 'progress'), ('*.p', '*.cls'), ('text/x-openedge', 'application/x-openedge')), - 'OpenScadLexer': ('pip._vendor.pygments.lexers.openscad', 'OpenSCAD', ('openscad',), ('*.scad',), ('application/x-openscad',)), - 'OrgLexer': ('pip._vendor.pygments.lexers.markup', 'Org Mode', ('org', 'orgmode', 'org-mode'), ('*.org',), ('text/org',)), - 'OutputLexer': ('pip._vendor.pygments.lexers.special', 'Text output', ('output',), (), ()), - 'PacmanConfLexer': ('pip._vendor.pygments.lexers.configs', 'PacmanConf', ('pacmanconf',), ('pacman.conf',), ()), - 'PanLexer': ('pip._vendor.pygments.lexers.dsls', 'Pan', ('pan',), ('*.pan',), ()), - 'ParaSailLexer': ('pip._vendor.pygments.lexers.parasail', 'ParaSail', ('parasail',), ('*.psi', '*.psl'), ('text/x-parasail',)), - 'PawnLexer': ('pip._vendor.pygments.lexers.pawn', 'Pawn', ('pawn',), ('*.p', '*.pwn', '*.inc'), ('text/x-pawn',)), - 'PddlLexer': ('pip._vendor.pygments.lexers.pddl', 'PDDL', ('pddl',), ('*.pddl',), ()), - 'PegLexer': ('pip._vendor.pygments.lexers.grammar_notation', 'PEG', ('peg',), ('*.peg',), ('text/x-peg',)), - 'Perl6Lexer': ('pip._vendor.pygments.lexers.perl', 'Perl6', ('perl6', 'pl6', 'raku'), ('*.pl', '*.pm', '*.nqp', '*.p6', '*.6pl', '*.p6l', '*.pl6', '*.6pm', '*.p6m', '*.pm6', '*.t', '*.raku', '*.rakumod', '*.rakutest', '*.rakudoc'), ('text/x-perl6', 'application/x-perl6')), - 'PerlLexer': ('pip._vendor.pygments.lexers.perl', 'Perl', ('perl', 'pl'), ('*.pl', '*.pm', '*.t', '*.perl'), ('text/x-perl', 'application/x-perl')), - 'PhixLexer': ('pip._vendor.pygments.lexers.phix', 'Phix', ('phix',), ('*.exw',), ('text/x-phix',)), - 'PhpLexer': ('pip._vendor.pygments.lexers.php', 'PHP', ('php', 'php3', 'php4', 'php5'), ('*.php', '*.php[345]', '*.inc'), ('text/x-php',)), - 'PigLexer': ('pip._vendor.pygments.lexers.jvm', 'Pig', ('pig',), ('*.pig',), ('text/x-pig',)), - 'PikeLexer': ('pip._vendor.pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)), - 'PkgConfigLexer': ('pip._vendor.pygments.lexers.configs', 'PkgConfig', ('pkgconfig',), ('*.pc',), ()), - 'PlPgsqlLexer': ('pip._vendor.pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)), - 'PointlessLexer': ('pip._vendor.pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()), - 'PonyLexer': ('pip._vendor.pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()), - 'PortugolLexer': ('pip._vendor.pygments.lexers.pascal', 'Portugol', ('portugol',), ('*.alg', '*.portugol'), ()), - 'PostScriptLexer': ('pip._vendor.pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)), - 'PostgresConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)), - 'PostgresExplainLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL EXPLAIN dialect', ('postgres-explain',), ('*.explain',), ('text/x-postgresql-explain',)), - 'PostgresLexer': ('pip._vendor.pygments.lexers.sql', 'PostgreSQL SQL dialect', ('postgresql', 'postgres'), (), ('text/x-postgresql',)), - 'PovrayLexer': ('pip._vendor.pygments.lexers.graphics', 'POVRay', ('pov',), ('*.pov', '*.inc'), ('text/x-povray',)), - 'PowerShellLexer': ('pip._vendor.pygments.lexers.shell', 'PowerShell', ('powershell', 'pwsh', 'posh', 'ps1', 'psm1'), ('*.ps1', '*.psm1'), ('text/x-powershell',)), - 'PowerShellSessionLexer': ('pip._vendor.pygments.lexers.shell', 'PowerShell Session', ('pwsh-session', 'ps1con'), (), ()), - 'PraatLexer': ('pip._vendor.pygments.lexers.praat', 'Praat', ('praat',), ('*.praat', '*.proc', '*.psc'), ()), - 'ProcfileLexer': ('pip._vendor.pygments.lexers.procfile', 'Procfile', ('procfile',), ('Procfile',), ()), - 'PrologLexer': ('pip._vendor.pygments.lexers.prolog', 'Prolog', ('prolog',), ('*.ecl', '*.prolog', '*.pro', '*.pl'), ('text/x-prolog',)), - 'PromQLLexer': ('pip._vendor.pygments.lexers.promql', 'PromQL', ('promql',), ('*.promql',), ()), - 'PromelaLexer': ('pip._vendor.pygments.lexers.c_like', 'Promela', ('promela',), ('*.pml', '*.prom', '*.prm', '*.promela', '*.pr', '*.pm'), ('text/x-promela',)), - 'PropertiesLexer': ('pip._vendor.pygments.lexers.configs', 'Properties', ('properties', 'jproperties'), ('*.properties',), ('text/x-java-properties',)), - 'ProtoBufLexer': ('pip._vendor.pygments.lexers.dsls', 'Protocol Buffer', ('protobuf', 'proto'), ('*.proto',), ()), - 'PrqlLexer': ('pip._vendor.pygments.lexers.prql', 'PRQL', ('prql',), ('*.prql',), ('application/prql', 'application/x-prql')), - 'PsyshConsoleLexer': ('pip._vendor.pygments.lexers.php', 'PsySH console session for PHP', ('psysh',), (), ()), - 'PtxLexer': ('pip._vendor.pygments.lexers.ptx', 'PTX', ('ptx',), ('*.ptx',), ('text/x-ptx',)), - 'PugLexer': ('pip._vendor.pygments.lexers.html', 'Pug', ('pug', 'jade'), ('*.pug', '*.jade'), ('text/x-pug', 'text/x-jade')), - 'PuppetLexer': ('pip._vendor.pygments.lexers.dsls', 'Puppet', ('puppet',), ('*.pp',), ()), - 'PyPyLogLexer': ('pip._vendor.pygments.lexers.console', 'PyPy Log', ('pypylog', 'pypy'), ('*.pypylog',), ('application/x-pypylog',)), - 'Python2Lexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x', ('python2', 'py2'), (), ('text/x-python2', 'application/x-python2')), - 'Python2TracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python 2.x Traceback', ('py2tb',), ('*.py2tb',), ('text/x-python2-traceback',)), - 'PythonConsoleLexer': ('pip._vendor.pygments.lexers.python', 'Python console session', ('pycon', 'python-console'), (), ('text/x-python-doctest',)), - 'PythonLexer': ('pip._vendor.pygments.lexers.python', 'Python', ('python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi'), ('*.py', '*.pyw', '*.pyi', '*.jy', '*.sage', '*.sc', 'SConstruct', 'SConscript', '*.bzl', 'BUCK', 'BUILD', 'BUILD.bazel', 'WORKSPACE', '*.tac', '*.pye'), ('text/x-python', 'application/x-python', 'text/x-python3', 'application/x-python3')), - 'PythonTracebackLexer': ('pip._vendor.pygments.lexers.python', 'Python Traceback', ('pytb', 'py3tb'), ('*.pytb', '*.py3tb'), ('text/x-python-traceback', 'text/x-python3-traceback')), - 'PythonUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'Python+UL4', ('py+ul4',), ('*.pyul4',), ()), - 'QBasicLexer': ('pip._vendor.pygments.lexers.basic', 'QBasic', ('qbasic', 'basic'), ('*.BAS', '*.bas'), ('text/basic',)), - 'QLexer': ('pip._vendor.pygments.lexers.q', 'Q', ('q',), ('*.q',), ()), - 'QVToLexer': ('pip._vendor.pygments.lexers.qvt', 'QVTO', ('qvto', 'qvt'), ('*.qvto',), ()), - 'QlikLexer': ('pip._vendor.pygments.lexers.qlik', 'Qlik', ('qlik', 'qlikview', 'qliksense', 'qlikscript'), ('*.qvs', '*.qvw'), ()), - 'QmlLexer': ('pip._vendor.pygments.lexers.webmisc', 'QML', ('qml', 'qbs'), ('*.qml', '*.qbs'), ('application/x-qml', 'application/x-qt.qbs+qml')), - 'RConsoleLexer': ('pip._vendor.pygments.lexers.r', 'RConsole', ('rconsole', 'rout'), ('*.Rout',), ()), - 'RNCCompactLexer': ('pip._vendor.pygments.lexers.rnc', 'Relax-NG Compact', ('rng-compact', 'rnc'), ('*.rnc',), ()), - 'RPMSpecLexer': ('pip._vendor.pygments.lexers.installers', 'RPMSpec', ('spec',), ('*.spec',), ('text/x-rpm-spec',)), - 'RacketLexer': ('pip._vendor.pygments.lexers.lisp', 'Racket', ('racket', 'rkt'), ('*.rkt', '*.rktd', '*.rktl'), ('text/x-racket', 'application/x-racket')), - 'RagelCLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in C Host', ('ragel-c',), ('*.rl',), ()), - 'RagelCppLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in CPP Host', ('ragel-cpp',), ('*.rl',), ()), - 'RagelDLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in D Host', ('ragel-d',), ('*.rl',), ()), - 'RagelEmbeddedLexer': ('pip._vendor.pygments.lexers.parsers', 'Embedded Ragel', ('ragel-em',), ('*.rl',), ()), - 'RagelJavaLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Java Host', ('ragel-java',), ('*.rl',), ()), - 'RagelLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel', ('ragel',), (), ()), - 'RagelObjectiveCLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Objective C Host', ('ragel-objc',), ('*.rl',), ()), - 'RagelRubyLexer': ('pip._vendor.pygments.lexers.parsers', 'Ragel in Ruby Host', ('ragel-ruby', 'ragel-rb'), ('*.rl',), ()), - 'RawTokenLexer': ('pip._vendor.pygments.lexers.special', 'Raw token data', (), (), ('application/x-pygments-tokens',)), - 'RdLexer': ('pip._vendor.pygments.lexers.r', 'Rd', ('rd',), ('*.Rd',), ('text/x-r-doc',)), - 'ReasonLexer': ('pip._vendor.pygments.lexers.ml', 'ReasonML', ('reasonml', 'reason'), ('*.re', '*.rei'), ('text/x-reasonml',)), - 'RebolLexer': ('pip._vendor.pygments.lexers.rebol', 'REBOL', ('rebol',), ('*.r', '*.r3', '*.reb'), ('text/x-rebol',)), - 'RedLexer': ('pip._vendor.pygments.lexers.rebol', 'Red', ('red', 'red/system'), ('*.red', '*.reds'), ('text/x-red', 'text/x-red-system')), - 'RedcodeLexer': ('pip._vendor.pygments.lexers.esoteric', 'Redcode', ('redcode',), ('*.cw',), ()), - 'RegeditLexer': ('pip._vendor.pygments.lexers.configs', 'reg', ('registry',), ('*.reg',), ('text/x-windows-registry',)), - 'RegoLexer': ('pip._vendor.pygments.lexers.rego', 'Rego', ('rego',), ('*.rego',), ('text/x-rego',)), - 'RellLexer': ('pip._vendor.pygments.lexers.rell', 'Rell', ('rell',), ('*.rell',), ('text/x-rell',)), - 'ResourceLexer': ('pip._vendor.pygments.lexers.resource', 'ResourceBundle', ('resourcebundle', 'resource'), (), ()), - 'RexxLexer': ('pip._vendor.pygments.lexers.scripting', 'Rexx', ('rexx', 'arexx'), ('*.rexx', '*.rex', '*.rx', '*.arexx'), ('text/x-rexx',)), - 'RhtmlLexer': ('pip._vendor.pygments.lexers.templates', 'RHTML', ('rhtml', 'html+erb', 'html+ruby'), ('*.rhtml',), ('text/html+ruby',)), - 'RideLexer': ('pip._vendor.pygments.lexers.ride', 'Ride', ('ride',), ('*.ride',), ('text/x-ride',)), - 'RitaLexer': ('pip._vendor.pygments.lexers.rita', 'Rita', ('rita',), ('*.rita',), ('text/rita',)), - 'RoboconfGraphLexer': ('pip._vendor.pygments.lexers.roboconf', 'Roboconf Graph', ('roboconf-graph',), ('*.graph',), ()), - 'RoboconfInstancesLexer': ('pip._vendor.pygments.lexers.roboconf', 'Roboconf Instances', ('roboconf-instances',), ('*.instances',), ()), - 'RobotFrameworkLexer': ('pip._vendor.pygments.lexers.robotframework', 'RobotFramework', ('robotframework',), ('*.robot', '*.resource'), ('text/x-robotframework',)), - 'RocqLexer': ('pip._vendor.pygments.lexers.theorem', 'Rocq Prover', ('coq', 'rocq', 'rocq-prover'), ('*.v',), ('text/x-coq', 'text/x-rocq')), - 'RqlLexer': ('pip._vendor.pygments.lexers.sql', 'RQL', ('rql',), ('*.rql',), ('text/x-rql',)), - 'RslLexer': ('pip._vendor.pygments.lexers.dsls', 'RSL', ('rsl',), ('*.rsl',), ('text/rsl',)), - 'RstLexer': ('pip._vendor.pygments.lexers.markup', 'reStructuredText', ('restructuredtext', 'rst', 'rest'), ('*.rst', '*.rest'), ('text/x-rst', 'text/prs.fallenstein.rst')), - 'RtsLexer': ('pip._vendor.pygments.lexers.trafficscript', 'TrafficScript', ('trafficscript', 'rts'), ('*.rts',), ()), - 'RubyConsoleLexer': ('pip._vendor.pygments.lexers.ruby', 'Ruby irb session', ('rbcon', 'irb'), (), ('text/x-ruby-shellsession',)), - 'RubyLexer': ('pip._vendor.pygments.lexers.ruby', 'Ruby', ('ruby', 'rb', 'duby'), ('*.rb', '*.rbw', 'Rakefile', '*.rake', '*.gemspec', '*.rbx', '*.duby', 'Gemfile', 'Vagrantfile'), ('text/x-ruby', 'application/x-ruby')), - 'RustLexer': ('pip._vendor.pygments.lexers.rust', 'Rust', ('rust', 'rs'), ('*.rs', '*.rs.in'), ('text/rust', 'text/x-rust')), - 'SASLexer': ('pip._vendor.pygments.lexers.sas', 'SAS', ('sas',), ('*.SAS', '*.sas'), ('text/x-sas', 'text/sas', 'application/x-sas')), - 'SLexer': ('pip._vendor.pygments.lexers.r', 'S', ('splus', 's', 'r'), ('*.S', '*.R', '.Rhistory', '.Rprofile', '.Renviron'), ('text/S-plus', 'text/S', 'text/x-r-source', 'text/x-r', 'text/x-R', 'text/x-r-history', 'text/x-r-profile')), - 'SMLLexer': ('pip._vendor.pygments.lexers.ml', 'Standard ML', ('sml',), ('*.sml', '*.sig', '*.fun'), ('text/x-standardml', 'application/x-standardml')), - 'SNBTLexer': ('pip._vendor.pygments.lexers.minecraft', 'SNBT', ('snbt',), ('*.snbt',), ('text/snbt',)), - 'SarlLexer': ('pip._vendor.pygments.lexers.jvm', 'SARL', ('sarl',), ('*.sarl',), ('text/x-sarl',)), - 'SassLexer': ('pip._vendor.pygments.lexers.css', 'Sass', ('sass',), ('*.sass',), ('text/x-sass',)), - 'SaviLexer': ('pip._vendor.pygments.lexers.savi', 'Savi', ('savi',), ('*.savi',), ()), - 'ScalaLexer': ('pip._vendor.pygments.lexers.jvm', 'Scala', ('scala',), ('*.scala',), ('text/x-scala',)), - 'ScamlLexer': ('pip._vendor.pygments.lexers.html', 'Scaml', ('scaml',), ('*.scaml',), ('text/x-scaml',)), - 'ScdocLexer': ('pip._vendor.pygments.lexers.scdoc', 'scdoc', ('scdoc', 'scd'), ('*.scd', '*.scdoc'), ()), - 'SchemeLexer': ('pip._vendor.pygments.lexers.lisp', 'Scheme', ('scheme', 'scm'), ('*.scm', '*.ss'), ('text/x-scheme', 'application/x-scheme')), - 'ScilabLexer': ('pip._vendor.pygments.lexers.matlab', 'Scilab', ('scilab',), ('*.sci', '*.sce', '*.tst'), ('text/scilab',)), - 'ScssLexer': ('pip._vendor.pygments.lexers.css', 'SCSS', ('scss',), ('*.scss',), ('text/x-scss',)), - 'SedLexer': ('pip._vendor.pygments.lexers.textedit', 'Sed', ('sed', 'gsed', 'ssed'), ('*.sed', '*.[gs]sed'), ('text/x-sed',)), - 'ShExCLexer': ('pip._vendor.pygments.lexers.rdf', 'ShExC', ('shexc', 'shex'), ('*.shex',), ('text/shex',)), - 'ShenLexer': ('pip._vendor.pygments.lexers.lisp', 'Shen', ('shen',), ('*.shen',), ('text/x-shen', 'application/x-shen')), - 'SieveLexer': ('pip._vendor.pygments.lexers.sieve', 'Sieve', ('sieve',), ('*.siv', '*.sieve'), ()), - 'SilverLexer': ('pip._vendor.pygments.lexers.verification', 'Silver', ('silver',), ('*.sil', '*.vpr'), ()), - 'SingularityLexer': ('pip._vendor.pygments.lexers.configs', 'Singularity', ('singularity',), ('*.def', 'Singularity'), ()), - 'SlashLexer': ('pip._vendor.pygments.lexers.slash', 'Slash', ('slash',), ('*.sla',), ()), - 'SlimLexer': ('pip._vendor.pygments.lexers.webmisc', 'Slim', ('slim',), ('*.slim',), ('text/x-slim',)), - 'SlurmBashLexer': ('pip._vendor.pygments.lexers.shell', 'Slurm', ('slurm', 'sbatch'), ('*.sl',), ()), - 'SmaliLexer': ('pip._vendor.pygments.lexers.dalvik', 'Smali', ('smali',), ('*.smali',), ('text/smali',)), - 'SmalltalkLexer': ('pip._vendor.pygments.lexers.smalltalk', 'Smalltalk', ('smalltalk', 'squeak', 'st'), ('*.st',), ('text/x-smalltalk',)), - 'SmartGameFormatLexer': ('pip._vendor.pygments.lexers.sgf', 'SmartGameFormat', ('sgf',), ('*.sgf',), ()), - 'SmartyLexer': ('pip._vendor.pygments.lexers.templates', 'Smarty', ('smarty',), ('*.tpl',), ('application/x-smarty',)), - 'SmithyLexer': ('pip._vendor.pygments.lexers.smithy', 'Smithy', ('smithy',), ('*.smithy',), ()), - 'SnobolLexer': ('pip._vendor.pygments.lexers.snobol', 'Snobol', ('snobol',), ('*.snobol',), ('text/x-snobol',)), - 'SnowballLexer': ('pip._vendor.pygments.lexers.dsls', 'Snowball', ('snowball',), ('*.sbl',), ()), - 'SolidityLexer': ('pip._vendor.pygments.lexers.solidity', 'Solidity', ('solidity',), ('*.sol',), ()), - 'SoongLexer': ('pip._vendor.pygments.lexers.soong', 'Soong', ('androidbp', 'bp', 'soong'), ('Android.bp',), ()), - 'SophiaLexer': ('pip._vendor.pygments.lexers.sophia', 'Sophia', ('sophia',), ('*.aes',), ()), - 'SourcePawnLexer': ('pip._vendor.pygments.lexers.pawn', 'SourcePawn', ('sp',), ('*.sp',), ('text/x-sourcepawn',)), - 'SourcesListLexer': ('pip._vendor.pygments.lexers.installers', 'Debian Sourcelist', ('debsources', 'sourceslist', 'sources.list'), ('sources.list',), ()), - 'SparqlLexer': ('pip._vendor.pygments.lexers.rdf', 'SPARQL', ('sparql',), ('*.rq', '*.sparql'), ('application/sparql-query',)), - 'SpiceLexer': ('pip._vendor.pygments.lexers.spice', 'Spice', ('spice', 'spicelang'), ('*.spice',), ('text/x-spice',)), - 'SqlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'SQL+Jinja', ('sql+jinja',), ('*.sql', '*.sql.j2', '*.sql.jinja2'), ()), - 'SqlLexer': ('pip._vendor.pygments.lexers.sql', 'SQL', ('sql',), ('*.sql',), ('text/x-sql',)), - 'SqliteConsoleLexer': ('pip._vendor.pygments.lexers.sql', 'sqlite3con', ('sqlite3',), ('*.sqlite3-console',), ('text/x-sqlite3-console',)), - 'SquidConfLexer': ('pip._vendor.pygments.lexers.configs', 'SquidConf', ('squidconf', 'squid.conf', 'squid'), ('squid.conf',), ('text/x-squidconf',)), - 'SrcinfoLexer': ('pip._vendor.pygments.lexers.srcinfo', 'Srcinfo', ('srcinfo',), ('.SRCINFO',), ()), - 'SspLexer': ('pip._vendor.pygments.lexers.templates', 'Scalate Server Page', ('ssp',), ('*.ssp',), ('application/x-ssp',)), - 'StanLexer': ('pip._vendor.pygments.lexers.modeling', 'Stan', ('stan',), ('*.stan',), ()), - 'StataLexer': ('pip._vendor.pygments.lexers.stata', 'Stata', ('stata', 'do'), ('*.do', '*.ado'), ('text/x-stata', 'text/stata', 'application/x-stata')), - 'SuperColliderLexer': ('pip._vendor.pygments.lexers.supercollider', 'SuperCollider', ('supercollider', 'sc'), ('*.sc', '*.scd'), ('application/supercollider', 'text/supercollider')), - 'SwiftLexer': ('pip._vendor.pygments.lexers.objective', 'Swift', ('swift',), ('*.swift',), ('text/x-swift',)), - 'SwigLexer': ('pip._vendor.pygments.lexers.c_like', 'SWIG', ('swig',), ('*.swg', '*.i'), ('text/swig',)), - 'SystemVerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'systemverilog', ('systemverilog', 'sv'), ('*.sv', '*.svh'), ('text/x-systemverilog',)), - 'SystemdLexer': ('pip._vendor.pygments.lexers.configs', 'Systemd', ('systemd',), ('*.service', '*.socket', '*.device', '*.mount', '*.automount', '*.swap', '*.target', '*.path', '*.timer', '*.slice', '*.scope'), ()), - 'TAPLexer': ('pip._vendor.pygments.lexers.testing', 'TAP', ('tap',), ('*.tap',), ()), - 'TNTLexer': ('pip._vendor.pygments.lexers.tnt', 'Typographic Number Theory', ('tnt',), ('*.tnt',), ()), - 'TOMLLexer': ('pip._vendor.pygments.lexers.configs', 'TOML', ('toml',), ('*.toml', 'Pipfile', 'poetry.lock'), ('application/toml',)), - 'TableGenLexer': ('pip._vendor.pygments.lexers.tablegen', 'TableGen', ('tablegen', 'td'), ('*.td',), ()), - 'TactLexer': ('pip._vendor.pygments.lexers.tact', 'Tact', ('tact',), ('*.tact',), ()), - 'Tads3Lexer': ('pip._vendor.pygments.lexers.int_fiction', 'TADS 3', ('tads3',), ('*.t',), ()), - 'TalLexer': ('pip._vendor.pygments.lexers.tal', 'Tal', ('tal', 'uxntal'), ('*.tal',), ('text/x-uxntal',)), - 'TasmLexer': ('pip._vendor.pygments.lexers.asm', 'TASM', ('tasm',), ('*.asm', '*.ASM', '*.tasm'), ('text/x-tasm',)), - 'TclLexer': ('pip._vendor.pygments.lexers.tcl', 'Tcl', ('tcl',), ('*.tcl', '*.rvt'), ('text/x-tcl', 'text/x-script.tcl', 'application/x-tcl')), - 'TcshLexer': ('pip._vendor.pygments.lexers.shell', 'Tcsh', ('tcsh', 'csh'), ('*.tcsh', '*.csh'), ('application/x-csh',)), - 'TcshSessionLexer': ('pip._vendor.pygments.lexers.shell', 'Tcsh Session', ('tcshcon',), (), ()), - 'TeaTemplateLexer': ('pip._vendor.pygments.lexers.templates', 'Tea', ('tea',), ('*.tea',), ('text/x-tea',)), - 'TealLexer': ('pip._vendor.pygments.lexers.teal', 'teal', ('teal',), ('*.teal',), ()), - 'TeraTermLexer': ('pip._vendor.pygments.lexers.teraterm', 'Tera Term macro', ('teratermmacro', 'teraterm', 'ttl'), ('*.ttl',), ('text/x-teratermmacro',)), - 'TermcapLexer': ('pip._vendor.pygments.lexers.configs', 'Termcap', ('termcap',), ('termcap', 'termcap.src'), ()), - 'TerminfoLexer': ('pip._vendor.pygments.lexers.configs', 'Terminfo', ('terminfo',), ('terminfo', 'terminfo.src'), ()), - 'TerraformLexer': ('pip._vendor.pygments.lexers.configs', 'Terraform', ('terraform', 'tf', 'hcl'), ('*.tf', '*.hcl'), ('application/x-tf', 'application/x-terraform')), - 'TexLexer': ('pip._vendor.pygments.lexers.markup', 'TeX', ('tex', 'latex'), ('*.tex', '*.aux', '*.toc'), ('text/x-tex', 'text/x-latex')), - 'TextLexer': ('pip._vendor.pygments.lexers.special', 'Text only', ('text',), ('*.txt',), ('text/plain',)), - 'ThingsDBLexer': ('pip._vendor.pygments.lexers.thingsdb', 'ThingsDB', ('ti', 'thingsdb'), ('*.ti',), ()), - 'ThriftLexer': ('pip._vendor.pygments.lexers.dsls', 'Thrift', ('thrift',), ('*.thrift',), ('application/x-thrift',)), - 'TiddlyWiki5Lexer': ('pip._vendor.pygments.lexers.markup', 'tiddler', ('tid',), ('*.tid',), ('text/vnd.tiddlywiki',)), - 'TlbLexer': ('pip._vendor.pygments.lexers.tlb', 'Tl-b', ('tlb',), ('*.tlb',), ()), - 'TlsLexer': ('pip._vendor.pygments.lexers.tls', 'TLS Presentation Language', ('tls',), (), ()), - 'TodotxtLexer': ('pip._vendor.pygments.lexers.textfmts', 'Todotxt', ('todotxt',), ('todo.txt', '*.todotxt'), ('text/x-todo',)), - 'TransactSqlLexer': ('pip._vendor.pygments.lexers.sql', 'Transact-SQL', ('tsql', 't-sql'), ('*.sql',), ('text/x-tsql',)), - 'TreetopLexer': ('pip._vendor.pygments.lexers.parsers', 'Treetop', ('treetop',), ('*.treetop', '*.tt'), ()), - 'TsxLexer': ('pip._vendor.pygments.lexers.jsx', 'TSX', ('tsx',), ('*.tsx',), ('text/typescript-tsx',)), - 'TurtleLexer': ('pip._vendor.pygments.lexers.rdf', 'Turtle', ('turtle',), ('*.ttl',), ('text/turtle', 'application/x-turtle')), - 'TwigHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Twig', ('html+twig',), ('*.twig',), ('text/html+twig',)), - 'TwigLexer': ('pip._vendor.pygments.lexers.templates', 'Twig', ('twig',), (), ('application/x-twig',)), - 'TypeScriptLexer': ('pip._vendor.pygments.lexers.javascript', 'TypeScript', ('typescript', 'ts'), ('*.ts',), ('application/x-typescript', 'text/x-typescript')), - 'TypoScriptCssDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptCssData', ('typoscriptcssdata',), (), ()), - 'TypoScriptHtmlDataLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScriptHtmlData', ('typoscripthtmldata',), (), ()), - 'TypoScriptLexer': ('pip._vendor.pygments.lexers.typoscript', 'TypoScript', ('typoscript',), ('*.typoscript',), ('text/x-typoscript',)), - 'TypstLexer': ('pip._vendor.pygments.lexers.typst', 'Typst', ('typst',), ('*.typ',), ('text/x-typst',)), - 'UL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'UL4', ('ul4',), ('*.ul4',), ()), - 'UcodeLexer': ('pip._vendor.pygments.lexers.unicon', 'ucode', ('ucode',), ('*.u', '*.u1', '*.u2'), ()), - 'UniconLexer': ('pip._vendor.pygments.lexers.unicon', 'Unicon', ('unicon',), ('*.icn',), ('text/unicon',)), - 'UnixConfigLexer': ('pip._vendor.pygments.lexers.configs', 'Unix/Linux config files', ('unixconfig', 'linuxconfig'), (), ()), - 'UrbiscriptLexer': ('pip._vendor.pygments.lexers.urbi', 'UrbiScript', ('urbiscript',), ('*.u',), ('application/x-urbiscript',)), - 'UrlEncodedLexer': ('pip._vendor.pygments.lexers.html', 'urlencoded', ('urlencoded',), (), ('application/x-www-form-urlencoded',)), - 'UsdLexer': ('pip._vendor.pygments.lexers.usd', 'USD', ('usd', 'usda'), ('*.usd', '*.usda'), ()), - 'VBScriptLexer': ('pip._vendor.pygments.lexers.basic', 'VBScript', ('vbscript',), ('*.vbs', '*.VBS'), ()), - 'VCLLexer': ('pip._vendor.pygments.lexers.varnish', 'VCL', ('vcl',), ('*.vcl',), ('text/x-vclsrc',)), - 'VCLSnippetLexer': ('pip._vendor.pygments.lexers.varnish', 'VCLSnippets', ('vclsnippets', 'vclsnippet'), (), ('text/x-vclsnippet',)), - 'VCTreeStatusLexer': ('pip._vendor.pygments.lexers.console', 'VCTreeStatus', ('vctreestatus',), (), ()), - 'VGLLexer': ('pip._vendor.pygments.lexers.dsls', 'VGL', ('vgl',), ('*.rpf',), ()), - 'ValaLexer': ('pip._vendor.pygments.lexers.c_like', 'Vala', ('vala', 'vapi'), ('*.vala', '*.vapi'), ('text/x-vala',)), - 'VbNetAspxLexer': ('pip._vendor.pygments.lexers.dotnet', 'aspx-vb', ('aspx-vb',), ('*.aspx', '*.asax', '*.ascx', '*.ashx', '*.asmx', '*.axd'), ()), - 'VbNetLexer': ('pip._vendor.pygments.lexers.dotnet', 'VB.net', ('vb.net', 'vbnet', 'lobas', 'oobas', 'sobas', 'visual-basic', 'visualbasic'), ('*.vb', '*.bas'), ('text/x-vbnet', 'text/x-vba')), - 'VelocityHtmlLexer': ('pip._vendor.pygments.lexers.templates', 'HTML+Velocity', ('html+velocity',), (), ('text/html+velocity',)), - 'VelocityLexer': ('pip._vendor.pygments.lexers.templates', 'Velocity', ('velocity',), ('*.vm', '*.fhtml'), ()), - 'VelocityXmlLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Velocity', ('xml+velocity',), (), ('application/xml+velocity',)), - 'VerifpalLexer': ('pip._vendor.pygments.lexers.verifpal', 'Verifpal', ('verifpal',), ('*.vp',), ('text/x-verifpal',)), - 'VerilogLexer': ('pip._vendor.pygments.lexers.hdl', 'verilog', ('verilog', 'v'), ('*.v',), ('text/x-verilog',)), - 'VhdlLexer': ('pip._vendor.pygments.lexers.hdl', 'vhdl', ('vhdl',), ('*.vhdl', '*.vhd'), ('text/x-vhdl',)), - 'VimLexer': ('pip._vendor.pygments.lexers.textedit', 'VimL', ('vim',), ('*.vim', '.vimrc', '.exrc', '.gvimrc', '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc'), ('text/x-vim',)), - 'VisualPrologGrammarLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog Grammar', ('visualprologgrammar',), ('*.vipgrm',), ()), - 'VisualPrologLexer': ('pip._vendor.pygments.lexers.vip', 'Visual Prolog', ('visualprolog',), ('*.pro', '*.cl', '*.i', '*.pack', '*.ph'), ()), - 'VueLexer': ('pip._vendor.pygments.lexers.html', 'Vue', ('vue',), ('*.vue',), ()), - 'VyperLexer': ('pip._vendor.pygments.lexers.vyper', 'Vyper', ('vyper',), ('*.vy',), ()), - 'WDiffLexer': ('pip._vendor.pygments.lexers.diff', 'WDiff', ('wdiff',), ('*.wdiff',), ()), - 'WatLexer': ('pip._vendor.pygments.lexers.webassembly', 'WebAssembly', ('wast', 'wat'), ('*.wat', '*.wast'), ()), - 'WebIDLLexer': ('pip._vendor.pygments.lexers.webidl', 'Web IDL', ('webidl',), ('*.webidl',), ()), - 'WgslLexer': ('pip._vendor.pygments.lexers.wgsl', 'WebGPU Shading Language', ('wgsl',), ('*.wgsl',), ('text/wgsl',)), - 'WhileyLexer': ('pip._vendor.pygments.lexers.whiley', 'Whiley', ('whiley',), ('*.whiley',), ('text/x-whiley',)), - 'WikitextLexer': ('pip._vendor.pygments.lexers.markup', 'Wikitext', ('wikitext', 'mediawiki'), (), ('text/x-wiki',)), - 'WoWTocLexer': ('pip._vendor.pygments.lexers.wowtoc', 'World of Warcraft TOC', ('wowtoc',), ('*.toc',), ()), - 'WrenLexer': ('pip._vendor.pygments.lexers.wren', 'Wren', ('wren',), ('*.wren',), ()), - 'X10Lexer': ('pip._vendor.pygments.lexers.x10', 'X10', ('x10', 'xten'), ('*.x10',), ('text/x-x10',)), - 'XMLUL4Lexer': ('pip._vendor.pygments.lexers.ul4', 'XML+UL4', ('xml+ul4',), ('*.xmlul4',), ()), - 'XQueryLexer': ('pip._vendor.pygments.lexers.webmisc', 'XQuery', ('xquery', 'xqy', 'xq', 'xql', 'xqm'), ('*.xqy', '*.xquery', '*.xq', '*.xql', '*.xqm'), ('text/xquery', 'application/xquery')), - 'XmlDjangoLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Django/Jinja', ('xml+django', 'xml+jinja'), ('*.xml.j2', '*.xml.jinja2'), ('application/xml+django', 'application/xml+jinja')), - 'XmlErbLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Ruby', ('xml+ruby', 'xml+erb'), (), ('application/xml+ruby',)), - 'XmlLexer': ('pip._vendor.pygments.lexers.html', 'XML', ('xml',), ('*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl', '*.wsf', '*.xbrl', '*.pom'), ('text/xml', 'application/xml', 'image/svg+xml', 'application/rss+xml', 'application/atom+xml')), - 'XmlPhpLexer': ('pip._vendor.pygments.lexers.templates', 'XML+PHP', ('xml+php',), (), ('application/xml+php',)), - 'XmlSmartyLexer': ('pip._vendor.pygments.lexers.templates', 'XML+Smarty', ('xml+smarty',), (), ('application/xml+smarty',)), - 'XorgLexer': ('pip._vendor.pygments.lexers.xorg', 'Xorg', ('xorg.conf',), ('xorg.conf',), ()), - 'XppLexer': ('pip._vendor.pygments.lexers.dotnet', 'X++', ('xpp', 'x++'), ('*.xpp',), ()), - 'XsltLexer': ('pip._vendor.pygments.lexers.html', 'XSLT', ('xslt',), ('*.xsl', '*.xslt', '*.xpl'), ('application/xsl+xml', 'application/xslt+xml')), - 'XtendLexer': ('pip._vendor.pygments.lexers.jvm', 'Xtend', ('xtend',), ('*.xtend',), ('text/x-xtend',)), - 'XtlangLexer': ('pip._vendor.pygments.lexers.lisp', 'xtlang', ('extempore',), ('*.xtm',), ()), - 'YamlJinjaLexer': ('pip._vendor.pygments.lexers.templates', 'YAML+Jinja', ('yaml+jinja', 'salt', 'sls'), ('*.sls', '*.yaml.j2', '*.yml.j2', '*.yaml.jinja2', '*.yml.jinja2'), ('text/x-yaml+jinja', 'text/x-sls')), - 'YamlLexer': ('pip._vendor.pygments.lexers.data', 'YAML', ('yaml',), ('*.yaml', '*.yml'), ('text/x-yaml',)), - 'YangLexer': ('pip._vendor.pygments.lexers.yang', 'YANG', ('yang',), ('*.yang',), ('application/yang',)), - 'YaraLexer': ('pip._vendor.pygments.lexers.yara', 'YARA', ('yara', 'yar'), ('*.yar',), ('text/x-yara',)), - 'ZeekLexer': ('pip._vendor.pygments.lexers.dsls', 'Zeek', ('zeek', 'bro'), ('*.zeek', '*.bro'), ()), - 'ZephirLexer': ('pip._vendor.pygments.lexers.php', 'Zephir', ('zephir',), ('*.zep',), ()), - 'ZigLexer': ('pip._vendor.pygments.lexers.zig', 'Zig', ('zig',), ('*.zig',), ('text/zig',)), - 'apdlexer': ('pip._vendor.pygments.lexers.apdlexer', 'ANSYS parametric design language', ('ansys', 'apdl'), ('*.ans',), ()), -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py deleted file mode 100755 index 0ec67e5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/lexers/python.py +++ /dev/null @@ -1,1204 +0,0 @@ -""" - pygments.lexers.python - ~~~~~~~~~~~~~~~~~~~~~~ - - Lexers for Python and related languages. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import keyword - -from pip._vendor.pygments.lexer import DelegatingLexer, RegexLexer, include, \ - bygroups, using, default, words, combined, this -from pip._vendor.pygments.util import get_bool_opt, shebang_matches -from pip._vendor.pygments.token import Text, Comment, Operator, Keyword, Name, String, \ - Number, Punctuation, Generic, Other, Error, Whitespace -from pip._vendor.pygments import unistring as uni - -__all__ = ['PythonLexer', 'PythonConsoleLexer', 'PythonTracebackLexer', - 'Python2Lexer', 'Python2TracebackLexer', - 'CythonLexer', 'DgLexer', 'NumPyLexer'] - - -class PythonLexer(RegexLexer): - """ - For Python source code (version 3.x). - - .. versionchanged:: 2.5 - This is now the default ``PythonLexer``. It is still available as the - alias ``Python3Lexer``. - """ - - name = 'Python' - url = 'https://www.python.org' - aliases = ['python', 'py', 'sage', 'python3', 'py3', 'bazel', 'starlark', 'pyi'] - filenames = [ - '*.py', - '*.pyw', - # Type stubs - '*.pyi', - # Jython - '*.jy', - # Sage - '*.sage', - # SCons - '*.sc', - 'SConstruct', - 'SConscript', - # Skylark/Starlark (used by Bazel, Buck, and Pants) - '*.bzl', - 'BUCK', - 'BUILD', - 'BUILD.bazel', - 'WORKSPACE', - # Twisted Application infrastructure - '*.tac', - # Execubot level format - '*.pye', - ] - mimetypes = ['text/x-python', 'application/x-python', - 'text/x-python3', 'application/x-python3'] - version_added = '0.10' - - uni_name = f"[{uni.xid_start}][{uni.xid_continue}]*" - - def innerstring_rules(ttype): - return [ - # the old style '%s' % (...) string formatting (still valid in Py3) - (r'%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?' - '[hlL]?[E-GXc-giorsaux%]', String.Interpol), - # the new style '{}'.format(...) string formatting - (r'\{' - r'((\w+)((\.\w+)|(\[[^\]]+\]))*)?' # field name - r'(\![sra])?' # conversion - r'(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?' - r'\}', String.Interpol), - - # backslashes, quotes and formatting signs must be parsed one at a time - (r'[^\\\'"%{\n]+', ttype), - (r'[\'"\\]', ttype), - # unhandled string formatting sign - (r'%|(\{{1,2})', ttype) - # newlines are an error (use "nl" state) - ] - - def fstring_rules(ttype): - return [ - # Assuming that a '}' is the closing brace after format specifier. - # Sadly, this means that we won't detect syntax error. But it's - # more important to parse correct syntax correctly, than to - # highlight invalid syntax. - (r'\}', String.Interpol), - (r'\{', String.Interpol, 'expr-inside-fstring'), - # backslashes, quotes and formatting signs must be parsed one at a time - (r'[^\\\'"{}\n]+', ttype), - (r'[\'"\\]', ttype), - # newlines are an error (use "nl" state) - ] - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")', - bygroups(Whitespace, String.Affix, String.Doc)), - (r"^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')", - bygroups(Whitespace, String.Affix, String.Doc)), - (r'\A#!.+$', Comment.Hashbang), - (r'#.*$', Comment.Single), - (r'\\\n', Text), - (r'\\', Text), - include('keywords'), - include('soft-keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), - 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), - 'import'), - include('expr'), - ], - 'expr': [ - # raw f-strings and t-strings - ('(?i)(r[ft]|[ft]r)(""")', - bygroups(String.Affix, String.Double), - combined('rfstringescape', 'tdqf')), - ("(?i)(r[ft]|[ft]r)(''')", - bygroups(String.Affix, String.Single), - combined('rfstringescape', 'tsqf')), - ('(?i)(r[ft]|[ft]r)(")', - bygroups(String.Affix, String.Double), - combined('rfstringescape', 'dqf')), - ("(?i)(r[ft]|[ft]r)(')", - bygroups(String.Affix, String.Single), - combined('rfstringescape', 'sqf')), - # non-raw f-strings and t-strings - ('([fFtT])(""")', bygroups(String.Affix, String.Double), - combined('fstringescape', 'tdqf')), - ("([fFtT])(''')", bygroups(String.Affix, String.Single), - combined('fstringescape', 'tsqf')), - ('([fFtT])(")', bygroups(String.Affix, String.Double), - combined('fstringescape', 'dqf')), - ("([fFtT])(')", bygroups(String.Affix, String.Single), - combined('fstringescape', 'sqf')), - # raw bytes and strings - ('(?i)(rb|br|r)(""")', - bygroups(String.Affix, String.Double), 'tdqs'), - ("(?i)(rb|br|r)(''')", - bygroups(String.Affix, String.Single), 'tsqs'), - ('(?i)(rb|br|r)(")', - bygroups(String.Affix, String.Double), 'dqs'), - ("(?i)(rb|br|r)(')", - bygroups(String.Affix, String.Single), 'sqs'), - # non-raw strings - ('([uU]?)(""")', bygroups(String.Affix, String.Double), - combined('stringescape', 'tdqs')), - ("([uU]?)(''')", bygroups(String.Affix, String.Single), - combined('stringescape', 'tsqs')), - ('([uU]?)(")', bygroups(String.Affix, String.Double), - combined('stringescape', 'dqs')), - ("([uU]?)(')", bygroups(String.Affix, String.Single), - combined('stringescape', 'sqs')), - # non-raw bytes - ('([bB])(""")', bygroups(String.Affix, String.Double), - combined('bytesescape', 'tdqs')), - ("([bB])(''')", bygroups(String.Affix, String.Single), - combined('bytesescape', 'tsqs')), - ('([bB])(")', bygroups(String.Affix, String.Double), - combined('bytesescape', 'dqs')), - ("([bB])(')", bygroups(String.Affix, String.Single), - combined('bytesescape', 'sqs')), - - (r'[^\S\n]+', Text), - include('numbers'), - (r'!=|==|<<|>>|:=|[-~+/*%=<>&^|.]', Operator), - (r'[]{}:(),;[]', Punctuation), - (r'(in|is|and|or|not)\b', Operator.Word), - include('expr-keywords'), - include('builtins'), - include('magicfuncs'), - include('magicvars'), - include('name'), - ], - 'expr-inside-fstring': [ - (r'[{([]', Punctuation, 'expr-inside-fstring-inner'), - # without format specifier - (r'(=\s*)?' # debug (https://bugs.python.org/issue36817) - r'(\![sraf])?' # conversion - r'\}', String.Interpol, '#pop'), - # with format specifier - # we'll catch the remaining '}' in the outer scope - (r'(=\s*)?' # debug (https://bugs.python.org/issue36817) - r'(\![sraf])?' # conversion - r':', String.Interpol, '#pop'), - (r'\s+', Whitespace), # allow new lines - include('expr'), - ], - 'expr-inside-fstring-inner': [ - (r'[{([]', Punctuation, 'expr-inside-fstring-inner'), - (r'[])}]', Punctuation, '#pop'), - (r'\s+', Whitespace), # allow new lines - include('expr'), - ], - 'expr-keywords': [ - # Based on https://docs.python.org/3/reference/expressions.html - (words(( - 'async for', 'await', 'else', 'for', 'if', 'lambda', - 'yield', 'yield from'), suffix=r'\b'), - Keyword), - (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant), - ], - 'keywords': [ - (words(( - 'assert', 'async', 'await', 'break', 'continue', 'del', 'elif', - 'else', 'except', 'finally', 'for', 'global', 'if', 'lambda', - 'pass', 'raise', 'nonlocal', 'return', 'try', 'while', 'yield', - 'yield from', 'as', 'with'), suffix=r'\b'), - Keyword), - (words(('True', 'False', 'None'), suffix=r'\b'), Keyword.Constant), - ], - 'soft-keywords': [ - # `match`, `case` and `_` soft keywords - (r'(^[ \t]*)' # at beginning of line + possible indentation - r'(match|case)\b' # a possible keyword - r'(?![ \t]*(?:' # not followed by... - r'[:,;=^&|@~)\]}]|(?:' + # characters and keywords that mean this isn't - # pattern matching (but None/True/False is ok) - r'|'.join(k for k in keyword.kwlist if k[0].islower()) + r')\b))', - bygroups(Text, Keyword), 'soft-keywords-inner'), - ], - 'soft-keywords-inner': [ - # optional `_` keyword - (r'(\s+)([^\n_]*)(_\b)', bygroups(Whitespace, using(this), Keyword)), - default('#pop') - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'aiter', 'all', 'any', 'bin', 'bool', 'bytearray', - 'breakpoint', 'bytes', 'callable', 'chr', 'classmethod', 'compile', - 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', - 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', - 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'isinstance', - 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max', - 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', - 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', - 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', - 'tuple', 'type', 'vars', 'zip'), prefix=r'(?>|[-~+/*%=<>&^|.]', Operator), - include('keywords'), - (r'(def)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'funcname'), - (r'(class)((?:\s|\\\s)+)', bygroups(Keyword, Whitespace), 'classname'), - (r'(from)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), - 'fromimport'), - (r'(import)((?:\s|\\\s)+)', bygroups(Keyword.Namespace, Whitespace), - 'import'), - include('builtins'), - include('magicfuncs'), - include('magicvars'), - include('backtick'), - ('([rR]|[uUbB][rR]|[rR][uUbB])(""")', - bygroups(String.Affix, String.Double), 'tdqs'), - ("([rR]|[uUbB][rR]|[rR][uUbB])(''')", - bygroups(String.Affix, String.Single), 'tsqs'), - ('([rR]|[uUbB][rR]|[rR][uUbB])(")', - bygroups(String.Affix, String.Double), 'dqs'), - ("([rR]|[uUbB][rR]|[rR][uUbB])(')", - bygroups(String.Affix, String.Single), 'sqs'), - ('([uUbB]?)(""")', bygroups(String.Affix, String.Double), - combined('stringescape', 'tdqs')), - ("([uUbB]?)(''')", bygroups(String.Affix, String.Single), - combined('stringescape', 'tsqs')), - ('([uUbB]?)(")', bygroups(String.Affix, String.Double), - combined('stringescape', 'dqs')), - ("([uUbB]?)(')", bygroups(String.Affix, String.Single), - combined('stringescape', 'sqs')), - include('name'), - include('numbers'), - ], - 'keywords': [ - (words(( - 'assert', 'break', 'continue', 'del', 'elif', 'else', 'except', - 'exec', 'finally', 'for', 'global', 'if', 'lambda', 'pass', - 'print', 'raise', 'return', 'try', 'while', 'yield', - 'yield from', 'as', 'with'), suffix=r'\b'), - Keyword), - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', - 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', - 'cmp', 'coerce', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', - 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', - 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'hex', 'id', - 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', - 'list', 'locals', 'long', 'map', 'max', 'min', 'next', 'object', - 'oct', 'open', 'ord', 'pow', 'property', 'range', 'raw_input', 'reduce', - 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', - 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', - 'unichr', 'unicode', 'vars', 'xrange', 'zip'), - prefix=r'(?>> )(.*\n)', bygroups(Generic.Prompt, Other.Code), 'continuations'), - # This happens, e.g., when tracebacks are embedded in documentation; - # trailing whitespaces are often stripped in such contexts. - (r'(>>>)(\n)', bygroups(Generic.Prompt, Whitespace)), - (r'(\^C)?Traceback \(most recent call last\):\n', Other.Traceback, 'traceback'), - # SyntaxError starts with this - (r' File "[^"]+", line \d+', Other.Traceback, 'traceback'), - (r'.*\n', Generic.Output), - ], - 'continuations': [ - (r'(\.\.\. )(.*\n)', bygroups(Generic.Prompt, Other.Code)), - # See above. - (r'(\.\.\.)(\n)', bygroups(Generic.Prompt, Whitespace)), - default('#pop'), - ], - 'traceback': [ - # As soon as we see a traceback, consume everything until the next - # >>> prompt. - (r'(?=>>>( |$))', Text, '#pop'), - (r'(KeyboardInterrupt)(\n)', bygroups(Name.Class, Whitespace)), - (r'.*\n', Other.Traceback), - ], - } - - -class PythonConsoleLexer(DelegatingLexer): - """ - For Python console output or doctests, such as: - - .. sourcecode:: pycon - - >>> a = 'foo' - >>> print(a) - foo - >>> 1 / 0 - Traceback (most recent call last): - File "", line 1, in - ZeroDivisionError: integer division or modulo by zero - - Additional options: - - `python3` - Use Python 3 lexer for code. Default is ``True``. - - .. versionadded:: 1.0 - .. versionchanged:: 2.5 - Now defaults to ``True``. - """ - - name = 'Python console session' - aliases = ['pycon', 'python-console'] - mimetypes = ['text/x-python-doctest'] - url = 'https://python.org' - version_added = '' - - def __init__(self, **options): - python3 = get_bool_opt(options, 'python3', True) - if python3: - pylexer = PythonLexer - tblexer = PythonTracebackLexer - else: - pylexer = Python2Lexer - tblexer = Python2TracebackLexer - # We have two auxiliary lexers. Use DelegatingLexer twice with - # different tokens. TODO: DelegatingLexer should support this - # directly, by accepting a tuplet of auxiliary lexers and a tuple of - # distinguishing tokens. Then we wouldn't need this intermediary - # class. - class _ReplaceInnerCode(DelegatingLexer): - def __init__(self, **options): - super().__init__(pylexer, _PythonConsoleLexerBase, Other.Code, **options) - super().__init__(tblexer, _ReplaceInnerCode, Other.Traceback, **options) - - -class PythonTracebackLexer(RegexLexer): - """ - For Python 3.x tracebacks, with support for chained exceptions. - - .. versionchanged:: 2.5 - This is now the default ``PythonTracebackLexer``. It is still available - as the alias ``Python3TracebackLexer``. - """ - - name = 'Python Traceback' - aliases = ['pytb', 'py3tb'] - filenames = ['*.pytb', '*.py3tb'] - mimetypes = ['text/x-python-traceback', 'text/x-python3-traceback'] - url = 'https://python.org' - version_added = '1.0' - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\^C)?Traceback \(most recent call last\):\n', Generic.Traceback, 'intb'), - (r'^During handling of the above exception, another ' - r'exception occurred:\n\n', Generic.Traceback), - (r'^The above exception was the direct cause of the ' - r'following exception:\n\n', Generic.Traceback), - (r'^(?= File "[^"]+", line \d+)', Generic.Traceback, 'intb'), - (r'^.*\n', Other), - ], - 'intb': [ - (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), - (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Whitespace)), - (r'^( )(.+)(\n)', - bygroups(Whitespace, using(PythonLexer), Whitespace), 'markers'), - (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Whitespace, Comment, Whitespace)), # for doctests... - (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), - (r'^([a-zA-Z_][\w.]*)(:?\n)', - bygroups(Generic.Error, Whitespace), '#pop'), - default('#pop'), - ], - 'markers': [ - # Either `PEP 657 ` - # error locations in Python 3.11+, or single-caret markers - # for syntax errors before that. - (r'^( {4,})([~^]+)(\n)', - bygroups(Whitespace, Punctuation.Marker, Whitespace), - '#pop'), - default('#pop'), - ], - } - - -Python3TracebackLexer = PythonTracebackLexer - - -class Python2TracebackLexer(RegexLexer): - """ - For Python tracebacks. - - .. versionchanged:: 2.5 - This class has been renamed from ``PythonTracebackLexer``. - ``PythonTracebackLexer`` now refers to the Python 3 variant. - """ - - name = 'Python 2.x Traceback' - aliases = ['py2tb'] - filenames = ['*.py2tb'] - mimetypes = ['text/x-python2-traceback'] - url = 'https://python.org' - version_added = '0.7' - - tokens = { - 'root': [ - # Cover both (most recent call last) and (innermost last) - # The optional ^C allows us to catch keyboard interrupt signals. - (r'^(\^C)?(Traceback.*\n)', - bygroups(Text, Generic.Traceback), 'intb'), - # SyntaxError starts with this. - (r'^(?= File "[^"]+", line \d+)', Generic.Traceback, 'intb'), - (r'^.*\n', Other), - ], - 'intb': [ - (r'^( File )("[^"]+")(, line )(\d+)(, in )(.+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Text, Name, Whitespace)), - (r'^( File )("[^"]+")(, line )(\d+)(\n)', - bygroups(Text, Name.Builtin, Text, Number, Whitespace)), - (r'^( )(.+)(\n)', - bygroups(Text, using(Python2Lexer), Whitespace), 'marker'), - (r'^([ \t]*)(\.\.\.)(\n)', - bygroups(Text, Comment, Whitespace)), # for doctests... - (r'^([^:]+)(: )(.+)(\n)', - bygroups(Generic.Error, Text, Name, Whitespace), '#pop'), - (r'^([a-zA-Z_]\w*)(:?\n)', - bygroups(Generic.Error, Whitespace), '#pop') - ], - 'marker': [ - # For syntax errors. - (r'( {4,})(\^)', bygroups(Text, Punctuation.Marker), '#pop'), - default('#pop'), - ], - } - - -class CythonLexer(RegexLexer): - """ - For Pyrex and Cython source code. - """ - - name = 'Cython' - url = 'https://cython.org' - aliases = ['cython', 'pyx', 'pyrex'] - filenames = ['*.pyx', '*.pxd', '*.pxi'] - mimetypes = ['text/x-cython', 'application/x-cython'] - version_added = '1.1' - - tokens = { - 'root': [ - (r'\n', Whitespace), - (r'^(\s*)("""(?:.|\n)*?""")', bygroups(Whitespace, String.Doc)), - (r"^(\s*)('''(?:.|\n)*?''')", bygroups(Whitespace, String.Doc)), - (r'[^\S\n]+', Text), - (r'#.*$', Comment), - (r'[]{}:(),;[]', Punctuation), - (r'\\\n', Whitespace), - (r'\\', Text), - (r'(in|is|and|or|not)\b', Operator.Word), - (r'(<)([a-zA-Z0-9.?]+)(>)', - bygroups(Punctuation, Keyword.Type, Punctuation)), - (r'!=|==|<<|>>|[-~+/*%=<>&^|.?]', Operator), - (r'(from)(\d+)(<=)(\s+)(<)(\d+)(:)', - bygroups(Keyword, Number.Integer, Operator, Whitespace, Operator, - Name, Punctuation)), - include('keywords'), - (r'(def|property)(\s+)', bygroups(Keyword, Whitespace), 'funcname'), - (r'(cp?def)(\s+)', bygroups(Keyword, Whitespace), 'cdef'), - # (should actually start a block with only cdefs) - (r'(cdef)(:)', bygroups(Keyword, Punctuation)), - (r'(class|cppclass|struct)(\s+)', bygroups(Keyword, Whitespace), 'classname'), - (r'(from)(\s+)', bygroups(Keyword, Whitespace), 'fromimport'), - (r'(c?import)(\s+)', bygroups(Keyword, Whitespace), 'import'), - include('builtins'), - include('backtick'), - ('(?:[rR]|[uU][rR]|[rR][uU])"""', String, 'tdqs'), - ("(?:[rR]|[uU][rR]|[rR][uU])'''", String, 'tsqs'), - ('(?:[rR]|[uU][rR]|[rR][uU])"', String, 'dqs'), - ("(?:[rR]|[uU][rR]|[rR][uU])'", String, 'sqs'), - ('[uU]?"""', String, combined('stringescape', 'tdqs')), - ("[uU]?'''", String, combined('stringescape', 'tsqs')), - ('[uU]?"', String, combined('stringescape', 'dqs')), - ("[uU]?'", String, combined('stringescape', 'sqs')), - include('name'), - include('numbers'), - ], - 'keywords': [ - (words(( - 'assert', 'async', 'await', 'break', 'by', 'continue', 'ctypedef', 'del', - 'elif', 'else', 'except', 'except?', 'exec', 'finally', 'for', 'fused', 'gil', - 'global', 'if', 'include', 'lambda', 'namespace', 'new', 'noexcept','nogil', - 'pass', 'print', 'raise', 'return', 'try', 'while', 'yield', 'as', 'with'), - suffix=r'\b'), - Keyword), - (words(('True', 'False', 'None', 'NULL'), suffix=r'\b'), Keyword.Constant), - (r'(DEF|IF|ELIF|ELSE)\b', Comment.Preproc), - ], - 'builtins': [ - (words(( - '__import__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bint', - 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'char', 'chr', - 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'delattr', - 'dict', 'dir', 'divmod', 'double', 'enumerate', 'eval', 'execfile', 'exit', - 'file', 'filter', 'float', 'frozenset', 'getattr', 'globals', - 'hasattr', 'hash', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', - 'issubclass', 'iter', 'len', 'list', 'locals', 'long', 'map', 'max', - 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'property', - 'Py_ssize_t', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', - 'round', 'set', 'setattr', 'size_t', 'slice', 'sorted', 'staticmethod', - 'ssize_t', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', - 'unsigned', 'vars', 'xrange', 'zip'), prefix=r'(?]? \d* )? : - .* (?: ft | filetype | syn | syntax ) = ( [^:\s]+ ) -''', re.VERBOSE) - - -def get_filetype_from_line(l): # noqa: E741 - m = modeline_re.search(l) - if m: - return m.group(1) - - -def get_filetype_from_buffer(buf, max_lines=5): - """ - Scan the buffer for modelines and return filetype if one is found. - """ - lines = buf.splitlines() - for line in lines[-1:-max_lines-1:-1]: - ret = get_filetype_from_line(line) - if ret: - return ret - for i in range(max_lines, -1, -1): - if i < len(lines): - ret = get_filetype_from_line(lines[i]) - if ret: - return ret - - return None diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py deleted file mode 100755 index 0d6377f..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/plugin.py +++ /dev/null @@ -1,74 +0,0 @@ -""" - pygments.plugin - ~~~~~~~~~~~~~~~ - - Pygments plugin interface. - - lexer plugins:: - - [pygments.lexers] - yourlexer = yourmodule:YourLexer - - formatter plugins:: - - [pygments.formatters] - yourformatter = yourformatter:YourFormatter - /.ext = yourformatter:YourFormatter - - As you can see, you can define extensions for the formatter - with a leading slash. - - syntax plugins:: - - [pygments.styles] - yourstyle = yourstyle:YourStyle - - filter plugin:: - - [pygments.filter] - yourfilter = yourfilter:YourFilter - - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -import functools -from importlib.metadata import entry_points - -LEXER_ENTRY_POINT = 'pygments.lexers' -FORMATTER_ENTRY_POINT = 'pygments.formatters' -STYLE_ENTRY_POINT = 'pygments.styles' -FILTER_ENTRY_POINT = 'pygments.filters' - - -@functools.cache -def iter_entry_points(group_name): - groups = entry_points() - if hasattr(groups, 'select'): - # New interface in Python 3.10 and newer versions of the - # importlib_metadata backport. - return groups.select(group=group_name) - else: - # Older interface, deprecated in Python 3.10 and recent - # importlib_metadata, but we need it in Python 3.8 and 3.9. - return groups.get(group_name, []) - - -def find_plugin_lexers(): - for entrypoint in iter_entry_points(LEXER_ENTRY_POINT): - yield entrypoint.load() - - -def find_plugin_formatters(): - for entrypoint in iter_entry_points(FORMATTER_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() - - -def find_plugin_styles(): - for entrypoint in iter_entry_points(STYLE_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() - - -def find_plugin_filters(): - for entrypoint in iter_entry_points(FILTER_ENTRY_POINT): - yield entrypoint.name, entrypoint.load() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py deleted file mode 100755 index 9010eb3..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/regexopt.py +++ /dev/null @@ -1,102 +0,0 @@ -""" - pygments.regexopt - ~~~~~~~~~~~~~~~~~ - - An algorithm that generates optimized regexes for matching long lists of - literal strings. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -from re import escape -from itertools import groupby -from operator import itemgetter - -CS_ESCAPE = re.compile(r'[\[\^\\\-\]]') -FIRST_ELEMENT = itemgetter(0) - - -def commonprefix(m): - """Given an iterable of strings, returns the longest common leading substring""" - if not m: - return "" - s1 = min(m) - s2 = max(m) - for i, c in enumerate(s1): - if c != s2[i]: - return s1[:i] - return s1 - - -def make_charset(letters): - return '[' + CS_ESCAPE.sub(lambda m: '\\' + m.group(), ''.join(letters)) + ']' - - -def regex_opt_inner(strings, open_paren): - """Return a regex that matches any string in the sorted list of strings.""" - close_paren = open_paren and ')' or '' - # print strings, repr(open_paren) - if not strings: - # print '-> nothing left' - return '' - first = strings[0] - if len(strings) == 1: - # print '-> only 1 string' - return open_paren + escape(first) + close_paren - if not first: - # print '-> first string empty' - return open_paren + regex_opt_inner(strings[1:], '(?:') \ - + '?' + close_paren - if len(first) == 1: - # multiple one-char strings? make a charset - oneletter = [] - rest = [] - for s in strings: - if len(s) == 1: - oneletter.append(s) - else: - rest.append(s) - if len(oneletter) > 1: # do we have more than one oneletter string? - if rest: - # print '-> 1-character + rest' - return open_paren + regex_opt_inner(rest, '') + '|' \ - + make_charset(oneletter) + close_paren - # print '-> only 1-character' - return open_paren + make_charset(oneletter) + close_paren - prefix = commonprefix(strings) - if prefix: - plen = len(prefix) - # we have a prefix for all strings - # print '-> prefix:', prefix - return open_paren + escape(prefix) \ - + regex_opt_inner([s[plen:] for s in strings], '(?:') \ - + close_paren - # is there a suffix? - strings_rev = [s[::-1] for s in strings] - suffix = commonprefix(strings_rev) - if suffix: - slen = len(suffix) - # print '-> suffix:', suffix[::-1] - return open_paren \ - + regex_opt_inner(sorted(s[:-slen] for s in strings), '(?:') \ - + escape(suffix[::-1]) + close_paren - # recurse on common 1-string prefixes - # print '-> last resort' - return open_paren + \ - '|'.join(regex_opt_inner(list(group[1]), '') - for group in groupby(strings, lambda s: s[0] == first[0])) \ - + close_paren - - -def regex_opt(strings, prefix='', suffix=''): - """Return a compiled regex that matches any string in the given list. - - The strings to match must be literal strings, not regexes. They will be - regex-escaped. - - *prefix* and *suffix* are pre- and appended to the final regex. - """ - strings = sorted(strings) - return prefix + regex_opt_inner(strings, '(') + suffix diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py deleted file mode 100755 index 067ebfa..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/scanner.py +++ /dev/null @@ -1,104 +0,0 @@ -""" - pygments.scanner - ~~~~~~~~~~~~~~~~ - - This library implements a regex based scanner. Some languages - like Pascal are easy to parse but have some keywords that - depend on the context. Because of this it's impossible to lex - that just by using a regular expression lexer like the - `RegexLexer`. - - Have a look at the `DelphiLexer` to get an idea of how to use - this scanner. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" -import re - - -class EndOfText(RuntimeError): - """ - Raise if end of text is reached and the user - tried to call a match function. - """ - - -class Scanner: - """ - Simple scanner - - All method patterns are regular expression strings (not - compiled expressions!) - """ - - def __init__(self, text, flags=0): - """ - :param text: The text which should be scanned - :param flags: default regular expression flags - """ - self.data = text - self.data_length = len(text) - self.start_pos = 0 - self.pos = 0 - self.flags = flags - self.last = None - self.match = None - self._re_cache = {} - - def eos(self): - """`True` if the scanner reached the end of text.""" - return self.pos >= self.data_length - eos = property(eos, eos.__doc__) - - def check(self, pattern): - """ - Apply `pattern` on the current position and return - the match object. (Doesn't touch pos). Use this for - lookahead. - """ - if self.eos: - raise EndOfText() - if pattern not in self._re_cache: - self._re_cache[pattern] = re.compile(pattern, self.flags) - return self._re_cache[pattern].match(self.data, self.pos) - - def test(self, pattern): - """Apply a pattern on the current position and check - if it patches. Doesn't touch pos. - """ - return self.check(pattern) is not None - - def scan(self, pattern): - """ - Scan the text for the given pattern and update pos/match - and related fields. The return value is a boolean that - indicates if the pattern matched. The matched value is - stored on the instance as ``match``, the last value is - stored as ``last``. ``start_pos`` is the position of the - pointer before the pattern was matched, ``pos`` is the - end position. - """ - if self.eos: - raise EndOfText() - if pattern not in self._re_cache: - self._re_cache[pattern] = re.compile(pattern, self.flags) - self.last = self.match - m = self._re_cache[pattern].match(self.data, self.pos) - if m is None: - return False - self.start_pos = m.start() - self.pos = m.end() - self.match = m.group() - return True - - def get_char(self): - """Scan exactly one char.""" - self.scan('.') - - def __repr__(self): - return '<%s %d/%d>' % ( - self.__class__.__name__, - self.pos, - self.data_length - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py deleted file mode 100755 index 7f2fa74..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/sphinxext.py +++ /dev/null @@ -1,247 +0,0 @@ -""" - pygments.sphinxext - ~~~~~~~~~~~~~~~~~~ - - Sphinx extension to generate automatic documentation of lexers, - formatters and filters. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import sys - -from docutils import nodes -from docutils.statemachine import ViewList -from docutils.parsers.rst import Directive -from sphinx.util.nodes import nested_parse_with_titles - - -MODULEDOC = ''' -.. module:: %s - -%s -%s -''' - -LEXERDOC = ''' -.. class:: %s - - :Short names: %s - :Filenames: %s - :MIME types: %s - - %s - - %s - -''' - -FMTERDOC = ''' -.. class:: %s - - :Short names: %s - :Filenames: %s - - %s - -''' - -FILTERDOC = ''' -.. class:: %s - - :Name: %s - - %s - -''' - - -class PygmentsDoc(Directive): - """ - A directive to collect all lexers/formatters/filters and generate - autoclass directives for them. - """ - has_content = False - required_arguments = 1 - optional_arguments = 0 - final_argument_whitespace = False - option_spec = {} - - def run(self): - self.filenames = set() - if self.arguments[0] == 'lexers': - out = self.document_lexers() - elif self.arguments[0] == 'formatters': - out = self.document_formatters() - elif self.arguments[0] == 'filters': - out = self.document_filters() - elif self.arguments[0] == 'lexers_overview': - out = self.document_lexers_overview() - else: - raise Exception('invalid argument for "pygmentsdoc" directive') - node = nodes.compound() - vl = ViewList(out.split('\n'), source='') - nested_parse_with_titles(self.state, vl, node) - for fn in self.filenames: - self.state.document.settings.record_dependencies.add(fn) - return node.children - - def document_lexers_overview(self): - """Generate a tabular overview of all lexers. - - The columns are the lexer name, the extensions handled by this lexer - (or "None"), the aliases and a link to the lexer class.""" - from pip._vendor.pygments.lexers._mapping import LEXERS - from pip._vendor.pygments.lexers import find_lexer_class - out = [] - - table = [] - - def format_link(name, url): - if url: - return f'`{name} <{url}>`_' - return name - - for classname, data in sorted(LEXERS.items(), key=lambda x: x[1][1].lower()): - lexer_cls = find_lexer_class(data[1]) - extensions = lexer_cls.filenames + lexer_cls.alias_filenames - - table.append({ - 'name': format_link(data[1], lexer_cls.url), - 'extensions': ', '.join(extensions).replace('*', '\\*').replace('_', '\\') or 'None', - 'aliases': ', '.join(data[2]), - 'class': f'{data[0]}.{classname}' - }) - - column_names = ['name', 'extensions', 'aliases', 'class'] - column_lengths = [max([len(row[column]) for row in table if row[column]]) - for column in column_names] - - def write_row(*columns): - """Format a table row""" - out = [] - for length, col in zip(column_lengths, columns): - if col: - out.append(col.ljust(length)) - else: - out.append(' '*length) - - return ' '.join(out) - - def write_seperator(): - """Write a table separator row""" - sep = ['='*c for c in column_lengths] - return write_row(*sep) - - out.append(write_seperator()) - out.append(write_row('Name', 'Extension(s)', 'Short name(s)', 'Lexer class')) - out.append(write_seperator()) - for row in table: - out.append(write_row( - row['name'], - row['extensions'], - row['aliases'], - f':class:`~{row["class"]}`')) - out.append(write_seperator()) - - return '\n'.join(out) - - def document_lexers(self): - from pip._vendor.pygments.lexers._mapping import LEXERS - from pip._vendor import pygments - import inspect - import pathlib - - out = [] - modules = {} - moduledocstrings = {} - for classname, data in sorted(LEXERS.items(), key=lambda x: x[0]): - module = data[0] - mod = __import__(module, None, None, [classname]) - self.filenames.add(mod.__file__) - cls = getattr(mod, classname) - if not cls.__doc__: - print(f"Warning: {classname} does not have a docstring.") - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - - example_file = getattr(cls, '_example', None) - if example_file: - p = pathlib.Path(inspect.getabsfile(pygments)).parent.parent /\ - 'tests' / 'examplefiles' / example_file - content = p.read_text(encoding='utf-8') - if not content: - raise Exception( - f"Empty example file '{example_file}' for lexer " - f"{classname}") - - if data[2]: - lexer_name = data[2][0] - docstring += '\n\n .. admonition:: Example\n' - docstring += f'\n .. code-block:: {lexer_name}\n\n' - for line in content.splitlines(): - docstring += f' {line}\n' - - if cls.version_added: - version_line = f'.. versionadded:: {cls.version_added}' - else: - version_line = '' - - modules.setdefault(module, []).append(( - classname, - ', '.join(data[2]) or 'None', - ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None', - ', '.join(data[4]) or 'None', - docstring, - version_line)) - if module not in moduledocstrings: - moddoc = mod.__doc__ - if isinstance(moddoc, bytes): - moddoc = moddoc.decode('utf8') - moduledocstrings[module] = moddoc - - for module, lexers in sorted(modules.items(), key=lambda x: x[0]): - if moduledocstrings[module] is None: - raise Exception(f"Missing docstring for {module}") - heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.') - out.append(MODULEDOC % (module, heading, '-'*len(heading))) - for data in lexers: - out.append(LEXERDOC % data) - - return ''.join(out) - - def document_formatters(self): - from pip._vendor.pygments.formatters import FORMATTERS - - out = [] - for classname, data in sorted(FORMATTERS.items(), key=lambda x: x[0]): - module = data[0] - mod = __import__(module, None, None, [classname]) - self.filenames.add(mod.__file__) - cls = getattr(mod, classname) - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - heading = cls.__name__ - out.append(FMTERDOC % (heading, ', '.join(data[2]) or 'None', - ', '.join(data[3]).replace('*', '\\*') or 'None', - docstring)) - return ''.join(out) - - def document_filters(self): - from pip._vendor.pygments.filters import FILTERS - - out = [] - for name, cls in FILTERS.items(): - self.filenames.add(sys.modules[cls.__module__].__file__) - docstring = cls.__doc__ - if isinstance(docstring, bytes): - docstring = docstring.decode('utf8') - out.append(FILTERDOC % (cls.__name__, name, docstring)) - return ''.join(out) - - -def setup(app): - app.add_directive('pygmentsdoc', PygmentsDoc) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py deleted file mode 100755 index 04b420d..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/style.py +++ /dev/null @@ -1,203 +0,0 @@ -""" - pygments.style - ~~~~~~~~~~~~~~ - - Basic style object. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.token import Token, STANDARD_TYPES - -# Default mapping of ansixxx to RGB colors. -_ansimap = { - # dark - 'ansiblack': '000000', - 'ansired': '7f0000', - 'ansigreen': '007f00', - 'ansiyellow': '7f7fe0', - 'ansiblue': '00007f', - 'ansimagenta': '7f007f', - 'ansicyan': '007f7f', - 'ansigray': 'e5e5e5', - # normal - 'ansibrightblack': '555555', - 'ansibrightred': 'ff0000', - 'ansibrightgreen': '00ff00', - 'ansibrightyellow': 'ffff00', - 'ansibrightblue': '0000ff', - 'ansibrightmagenta': 'ff00ff', - 'ansibrightcyan': '00ffff', - 'ansiwhite': 'ffffff', -} -# mapping of deprecated #ansixxx colors to new color names -_deprecated_ansicolors = { - # dark - '#ansiblack': 'ansiblack', - '#ansidarkred': 'ansired', - '#ansidarkgreen': 'ansigreen', - '#ansibrown': 'ansiyellow', - '#ansidarkblue': 'ansiblue', - '#ansipurple': 'ansimagenta', - '#ansiteal': 'ansicyan', - '#ansilightgray': 'ansigray', - # normal - '#ansidarkgray': 'ansibrightblack', - '#ansired': 'ansibrightred', - '#ansigreen': 'ansibrightgreen', - '#ansiyellow': 'ansibrightyellow', - '#ansiblue': 'ansibrightblue', - '#ansifuchsia': 'ansibrightmagenta', - '#ansiturquoise': 'ansibrightcyan', - '#ansiwhite': 'ansiwhite', -} -ansicolors = set(_ansimap) - - -class StyleMeta(type): - - def __new__(mcs, name, bases, dct): - obj = type.__new__(mcs, name, bases, dct) - for token in STANDARD_TYPES: - if token not in obj.styles: - obj.styles[token] = '' - - def colorformat(text): - if text in ansicolors: - return text - if text[0:1] == '#': - col = text[1:] - if len(col) == 6: - return col - elif len(col) == 3: - return col[0] * 2 + col[1] * 2 + col[2] * 2 - elif text == '': - return '' - elif text.startswith('var') or text.startswith('calc'): - return text - assert False, f"wrong color format {text!r}" - - _styles = obj._styles = {} - - for ttype in obj.styles: - for token in ttype.split(): - if token in _styles: - continue - ndef = _styles.get(token.parent, None) - styledefs = obj.styles.get(token, '').split() - if not ndef or token is None: - ndef = ['', 0, 0, 0, '', '', 0, 0, 0] - elif 'noinherit' in styledefs and token is not Token: - ndef = _styles[Token][:] - else: - ndef = ndef[:] - _styles[token] = ndef - for styledef in obj.styles.get(token, '').split(): - if styledef == 'noinherit': - pass - elif styledef == 'bold': - ndef[1] = 1 - elif styledef == 'nobold': - ndef[1] = 0 - elif styledef == 'italic': - ndef[2] = 1 - elif styledef == 'noitalic': - ndef[2] = 0 - elif styledef == 'underline': - ndef[3] = 1 - elif styledef == 'nounderline': - ndef[3] = 0 - elif styledef[:3] == 'bg:': - ndef[4] = colorformat(styledef[3:]) - elif styledef[:7] == 'border:': - ndef[5] = colorformat(styledef[7:]) - elif styledef == 'roman': - ndef[6] = 1 - elif styledef == 'sans': - ndef[7] = 1 - elif styledef == 'mono': - ndef[8] = 1 - else: - ndef[0] = colorformat(styledef) - - return obj - - def style_for_token(cls, token): - t = cls._styles[token] - ansicolor = bgansicolor = None - color = t[0] - if color in _deprecated_ansicolors: - color = _deprecated_ansicolors[color] - if color in ansicolors: - ansicolor = color - color = _ansimap[color] - bgcolor = t[4] - if bgcolor in _deprecated_ansicolors: - bgcolor = _deprecated_ansicolors[bgcolor] - if bgcolor in ansicolors: - bgansicolor = bgcolor - bgcolor = _ansimap[bgcolor] - - return { - 'color': color or None, - 'bold': bool(t[1]), - 'italic': bool(t[2]), - 'underline': bool(t[3]), - 'bgcolor': bgcolor or None, - 'border': t[5] or None, - 'roman': bool(t[6]) or None, - 'sans': bool(t[7]) or None, - 'mono': bool(t[8]) or None, - 'ansicolor': ansicolor, - 'bgansicolor': bgansicolor, - } - - def list_styles(cls): - return list(cls) - - def styles_token(cls, ttype): - return ttype in cls._styles - - def __iter__(cls): - for token in cls._styles: - yield token, cls.style_for_token(token) - - def __len__(cls): - return len(cls._styles) - - -class Style(metaclass=StyleMeta): - - #: overall background color (``None`` means transparent) - background_color = '#ffffff' - - #: highlight background color - highlight_color = '#ffffcc' - - #: line number font color - line_number_color = 'inherit' - - #: line number background color - line_number_background_color = 'transparent' - - #: special line number font color - line_number_special_color = '#000000' - - #: special line number background color - line_number_special_background_color = '#ffffc0' - - #: Style definitions for individual token types. - styles = {} - - #: user-friendly style name (used when selecting the style, so this - # should be all-lowercase, no spaces, hyphens) - name = 'unnamed' - - aliases = [] - - # Attribute for lexers defined within Pygments. If set - # to True, the style is not shown in the style gallery - # on the website. This is intended for language-specific - # styles. - web_style_gallery_exclude = False diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py deleted file mode 100755 index 29f2110..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -""" - pygments.styles - ~~~~~~~~~~~~~~~ - - Contains built-in styles. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -from pip._vendor.pygments.plugin import find_plugin_styles -from pip._vendor.pygments.util import ClassNotFound -from pip._vendor.pygments.styles._mapping import STYLES - -#: A dictionary of built-in styles, mapping style names to -#: ``'submodule::classname'`` strings. -#: This list is deprecated. Use `pygments.styles.STYLES` instead -STYLE_MAP = {v[1]: v[0].split('.')[-1] + '::' + k for k, v in STYLES.items()} - -#: Internal reverse mapping to make `get_style_by_name` more efficient -_STYLE_NAME_TO_MODULE_MAP = {v[1]: (v[0], k) for k, v in STYLES.items()} - - -def get_style_by_name(name): - """ - Return a style class by its short name. The names of the builtin styles - are listed in :data:`pygments.styles.STYLE_MAP`. - - Will raise :exc:`pygments.util.ClassNotFound` if no style of that name is - found. - """ - if name in _STYLE_NAME_TO_MODULE_MAP: - mod, cls = _STYLE_NAME_TO_MODULE_MAP[name] - builtin = "yes" - else: - for found_name, style in find_plugin_styles(): - if name == found_name: - return style - # perhaps it got dropped into our styles package - builtin = "" - mod = 'pygments.styles.' + name - cls = name.title() + "Style" - - try: - mod = __import__(mod, None, None, [cls]) - except ImportError: - raise ClassNotFound(f"Could not find style module {mod!r}" + - (builtin and ", though it should be builtin") - + ".") - try: - return getattr(mod, cls) - except AttributeError: - raise ClassNotFound(f"Could not find style class {cls!r} in style module.") - - -def get_all_styles(): - """Return a generator for all styles by name, both builtin and plugin.""" - for v in STYLES.values(): - yield v[1] - for name, _ in find_plugin_styles(): - yield name diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index cf690e20d57649112ac8d043f45f9206815f5d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3109 zcmb7G|8LvI6~7}zNtSKN4%4J=EaO}|bvz`L6DMt_1XkuNJB962W2oYuMJ>h{R00mWG?cH`L^(LhtEy}b~W{XcU?ha7kxErjGC z@J_iSfks2Qe}o87W-XOgblVavdrea;x9<<_6mmN!4c(Sh-6D%wRkKg2I`L)*-f%o= zWY$bIwQR@9WTQ&XjE%i~Dq|`Zs341L#9mg&>vfI9R;2VvVkrulcw>I%>h*-+DvE1r zQqe6XPA(>%VI{$rc_<@Y=YkINlmh> zIm7;qk=14B@F(Wqx-y+e;-+5_@q+zNRp=@Ih<4 z+22}`nR~GM{iX()J(wZ;av++=lz+&qpM@jf9#TmY)S;(Xc=$a~j)}*?R?f<3s{I-3 zFv6IFZ#j6?qGrNzJr!fiMp}ubB{ONnE*mLhJSJr_u~kK1jcMv)EVE`W8~V6#`gF`v zZRJ!(O5T!EiWSSKnV1M-vSEUdcjz(CT`^Hqb=4L{A+z>0bY51IcG5^^UNd_@=^^;6 z3&3upQrE0kK9_f;z24%r;ydf}8>cs}-95V*{~*4V{L6*A7q-t-_?LDLm-$n>xXhn! z&Up+=pf>Mw(BXRjWvJA>f8_u1ejYC|;KQTfL&l^@z$A1wC1CT0FVS)?~$1TE3drmAVglvGP0 zapk>a%Z#k8YC;<{-6ZM~(T%#Xt|gLZAyGXzUZM!*VWY#YDVBqBJwGdgi%f&s@RtVy>6E!9@+? zttpHKoj%d?z}&>_v^alNoV_~r#+7O65R*o_!`Z5>DNYDrCY=HQi=xwc$*oPBreT^i z^qfEnfZeuDCp-aMUCi2wJ38ujeDstY78E*cQnQ>u{h*wX>l)D=<~%H;DGE3VM9TD-i)RU`aH?(4{4DKc0++P~37e>E2Myjb%i{<&hH8YbIk z%i)nCTMZxj^U9xA?r7`U)|=(ifYUNOkg(aRm zc~T3q+&tco9NDn8Cd(00iI7r|fRer%!Z6axT|L+LhD!a{y;2S*D&a&an5eN-7M8Q9 z`@VdEpAgWO!tskd`_<9N#S!$?$iO7WCSj~e^!$h5drZ;cw+I7j+RghBp_OL69kBoh zy9$7>t#|J4&?d%cz1ybuMxA~#tD}Lmd0dwd$qd{RY;Lj%3n@icOv#3~1bt6Pkg8tj zP>i6VbdoF@_HrXBhy+>Wy)FdzvY8uYO=^PUUzN11V!1I6eH6aT0Xl%iwoAwf(-;Ij z_1B4c0)$?L&-y*E|G@7y`nH>2zi~%g7wJjxE-T_{II@A)u zjB88~`)Y`?!wCPXgyOBGipERrrHWoDwU=55bFaV8m|4ap53aGEn+a diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc deleted file mode 100755 index cfb28ca883d6e584886acb14b9d2ad73a4d218fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3668 zcmZ`*SyLNF5MF^+5;_p#5SQ_NVH;$?*!aZU!QqM_PT~iXk$RCftaepspctF`2$y*_javYdF5?Z@a(Qo}QlF{Ueh}D){r)FTefdrxoQN zM&wUU7@z+|<5xvjK!M1|2y{RvViZ)w7{n11(1nq;RfPOxP^Ed#u4wpUBr7Zfj9{T#QQLX zI1Mw14`3GYAv{8ygU5(Z;3?uWc#il2<`G}Q0^%YpeT;mHz%s1BDy+d*unw=_YuJEI z*n(}?fp6e7?Eaqp6nU$_-mWtKE$vz;lG?6&Y-r=1_5Rv%xvH72GwHA^&Llx6jWYaG zp~(fKY#B0kAQa2IR3&V%qgY#-2?YCFp41F|QL}G)G!e+q;>z@b4W4dVQaBhAazBj| zZg5#@!E?Q;DOLH9Dsa;n2}Z8TE*hkC_+3SJHL2@8t1G^z9mV$|wMEM|hzT+{lvbJDa9MJtN=l9tg&IR+UaAHI7vxuMT{FQrUbD%uQzAyIE?3W%{y;?T zmt`pJ4PWEaX5_Rol~BE;k|w0Zm8n(R)7@jK3+>K9;HEJ?3e8$&nb?O?6Y7I+AKK(6VL6Yfr_0=E)8~YKLoZk47TeeG#MLu0*kCSxx32ZF zWy>r>CtOD-jWQIgS~m}OEIDgER0-WYtXVFN@sVq~gG7p+QIxkCKD&)UJ}iQEwM;I~ zZ0N@Ej&*vVLYrn_Kn(+ELRwO39cg%YTg?+ziU3p!iz}0x#58r8Y^Y(Y%uCf^5VzVS zu4e1x{F7J}0W={ku1s%QrgcbKHw*1^mHTO27+jXx^z2&Y{D!OsZW`mG&}uSnb*iXPc?UWBBn(3)VJCPD~QCrQGGQ^JWS9v7V9B1XL7s zhd8c&enD%2o5uJUXz(Q(T53(R4X{cyE({qMS{JU|EL!hzT~39j+nJQ~on3@&yR;MG z+yI9-v=c!DoPl)O%Tjpsk$2;v+_F&1L`c4akiyb+ekmC{?UuAkpqsdcS zruU_Am+*~b;Vx;vb$#>;vtu~lu@sO0Upk?q>=LtVQ8gH35}^in@nuG%3}r~D&PRHc zb|T1t&?mx?LpzRSmFuBAK9nrbs2U7%j!>i2HM8j1CXEY&2WDw{hj&oW%CzS-Zle-VYlqyTNilW49?M`-O^C z)e2Q&m#o4ot8C2_NUc^l(#)fRp%)9aW4B_NGm}$O1qVOeCTjQzN6MO0sOh!BK8As1 zV-WwCEjYo)Y+=8ObLeJyvUYrucviK*Gqe}>k9fZb{yX^&Me#c$k%*s|PIfe-*+y>G z??m(OXiuYe&R5a&V~X0}7+CP*j3gAbuhIX)?_wmWsJ)H8r+$i&w4&x4gOB_SBi$k_ z%Sew1%Q4a`X6s|5UxW=Xk{4uIF3C?gld1Y?X`6jNVfb2-UW#pMi=Q$%Uf(hpRc}8AF zf`x4O3lT;ak>V=0{iT2|BMr7-C7{7NS0l>6d~;}{*)z@lMmC$H+s(nXW`4CfxZdoY bYvyLz_2I|N#;q)!N}2xW82h!~VSoGw_=@Ig diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/_mapping.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/_mapping.py deleted file mode 100755 index 49a7fae..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/styles/_mapping.py +++ /dev/null @@ -1,54 +0,0 @@ -# Automatically generated by scripts/gen_mapfiles.py. -# DO NOT EDIT BY HAND; run `tox -e mapfiles` instead. - -STYLES = { - 'AbapStyle': ('pygments.styles.abap', 'abap', ()), - 'AlgolStyle': ('pygments.styles.algol', 'algol', ()), - 'Algol_NuStyle': ('pygments.styles.algol_nu', 'algol_nu', ()), - 'ArduinoStyle': ('pygments.styles.arduino', 'arduino', ()), - 'AutumnStyle': ('pygments.styles.autumn', 'autumn', ()), - 'BlackWhiteStyle': ('pygments.styles.bw', 'bw', ()), - 'BorlandStyle': ('pygments.styles.borland', 'borland', ()), - 'CoffeeStyle': ('pygments.styles.coffee', 'coffee', ()), - 'ColorfulStyle': ('pygments.styles.colorful', 'colorful', ()), - 'DefaultStyle': ('pygments.styles.default', 'default', ()), - 'DraculaStyle': ('pygments.styles.dracula', 'dracula', ()), - 'EmacsStyle': ('pygments.styles.emacs', 'emacs', ()), - 'FriendlyGrayscaleStyle': ('pygments.styles.friendly_grayscale', 'friendly_grayscale', ()), - 'FriendlyStyle': ('pygments.styles.friendly', 'friendly', ()), - 'FruityStyle': ('pygments.styles.fruity', 'fruity', ()), - 'GhDarkStyle': ('pygments.styles.gh_dark', 'github-dark', ()), - 'GruvboxDarkStyle': ('pygments.styles.gruvbox', 'gruvbox-dark', ()), - 'GruvboxLightStyle': ('pygments.styles.gruvbox', 'gruvbox-light', ()), - 'IgorStyle': ('pygments.styles.igor', 'igor', ()), - 'InkPotStyle': ('pygments.styles.inkpot', 'inkpot', ()), - 'LightbulbStyle': ('pygments.styles.lightbulb', 'lightbulb', ()), - 'LilyPondStyle': ('pygments.styles.lilypond', 'lilypond', ()), - 'LovelaceStyle': ('pygments.styles.lovelace', 'lovelace', ()), - 'ManniStyle': ('pygments.styles.manni', 'manni', ()), - 'MaterialStyle': ('pygments.styles.material', 'material', ()), - 'MonokaiStyle': ('pygments.styles.monokai', 'monokai', ()), - 'MurphyStyle': ('pygments.styles.murphy', 'murphy', ()), - 'NativeStyle': ('pygments.styles.native', 'native', ()), - 'NordDarkerStyle': ('pygments.styles.nord', 'nord-darker', ()), - 'NordStyle': ('pygments.styles.nord', 'nord', ()), - 'OneDarkStyle': ('pygments.styles.onedark', 'one-dark', ()), - 'ParaisoDarkStyle': ('pygments.styles.paraiso_dark', 'paraiso-dark', ()), - 'ParaisoLightStyle': ('pygments.styles.paraiso_light', 'paraiso-light', ()), - 'PastieStyle': ('pygments.styles.pastie', 'pastie', ()), - 'PerldocStyle': ('pygments.styles.perldoc', 'perldoc', ()), - 'RainbowDashStyle': ('pygments.styles.rainbow_dash', 'rainbow_dash', ()), - 'RrtStyle': ('pygments.styles.rrt', 'rrt', ()), - 'SasStyle': ('pygments.styles.sas', 'sas', ()), - 'SolarizedDarkStyle': ('pygments.styles.solarized', 'solarized-dark', ()), - 'SolarizedLightStyle': ('pygments.styles.solarized', 'solarized-light', ()), - 'StarofficeStyle': ('pygments.styles.staroffice', 'staroffice', ()), - 'StataDarkStyle': ('pygments.styles.stata_dark', 'stata-dark', ()), - 'StataLightStyle': ('pygments.styles.stata_light', 'stata-light', ()), - 'TangoStyle': ('pygments.styles.tango', 'tango', ()), - 'TracStyle': ('pygments.styles.trac', 'trac', ()), - 'VimStyle': ('pygments.styles.vim', 'vim', ()), - 'VisualStudioStyle': ('pygments.styles.vs', 'vs', ()), - 'XcodeStyle': ('pygments.styles.xcode', 'xcode', ()), - 'ZenburnStyle': ('pygments.styles.zenburn', 'zenburn', ()), -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py deleted file mode 100755 index 1f756b7..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/token.py +++ /dev/null @@ -1,214 +0,0 @@ -""" - pygments.token - ~~~~~~~~~~~~~~ - - Basic token types and the standard tokens. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - - -class _TokenType(tuple): - parent = None - - def split(self): - buf = [] - node = self - while node is not None: - buf.append(node) - node = node.parent - buf.reverse() - return buf - - def __init__(self, *args): - # no need to call super.__init__ - self.subtypes = set() - - def __contains__(self, val): - return self is val or ( - type(val) is self.__class__ and - val[:len(self)] == self - ) - - def __getattr__(self, val): - if not val or not val[0].isupper(): - return tuple.__getattribute__(self, val) - new = _TokenType(self + (val,)) - setattr(self, val, new) - self.subtypes.add(new) - new.parent = self - return new - - def __repr__(self): - return 'Token' + (self and '.' or '') + '.'.join(self) - - def __copy__(self): - # These instances are supposed to be singletons - return self - - def __deepcopy__(self, memo): - # These instances are supposed to be singletons - return self - - -Token = _TokenType() - -# Special token types -Text = Token.Text -Whitespace = Text.Whitespace -Escape = Token.Escape -Error = Token.Error -# Text that doesn't belong to this lexer (e.g. HTML in PHP) -Other = Token.Other - -# Common token types for source code -Keyword = Token.Keyword -Name = Token.Name -Literal = Token.Literal -String = Literal.String -Number = Literal.Number -Punctuation = Token.Punctuation -Operator = Token.Operator -Comment = Token.Comment - -# Generic types for non-source code -Generic = Token.Generic - -# String and some others are not direct children of Token. -# alias them: -Token.Token = Token -Token.String = String -Token.Number = Number - - -def is_token_subtype(ttype, other): - """ - Return True if ``ttype`` is a subtype of ``other``. - - exists for backwards compatibility. use ``ttype in other`` now. - """ - return ttype in other - - -def string_to_tokentype(s): - """ - Convert a string into a token type:: - - >>> string_to_token('String.Double') - Token.Literal.String.Double - >>> string_to_token('Token.Literal.Number') - Token.Literal.Number - >>> string_to_token('') - Token - - Tokens that are already tokens are returned unchanged: - - >>> string_to_token(String) - Token.Literal.String - """ - if isinstance(s, _TokenType): - return s - if not s: - return Token - node = Token - for item in s.split('.'): - node = getattr(node, item) - return node - - -# Map standard token types to short names, used in CSS class naming. -# If you add a new item, please be sure to run this file to perform -# a consistency check for duplicate values. -STANDARD_TYPES = { - Token: '', - - Text: '', - Whitespace: 'w', - Escape: 'esc', - Error: 'err', - Other: 'x', - - Keyword: 'k', - Keyword.Constant: 'kc', - Keyword.Declaration: 'kd', - Keyword.Namespace: 'kn', - Keyword.Pseudo: 'kp', - Keyword.Reserved: 'kr', - Keyword.Type: 'kt', - - Name: 'n', - Name.Attribute: 'na', - Name.Builtin: 'nb', - Name.Builtin.Pseudo: 'bp', - Name.Class: 'nc', - Name.Constant: 'no', - Name.Decorator: 'nd', - Name.Entity: 'ni', - Name.Exception: 'ne', - Name.Function: 'nf', - Name.Function.Magic: 'fm', - Name.Property: 'py', - Name.Label: 'nl', - Name.Namespace: 'nn', - Name.Other: 'nx', - Name.Tag: 'nt', - Name.Variable: 'nv', - Name.Variable.Class: 'vc', - Name.Variable.Global: 'vg', - Name.Variable.Instance: 'vi', - Name.Variable.Magic: 'vm', - - Literal: 'l', - Literal.Date: 'ld', - - String: 's', - String.Affix: 'sa', - String.Backtick: 'sb', - String.Char: 'sc', - String.Delimiter: 'dl', - String.Doc: 'sd', - String.Double: 's2', - String.Escape: 'se', - String.Heredoc: 'sh', - String.Interpol: 'si', - String.Other: 'sx', - String.Regex: 'sr', - String.Single: 's1', - String.Symbol: 'ss', - - Number: 'm', - Number.Bin: 'mb', - Number.Float: 'mf', - Number.Hex: 'mh', - Number.Integer: 'mi', - Number.Integer.Long: 'il', - Number.Oct: 'mo', - - Operator: 'o', - Operator.Word: 'ow', - - Punctuation: 'p', - Punctuation.Marker: 'pm', - - Comment: 'c', - Comment.Hashbang: 'ch', - Comment.Multiline: 'cm', - Comment.Preproc: 'cp', - Comment.PreprocFile: 'cpf', - Comment.Single: 'c1', - Comment.Special: 'cs', - - Generic: 'g', - Generic.Deleted: 'gd', - Generic.Emph: 'ge', - Generic.Error: 'gr', - Generic.Heading: 'gh', - Generic.Inserted: 'gi', - Generic.Output: 'go', - Generic.Prompt: 'gp', - Generic.Strong: 'gs', - Generic.Subheading: 'gu', - Generic.EmphStrong: 'ges', - Generic.Traceback: 'gt', -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py deleted file mode 100755 index 2a326df..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/unistring.py +++ /dev/null @@ -1,153 +0,0 @@ -""" - pygments.unistring - ~~~~~~~~~~~~~~~~~~ - - Strings of all Unicode characters of a certain category. - Used for matching in Unicode-aware languages. Run to regenerate. - - Inspired by chartypes_create.py from the MoinMoin project. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -Cc = '\x00-\x1f\x7f-\x9f' - -Cf = '\xad\u0600-\u0605\u061c\u06dd\u070f\u08e2\u180e\u200b-\u200f\u202a-\u202e\u2060-\u2064\u2066-\u206f\ufeff\ufff9-\ufffb\U000110bd\U000110cd\U0001bca0-\U0001bca3\U0001d173-\U0001d17a\U000e0001\U000e0020-\U000e007f' - -Cn = '\u0378-\u0379\u0380-\u0383\u038b\u038d\u03a2\u0530\u0557-\u0558\u058b-\u058c\u0590\u05c8-\u05cf\u05eb-\u05ee\u05f5-\u05ff\u061d\u070e\u074b-\u074c\u07b2-\u07bf\u07fb-\u07fc\u082e-\u082f\u083f\u085c-\u085d\u085f\u086b-\u089f\u08b5\u08be-\u08d2\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09c5-\u09c6\u09c9-\u09ca\u09cf-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09ff-\u0a00\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a50\u0a52-\u0a58\u0a5d\u0a5f-\u0a65\u0a77-\u0a80\u0a84\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0acf\u0ad1-\u0adf\u0ae4-\u0ae5\u0af2-\u0af8\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34\u0b3a-\u0b3b\u0b45-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b64-\u0b65\u0b78-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bcf\u0bd1-\u0bd6\u0bd8-\u0be5\u0bfb-\u0bff\u0c0d\u0c11\u0c29\u0c3a-\u0c3c\u0c45\u0c49\u0c4e-\u0c54\u0c57\u0c5b-\u0c5f\u0c64-\u0c65\u0c70-\u0c77\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbb\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce4-\u0ce5\u0cf0\u0cf3-\u0cff\u0d04\u0d0d\u0d11\u0d45\u0d49\u0d50-\u0d53\u0d64-\u0d65\u0d80-\u0d81\u0d84\u0d97-\u0d99\u0db2\u0dbc\u0dbe-\u0dbf\u0dc7-\u0dc9\u0dcb-\u0dce\u0dd5\u0dd7\u0de0-\u0de5\u0df0-\u0df1\u0df5-\u0e00\u0e3b-\u0e3e\u0e5c-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0edb\u0ee0-\u0eff\u0f48\u0f6d-\u0f70\u0f98\u0fbd\u0fcd\u0fdb-\u0fff\u10c6\u10c8-\u10cc\u10ce-\u10cf\u1249\u124e-\u124f\u1257\u1259\u125e-\u125f\u1289\u128e-\u128f\u12b1\u12b6-\u12b7\u12bf\u12c1\u12c6-\u12c7\u12d7\u1311\u1316-\u1317\u135b-\u135c\u137d-\u137f\u139a-\u139f\u13f6-\u13f7\u13fe-\u13ff\u169d-\u169f\u16f9-\u16ff\u170d\u1715-\u171f\u1737-\u173f\u1754-\u175f\u176d\u1771\u1774-\u177f\u17de-\u17df\u17ea-\u17ef\u17fa-\u17ff\u180f\u181a-\u181f\u1879-\u187f\u18ab-\u18af\u18f6-\u18ff\u191f\u192c-\u192f\u193c-\u193f\u1941-\u1943\u196e-\u196f\u1975-\u197f\u19ac-\u19af\u19ca-\u19cf\u19db-\u19dd\u1a1c-\u1a1d\u1a5f\u1a7d-\u1a7e\u1a8a-\u1a8f\u1a9a-\u1a9f\u1aae-\u1aaf\u1abf-\u1aff\u1b4c-\u1b4f\u1b7d-\u1b7f\u1bf4-\u1bfb\u1c38-\u1c3a\u1c4a-\u1c4c\u1c89-\u1c8f\u1cbb-\u1cbc\u1cc8-\u1ccf\u1cfa-\u1cff\u1dfa\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fc5\u1fd4-\u1fd5\u1fdc\u1ff0-\u1ff1\u1ff5\u1fff\u2065\u2072-\u2073\u208f\u209d-\u209f\u20c0-\u20cf\u20f1-\u20ff\u218c-\u218f\u2427-\u243f\u244b-\u245f\u2b74-\u2b75\u2b96-\u2b97\u2bc9\u2bff\u2c2f\u2c5f\u2cf4-\u2cf8\u2d26\u2d28-\u2d2c\u2d2e-\u2d2f\u2d68-\u2d6e\u2d71-\u2d7e\u2d97-\u2d9f\u2da7\u2daf\u2db7\u2dbf\u2dc7\u2dcf\u2dd7\u2ddf\u2e4f-\u2e7f\u2e9a\u2ef4-\u2eff\u2fd6-\u2fef\u2ffc-\u2fff\u3040\u3097-\u3098\u3100-\u3104\u3130\u318f\u31bb-\u31bf\u31e4-\u31ef\u321f\u32ff\u4db6-\u4dbf\u9ff0-\u9fff\ua48d-\ua48f\ua4c7-\ua4cf\ua62c-\ua63f\ua6f8-\ua6ff\ua7ba-\ua7f6\ua82c-\ua82f\ua83a-\ua83f\ua878-\ua87f\ua8c6-\ua8cd\ua8da-\ua8df\ua954-\ua95e\ua97d-\ua97f\ua9ce\ua9da-\ua9dd\ua9ff\uaa37-\uaa3f\uaa4e-\uaa4f\uaa5a-\uaa5b\uaac3-\uaada\uaaf7-\uab00\uab07-\uab08\uab0f-\uab10\uab17-\uab1f\uab27\uab2f\uab66-\uab6f\uabee-\uabef\uabfa-\uabff\ud7a4-\ud7af\ud7c7-\ud7ca\ud7fc-\ud7ff\ufa6e-\ufa6f\ufada-\ufaff\ufb07-\ufb12\ufb18-\ufb1c\ufb37\ufb3d\ufb3f\ufb42\ufb45\ufbc2-\ufbd2\ufd40-\ufd4f\ufd90-\ufd91\ufdc8-\ufdef\ufdfe-\ufdff\ufe1a-\ufe1f\ufe53\ufe67\ufe6c-\ufe6f\ufe75\ufefd-\ufefe\uff00\uffbf-\uffc1\uffc8-\uffc9\uffd0-\uffd1\uffd8-\uffd9\uffdd-\uffdf\uffe7\uffef-\ufff8\ufffe-\uffff\U0001000c\U00010027\U0001003b\U0001003e\U0001004e-\U0001004f\U0001005e-\U0001007f\U000100fb-\U000100ff\U00010103-\U00010106\U00010134-\U00010136\U0001018f\U0001019c-\U0001019f\U000101a1-\U000101cf\U000101fe-\U0001027f\U0001029d-\U0001029f\U000102d1-\U000102df\U000102fc-\U000102ff\U00010324-\U0001032c\U0001034b-\U0001034f\U0001037b-\U0001037f\U0001039e\U000103c4-\U000103c7\U000103d6-\U000103ff\U0001049e-\U0001049f\U000104aa-\U000104af\U000104d4-\U000104d7\U000104fc-\U000104ff\U00010528-\U0001052f\U00010564-\U0001056e\U00010570-\U000105ff\U00010737-\U0001073f\U00010756-\U0001075f\U00010768-\U000107ff\U00010806-\U00010807\U00010809\U00010836\U00010839-\U0001083b\U0001083d-\U0001083e\U00010856\U0001089f-\U000108a6\U000108b0-\U000108df\U000108f3\U000108f6-\U000108fa\U0001091c-\U0001091e\U0001093a-\U0001093e\U00010940-\U0001097f\U000109b8-\U000109bb\U000109d0-\U000109d1\U00010a04\U00010a07-\U00010a0b\U00010a14\U00010a18\U00010a36-\U00010a37\U00010a3b-\U00010a3e\U00010a49-\U00010a4f\U00010a59-\U00010a5f\U00010aa0-\U00010abf\U00010ae7-\U00010aea\U00010af7-\U00010aff\U00010b36-\U00010b38\U00010b56-\U00010b57\U00010b73-\U00010b77\U00010b92-\U00010b98\U00010b9d-\U00010ba8\U00010bb0-\U00010bff\U00010c49-\U00010c7f\U00010cb3-\U00010cbf\U00010cf3-\U00010cf9\U00010d28-\U00010d2f\U00010d3a-\U00010e5f\U00010e7f-\U00010eff\U00010f28-\U00010f2f\U00010f5a-\U00010fff\U0001104e-\U00011051\U00011070-\U0001107e\U000110c2-\U000110cc\U000110ce-\U000110cf\U000110e9-\U000110ef\U000110fa-\U000110ff\U00011135\U00011147-\U0001114f\U00011177-\U0001117f\U000111ce-\U000111cf\U000111e0\U000111f5-\U000111ff\U00011212\U0001123f-\U0001127f\U00011287\U00011289\U0001128e\U0001129e\U000112aa-\U000112af\U000112eb-\U000112ef\U000112fa-\U000112ff\U00011304\U0001130d-\U0001130e\U00011311-\U00011312\U00011329\U00011331\U00011334\U0001133a\U00011345-\U00011346\U00011349-\U0001134a\U0001134e-\U0001134f\U00011351-\U00011356\U00011358-\U0001135c\U00011364-\U00011365\U0001136d-\U0001136f\U00011375-\U000113ff\U0001145a\U0001145c\U0001145f-\U0001147f\U000114c8-\U000114cf\U000114da-\U0001157f\U000115b6-\U000115b7\U000115de-\U000115ff\U00011645-\U0001164f\U0001165a-\U0001165f\U0001166d-\U0001167f\U000116b8-\U000116bf\U000116ca-\U000116ff\U0001171b-\U0001171c\U0001172c-\U0001172f\U00011740-\U000117ff\U0001183c-\U0001189f\U000118f3-\U000118fe\U00011900-\U000119ff\U00011a48-\U00011a4f\U00011a84-\U00011a85\U00011aa3-\U00011abf\U00011af9-\U00011bff\U00011c09\U00011c37\U00011c46-\U00011c4f\U00011c6d-\U00011c6f\U00011c90-\U00011c91\U00011ca8\U00011cb7-\U00011cff\U00011d07\U00011d0a\U00011d37-\U00011d39\U00011d3b\U00011d3e\U00011d48-\U00011d4f\U00011d5a-\U00011d5f\U00011d66\U00011d69\U00011d8f\U00011d92\U00011d99-\U00011d9f\U00011daa-\U00011edf\U00011ef9-\U00011fff\U0001239a-\U000123ff\U0001246f\U00012475-\U0001247f\U00012544-\U00012fff\U0001342f-\U000143ff\U00014647-\U000167ff\U00016a39-\U00016a3f\U00016a5f\U00016a6a-\U00016a6d\U00016a70-\U00016acf\U00016aee-\U00016aef\U00016af6-\U00016aff\U00016b46-\U00016b4f\U00016b5a\U00016b62\U00016b78-\U00016b7c\U00016b90-\U00016e3f\U00016e9b-\U00016eff\U00016f45-\U00016f4f\U00016f7f-\U00016f8e\U00016fa0-\U00016fdf\U00016fe2-\U00016fff\U000187f2-\U000187ff\U00018af3-\U0001afff\U0001b11f-\U0001b16f\U0001b2fc-\U0001bbff\U0001bc6b-\U0001bc6f\U0001bc7d-\U0001bc7f\U0001bc89-\U0001bc8f\U0001bc9a-\U0001bc9b\U0001bca4-\U0001cfff\U0001d0f6-\U0001d0ff\U0001d127-\U0001d128\U0001d1e9-\U0001d1ff\U0001d246-\U0001d2df\U0001d2f4-\U0001d2ff\U0001d357-\U0001d35f\U0001d379-\U0001d3ff\U0001d455\U0001d49d\U0001d4a0-\U0001d4a1\U0001d4a3-\U0001d4a4\U0001d4a7-\U0001d4a8\U0001d4ad\U0001d4ba\U0001d4bc\U0001d4c4\U0001d506\U0001d50b-\U0001d50c\U0001d515\U0001d51d\U0001d53a\U0001d53f\U0001d545\U0001d547-\U0001d549\U0001d551\U0001d6a6-\U0001d6a7\U0001d7cc-\U0001d7cd\U0001da8c-\U0001da9a\U0001daa0\U0001dab0-\U0001dfff\U0001e007\U0001e019-\U0001e01a\U0001e022\U0001e025\U0001e02b-\U0001e7ff\U0001e8c5-\U0001e8c6\U0001e8d7-\U0001e8ff\U0001e94b-\U0001e94f\U0001e95a-\U0001e95d\U0001e960-\U0001ec70\U0001ecb5-\U0001edff\U0001ee04\U0001ee20\U0001ee23\U0001ee25-\U0001ee26\U0001ee28\U0001ee33\U0001ee38\U0001ee3a\U0001ee3c-\U0001ee41\U0001ee43-\U0001ee46\U0001ee48\U0001ee4a\U0001ee4c\U0001ee50\U0001ee53\U0001ee55-\U0001ee56\U0001ee58\U0001ee5a\U0001ee5c\U0001ee5e\U0001ee60\U0001ee63\U0001ee65-\U0001ee66\U0001ee6b\U0001ee73\U0001ee78\U0001ee7d\U0001ee7f\U0001ee8a\U0001ee9c-\U0001eea0\U0001eea4\U0001eeaa\U0001eebc-\U0001eeef\U0001eef2-\U0001efff\U0001f02c-\U0001f02f\U0001f094-\U0001f09f\U0001f0af-\U0001f0b0\U0001f0c0\U0001f0d0\U0001f0f6-\U0001f0ff\U0001f10d-\U0001f10f\U0001f16c-\U0001f16f\U0001f1ad-\U0001f1e5\U0001f203-\U0001f20f\U0001f23c-\U0001f23f\U0001f249-\U0001f24f\U0001f252-\U0001f25f\U0001f266-\U0001f2ff\U0001f6d5-\U0001f6df\U0001f6ed-\U0001f6ef\U0001f6fa-\U0001f6ff\U0001f774-\U0001f77f\U0001f7d9-\U0001f7ff\U0001f80c-\U0001f80f\U0001f848-\U0001f84f\U0001f85a-\U0001f85f\U0001f888-\U0001f88f\U0001f8ae-\U0001f8ff\U0001f90c-\U0001f90f\U0001f93f\U0001f971-\U0001f972\U0001f977-\U0001f979\U0001f97b\U0001f9a3-\U0001f9af\U0001f9ba-\U0001f9bf\U0001f9c3-\U0001f9cf\U0001fa00-\U0001fa5f\U0001fa6e-\U0001ffff\U0002a6d7-\U0002a6ff\U0002b735-\U0002b73f\U0002b81e-\U0002b81f\U0002cea2-\U0002ceaf\U0002ebe1-\U0002f7ff\U0002fa1e-\U000e0000\U000e0002-\U000e001f\U000e0080-\U000e00ff\U000e01f0-\U000effff\U000ffffe-\U000fffff\U0010fffe-\U0010ffff' - -Co = '\ue000-\uf8ff\U000f0000-\U000ffffd\U00100000-\U0010fffd' - -Cs = '\ud800-\udbff\\\udc00\udc01-\udfff' - -Ll = 'a-z\xb5\xdf-\xf6\xf8-\xff\u0101\u0103\u0105\u0107\u0109\u010b\u010d\u010f\u0111\u0113\u0115\u0117\u0119\u011b\u011d\u011f\u0121\u0123\u0125\u0127\u0129\u012b\u012d\u012f\u0131\u0133\u0135\u0137-\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148-\u0149\u014b\u014d\u014f\u0151\u0153\u0155\u0157\u0159\u015b\u015d\u015f\u0161\u0163\u0165\u0167\u0169\u016b\u016d\u016f\u0171\u0173\u0175\u0177\u017a\u017c\u017e-\u0180\u0183\u0185\u0188\u018c-\u018d\u0192\u0195\u0199-\u019b\u019e\u01a1\u01a3\u01a5\u01a8\u01aa-\u01ab\u01ad\u01b0\u01b4\u01b6\u01b9-\u01ba\u01bd-\u01bf\u01c6\u01c9\u01cc\u01ce\u01d0\u01d2\u01d4\u01d6\u01d8\u01da\u01dc-\u01dd\u01df\u01e1\u01e3\u01e5\u01e7\u01e9\u01eb\u01ed\u01ef-\u01f0\u01f3\u01f5\u01f9\u01fb\u01fd\u01ff\u0201\u0203\u0205\u0207\u0209\u020b\u020d\u020f\u0211\u0213\u0215\u0217\u0219\u021b\u021d\u021f\u0221\u0223\u0225\u0227\u0229\u022b\u022d\u022f\u0231\u0233-\u0239\u023c\u023f-\u0240\u0242\u0247\u0249\u024b\u024d\u024f-\u0293\u0295-\u02af\u0371\u0373\u0377\u037b-\u037d\u0390\u03ac-\u03ce\u03d0-\u03d1\u03d5-\u03d7\u03d9\u03db\u03dd\u03df\u03e1\u03e3\u03e5\u03e7\u03e9\u03eb\u03ed\u03ef-\u03f3\u03f5\u03f8\u03fb-\u03fc\u0430-\u045f\u0461\u0463\u0465\u0467\u0469\u046b\u046d\u046f\u0471\u0473\u0475\u0477\u0479\u047b\u047d\u047f\u0481\u048b\u048d\u048f\u0491\u0493\u0495\u0497\u0499\u049b\u049d\u049f\u04a1\u04a3\u04a5\u04a7\u04a9\u04ab\u04ad\u04af\u04b1\u04b3\u04b5\u04b7\u04b9\u04bb\u04bd\u04bf\u04c2\u04c4\u04c6\u04c8\u04ca\u04cc\u04ce-\u04cf\u04d1\u04d3\u04d5\u04d7\u04d9\u04db\u04dd\u04df\u04e1\u04e3\u04e5\u04e7\u04e9\u04eb\u04ed\u04ef\u04f1\u04f3\u04f5\u04f7\u04f9\u04fb\u04fd\u04ff\u0501\u0503\u0505\u0507\u0509\u050b\u050d\u050f\u0511\u0513\u0515\u0517\u0519\u051b\u051d\u051f\u0521\u0523\u0525\u0527\u0529\u052b\u052d\u052f\u0560-\u0588\u10d0-\u10fa\u10fd-\u10ff\u13f8-\u13fd\u1c80-\u1c88\u1d00-\u1d2b\u1d6b-\u1d77\u1d79-\u1d9a\u1e01\u1e03\u1e05\u1e07\u1e09\u1e0b\u1e0d\u1e0f\u1e11\u1e13\u1e15\u1e17\u1e19\u1e1b\u1e1d\u1e1f\u1e21\u1e23\u1e25\u1e27\u1e29\u1e2b\u1e2d\u1e2f\u1e31\u1e33\u1e35\u1e37\u1e39\u1e3b\u1e3d\u1e3f\u1e41\u1e43\u1e45\u1e47\u1e49\u1e4b\u1e4d\u1e4f\u1e51\u1e53\u1e55\u1e57\u1e59\u1e5b\u1e5d\u1e5f\u1e61\u1e63\u1e65\u1e67\u1e69\u1e6b\u1e6d\u1e6f\u1e71\u1e73\u1e75\u1e77\u1e79\u1e7b\u1e7d\u1e7f\u1e81\u1e83\u1e85\u1e87\u1e89\u1e8b\u1e8d\u1e8f\u1e91\u1e93\u1e95-\u1e9d\u1e9f\u1ea1\u1ea3\u1ea5\u1ea7\u1ea9\u1eab\u1ead\u1eaf\u1eb1\u1eb3\u1eb5\u1eb7\u1eb9\u1ebb\u1ebd\u1ebf\u1ec1\u1ec3\u1ec5\u1ec7\u1ec9\u1ecb\u1ecd\u1ecf\u1ed1\u1ed3\u1ed5\u1ed7\u1ed9\u1edb\u1edd\u1edf\u1ee1\u1ee3\u1ee5\u1ee7\u1ee9\u1eeb\u1eed\u1eef\u1ef1\u1ef3\u1ef5\u1ef7\u1ef9\u1efb\u1efd\u1eff-\u1f07\u1f10-\u1f15\u1f20-\u1f27\u1f30-\u1f37\u1f40-\u1f45\u1f50-\u1f57\u1f60-\u1f67\u1f70-\u1f7d\u1f80-\u1f87\u1f90-\u1f97\u1fa0-\u1fa7\u1fb0-\u1fb4\u1fb6-\u1fb7\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fc7\u1fd0-\u1fd3\u1fd6-\u1fd7\u1fe0-\u1fe7\u1ff2-\u1ff4\u1ff6-\u1ff7\u210a\u210e-\u210f\u2113\u212f\u2134\u2139\u213c-\u213d\u2146-\u2149\u214e\u2184\u2c30-\u2c5e\u2c61\u2c65-\u2c66\u2c68\u2c6a\u2c6c\u2c71\u2c73-\u2c74\u2c76-\u2c7b\u2c81\u2c83\u2c85\u2c87\u2c89\u2c8b\u2c8d\u2c8f\u2c91\u2c93\u2c95\u2c97\u2c99\u2c9b\u2c9d\u2c9f\u2ca1\u2ca3\u2ca5\u2ca7\u2ca9\u2cab\u2cad\u2caf\u2cb1\u2cb3\u2cb5\u2cb7\u2cb9\u2cbb\u2cbd\u2cbf\u2cc1\u2cc3\u2cc5\u2cc7\u2cc9\u2ccb\u2ccd\u2ccf\u2cd1\u2cd3\u2cd5\u2cd7\u2cd9\u2cdb\u2cdd\u2cdf\u2ce1\u2ce3-\u2ce4\u2cec\u2cee\u2cf3\u2d00-\u2d25\u2d27\u2d2d\ua641\ua643\ua645\ua647\ua649\ua64b\ua64d\ua64f\ua651\ua653\ua655\ua657\ua659\ua65b\ua65d\ua65f\ua661\ua663\ua665\ua667\ua669\ua66b\ua66d\ua681\ua683\ua685\ua687\ua689\ua68b\ua68d\ua68f\ua691\ua693\ua695\ua697\ua699\ua69b\ua723\ua725\ua727\ua729\ua72b\ua72d\ua72f-\ua731\ua733\ua735\ua737\ua739\ua73b\ua73d\ua73f\ua741\ua743\ua745\ua747\ua749\ua74b\ua74d\ua74f\ua751\ua753\ua755\ua757\ua759\ua75b\ua75d\ua75f\ua761\ua763\ua765\ua767\ua769\ua76b\ua76d\ua76f\ua771-\ua778\ua77a\ua77c\ua77f\ua781\ua783\ua785\ua787\ua78c\ua78e\ua791\ua793-\ua795\ua797\ua799\ua79b\ua79d\ua79f\ua7a1\ua7a3\ua7a5\ua7a7\ua7a9\ua7af\ua7b5\ua7b7\ua7b9\ua7fa\uab30-\uab5a\uab60-\uab65\uab70-\uabbf\ufb00-\ufb06\ufb13-\ufb17\uff41-\uff5a\U00010428-\U0001044f\U000104d8-\U000104fb\U00010cc0-\U00010cf2\U000118c0-\U000118df\U00016e60-\U00016e7f\U0001d41a-\U0001d433\U0001d44e-\U0001d454\U0001d456-\U0001d467\U0001d482-\U0001d49b\U0001d4b6-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d4cf\U0001d4ea-\U0001d503\U0001d51e-\U0001d537\U0001d552-\U0001d56b\U0001d586-\U0001d59f\U0001d5ba-\U0001d5d3\U0001d5ee-\U0001d607\U0001d622-\U0001d63b\U0001d656-\U0001d66f\U0001d68a-\U0001d6a5\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6e1\U0001d6fc-\U0001d714\U0001d716-\U0001d71b\U0001d736-\U0001d74e\U0001d750-\U0001d755\U0001d770-\U0001d788\U0001d78a-\U0001d78f\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7c9\U0001d7cb\U0001e922-\U0001e943' - -Lm = '\u02b0-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0374\u037a\u0559\u0640\u06e5-\u06e6\u07f4-\u07f5\u07fa\u081a\u0824\u0828\u0971\u0e46\u0ec6\u10fc\u17d7\u1843\u1aa7\u1c78-\u1c7d\u1d2c-\u1d6a\u1d78\u1d9b-\u1dbf\u2071\u207f\u2090-\u209c\u2c7c-\u2c7d\u2d6f\u2e2f\u3005\u3031-\u3035\u303b\u309d-\u309e\u30fc-\u30fe\ua015\ua4f8-\ua4fd\ua60c\ua67f\ua69c-\ua69d\ua717-\ua71f\ua770\ua788\ua7f8-\ua7f9\ua9cf\ua9e6\uaa70\uaadd\uaaf3-\uaaf4\uab5c-\uab5f\uff70\uff9e-\uff9f\U00016b40-\U00016b43\U00016f93-\U00016f9f\U00016fe0-\U00016fe1' - -Lo = '\xaa\xba\u01bb\u01c0-\u01c3\u0294\u05d0-\u05ea\u05ef-\u05f2\u0620-\u063f\u0641-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u0800-\u0815\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17dc\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c77\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u2135-\u2138\u2d30-\u2d67\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3006\u303c\u3041-\u3096\u309f\u30a1-\u30fa\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua014\ua016-\ua48c\ua4d0-\ua4f7\ua500-\ua60b\ua610-\ua61f\ua62a-\ua62b\ua66e\ua6a0-\ua6e5\ua78f\ua7f7\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9e0-\ua9e4\ua9e7-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa6f\uaa71-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadc\uaae0-\uaaea\uaaf2\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff66-\uff6f\uff71-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U00010340\U00010342-\U00010349\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U00010450-\U0001049d\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016f00-\U00016f44\U00016f50\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001e800-\U0001e8c4\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d' - -Lt = '\u01c5\u01c8\u01cb\u01f2\u1f88-\u1f8f\u1f98-\u1f9f\u1fa8-\u1faf\u1fbc\u1fcc\u1ffc' - -Lu = 'A-Z\xc0-\xd6\xd8-\xde\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0139\u013b\u013d\u013f\u0141\u0143\u0145\u0147\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178-\u0179\u017b\u017d\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018b\u018e-\u0191\u0193-\u0194\u0196-\u0198\u019c-\u019d\u019f-\u01a0\u01a2\u01a4\u01a6-\u01a7\u01a9\u01ac\u01ae-\u01af\u01b1-\u01b3\u01b5\u01b7-\u01b8\u01bc\u01c4\u01c7\u01ca\u01cd\u01cf\u01d1\u01d3\u01d5\u01d7\u01d9\u01db\u01de\u01e0\u01e2\u01e4\u01e6\u01e8\u01ea\u01ec\u01ee\u01f1\u01f4\u01f6-\u01f8\u01fa\u01fc\u01fe\u0200\u0202\u0204\u0206\u0208\u020a\u020c\u020e\u0210\u0212\u0214\u0216\u0218\u021a\u021c\u021e\u0220\u0222\u0224\u0226\u0228\u022a\u022c\u022e\u0230\u0232\u023a-\u023b\u023d-\u023e\u0241\u0243-\u0246\u0248\u024a\u024c\u024e\u0370\u0372\u0376\u037f\u0386\u0388-\u038a\u038c\u038e-\u038f\u0391-\u03a1\u03a3-\u03ab\u03cf\u03d2-\u03d4\u03d8\u03da\u03dc\u03de\u03e0\u03e2\u03e4\u03e6\u03e8\u03ea\u03ec\u03ee\u03f4\u03f7\u03f9-\u03fa\u03fd-\u042f\u0460\u0462\u0464\u0466\u0468\u046a\u046c\u046e\u0470\u0472\u0474\u0476\u0478\u047a\u047c\u047e\u0480\u048a\u048c\u048e\u0490\u0492\u0494\u0496\u0498\u049a\u049c\u049e\u04a0\u04a2\u04a4\u04a6\u04a8\u04aa\u04ac\u04ae\u04b0\u04b2\u04b4\u04b6\u04b8\u04ba\u04bc\u04be\u04c0-\u04c1\u04c3\u04c5\u04c7\u04c9\u04cb\u04cd\u04d0\u04d2\u04d4\u04d6\u04d8\u04da\u04dc\u04de\u04e0\u04e2\u04e4\u04e6\u04e8\u04ea\u04ec\u04ee\u04f0\u04f2\u04f4\u04f6\u04f8\u04fa\u04fc\u04fe\u0500\u0502\u0504\u0506\u0508\u050a\u050c\u050e\u0510\u0512\u0514\u0516\u0518\u051a\u051c\u051e\u0520\u0522\u0524\u0526\u0528\u052a\u052c\u052e\u0531-\u0556\u10a0-\u10c5\u10c7\u10cd\u13a0-\u13f5\u1c90-\u1cba\u1cbd-\u1cbf\u1e00\u1e02\u1e04\u1e06\u1e08\u1e0a\u1e0c\u1e0e\u1e10\u1e12\u1e14\u1e16\u1e18\u1e1a\u1e1c\u1e1e\u1e20\u1e22\u1e24\u1e26\u1e28\u1e2a\u1e2c\u1e2e\u1e30\u1e32\u1e34\u1e36\u1e38\u1e3a\u1e3c\u1e3e\u1e40\u1e42\u1e44\u1e46\u1e48\u1e4a\u1e4c\u1e4e\u1e50\u1e52\u1e54\u1e56\u1e58\u1e5a\u1e5c\u1e5e\u1e60\u1e62\u1e64\u1e66\u1e68\u1e6a\u1e6c\u1e6e\u1e70\u1e72\u1e74\u1e76\u1e78\u1e7a\u1e7c\u1e7e\u1e80\u1e82\u1e84\u1e86\u1e88\u1e8a\u1e8c\u1e8e\u1e90\u1e92\u1e94\u1e9e\u1ea0\u1ea2\u1ea4\u1ea6\u1ea8\u1eaa\u1eac\u1eae\u1eb0\u1eb2\u1eb4\u1eb6\u1eb8\u1eba\u1ebc\u1ebe\u1ec0\u1ec2\u1ec4\u1ec6\u1ec8\u1eca\u1ecc\u1ece\u1ed0\u1ed2\u1ed4\u1ed6\u1ed8\u1eda\u1edc\u1ede\u1ee0\u1ee2\u1ee4\u1ee6\u1ee8\u1eea\u1eec\u1eee\u1ef0\u1ef2\u1ef4\u1ef6\u1ef8\u1efa\u1efc\u1efe\u1f08-\u1f0f\u1f18-\u1f1d\u1f28-\u1f2f\u1f38-\u1f3f\u1f48-\u1f4d\u1f59\u1f5b\u1f5d\u1f5f\u1f68-\u1f6f\u1fb8-\u1fbb\u1fc8-\u1fcb\u1fd8-\u1fdb\u1fe8-\u1fec\u1ff8-\u1ffb\u2102\u2107\u210b-\u210d\u2110-\u2112\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u2130-\u2133\u213e-\u213f\u2145\u2183\u2c00-\u2c2e\u2c60\u2c62-\u2c64\u2c67\u2c69\u2c6b\u2c6d-\u2c70\u2c72\u2c75\u2c7e-\u2c80\u2c82\u2c84\u2c86\u2c88\u2c8a\u2c8c\u2c8e\u2c90\u2c92\u2c94\u2c96\u2c98\u2c9a\u2c9c\u2c9e\u2ca0\u2ca2\u2ca4\u2ca6\u2ca8\u2caa\u2cac\u2cae\u2cb0\u2cb2\u2cb4\u2cb6\u2cb8\u2cba\u2cbc\u2cbe\u2cc0\u2cc2\u2cc4\u2cc6\u2cc8\u2cca\u2ccc\u2cce\u2cd0\u2cd2\u2cd4\u2cd6\u2cd8\u2cda\u2cdc\u2cde\u2ce0\u2ce2\u2ceb\u2ced\u2cf2\ua640\ua642\ua644\ua646\ua648\ua64a\ua64c\ua64e\ua650\ua652\ua654\ua656\ua658\ua65a\ua65c\ua65e\ua660\ua662\ua664\ua666\ua668\ua66a\ua66c\ua680\ua682\ua684\ua686\ua688\ua68a\ua68c\ua68e\ua690\ua692\ua694\ua696\ua698\ua69a\ua722\ua724\ua726\ua728\ua72a\ua72c\ua72e\ua732\ua734\ua736\ua738\ua73a\ua73c\ua73e\ua740\ua742\ua744\ua746\ua748\ua74a\ua74c\ua74e\ua750\ua752\ua754\ua756\ua758\ua75a\ua75c\ua75e\ua760\ua762\ua764\ua766\ua768\ua76a\ua76c\ua76e\ua779\ua77b\ua77d-\ua77e\ua780\ua782\ua784\ua786\ua78b\ua78d\ua790\ua792\ua796\ua798\ua79a\ua79c\ua79e\ua7a0\ua7a2\ua7a4\ua7a6\ua7a8\ua7aa-\ua7ae\ua7b0-\ua7b4\ua7b6\ua7b8\uff21-\uff3a\U00010400-\U00010427\U000104b0-\U000104d3\U00010c80-\U00010cb2\U000118a0-\U000118bf\U00016e40-\U00016e5f\U0001d400-\U0001d419\U0001d434-\U0001d44d\U0001d468-\U0001d481\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b5\U0001d4d0-\U0001d4e9\U0001d504-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d538-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d56c-\U0001d585\U0001d5a0-\U0001d5b9\U0001d5d4-\U0001d5ed\U0001d608-\U0001d621\U0001d63c-\U0001d655\U0001d670-\U0001d689\U0001d6a8-\U0001d6c0\U0001d6e2-\U0001d6fa\U0001d71c-\U0001d734\U0001d756-\U0001d76e\U0001d790-\U0001d7a8\U0001d7ca\U0001e900-\U0001e921' - -Mc = '\u0903\u093b\u093e-\u0940\u0949-\u094c\u094e-\u094f\u0982-\u0983\u09be-\u09c0\u09c7-\u09c8\u09cb-\u09cc\u09d7\u0a03\u0a3e-\u0a40\u0a83\u0abe-\u0ac0\u0ac9\u0acb-\u0acc\u0b02-\u0b03\u0b3e\u0b40\u0b47-\u0b48\u0b4b-\u0b4c\u0b57\u0bbe-\u0bbf\u0bc1-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd7\u0c01-\u0c03\u0c41-\u0c44\u0c82-\u0c83\u0cbe\u0cc0-\u0cc4\u0cc7-\u0cc8\u0cca-\u0ccb\u0cd5-\u0cd6\u0d02-\u0d03\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d57\u0d82-\u0d83\u0dcf-\u0dd1\u0dd8-\u0ddf\u0df2-\u0df3\u0f3e-\u0f3f\u0f7f\u102b-\u102c\u1031\u1038\u103b-\u103c\u1056-\u1057\u1062-\u1064\u1067-\u106d\u1083-\u1084\u1087-\u108c\u108f\u109a-\u109c\u17b6\u17be-\u17c5\u17c7-\u17c8\u1923-\u1926\u1929-\u192b\u1930-\u1931\u1933-\u1938\u1a19-\u1a1a\u1a55\u1a57\u1a61\u1a63-\u1a64\u1a6d-\u1a72\u1b04\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b44\u1b82\u1ba1\u1ba6-\u1ba7\u1baa\u1be7\u1bea-\u1bec\u1bee\u1bf2-\u1bf3\u1c24-\u1c2b\u1c34-\u1c35\u1ce1\u1cf2-\u1cf3\u1cf7\u302e-\u302f\ua823-\ua824\ua827\ua880-\ua881\ua8b4-\ua8c3\ua952-\ua953\ua983\ua9b4-\ua9b5\ua9ba-\ua9bb\ua9bd-\ua9c0\uaa2f-\uaa30\uaa33-\uaa34\uaa4d\uaa7b\uaa7d\uaaeb\uaaee-\uaaef\uaaf5\uabe3-\uabe4\uabe6-\uabe7\uabe9-\uabea\uabec\U00011000\U00011002\U00011082\U000110b0-\U000110b2\U000110b7-\U000110b8\U0001112c\U00011145-\U00011146\U00011182\U000111b3-\U000111b5\U000111bf-\U000111c0\U0001122c-\U0001122e\U00011232-\U00011233\U00011235\U000112e0-\U000112e2\U00011302-\U00011303\U0001133e-\U0001133f\U00011341-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011357\U00011362-\U00011363\U00011435-\U00011437\U00011440-\U00011441\U00011445\U000114b0-\U000114b2\U000114b9\U000114bb-\U000114be\U000114c1\U000115af-\U000115b1\U000115b8-\U000115bb\U000115be\U00011630-\U00011632\U0001163b-\U0001163c\U0001163e\U000116ac\U000116ae-\U000116af\U000116b6\U00011720-\U00011721\U00011726\U0001182c-\U0001182e\U00011838\U00011a39\U00011a57-\U00011a58\U00011a97\U00011c2f\U00011c3e\U00011ca9\U00011cb1\U00011cb4\U00011d8a-\U00011d8e\U00011d93-\U00011d94\U00011d96\U00011ef5-\U00011ef6\U00016f51-\U00016f7e\U0001d165-\U0001d166\U0001d16d-\U0001d172' - -Me = '\u0488-\u0489\u1abe\u20dd-\u20e0\u20e2-\u20e4\ua670-\ua672' - -Mn = '\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09c1-\u09c4\u09cd\u09e2-\u09e3\u09fe\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0afa-\u0aff\u0b01\u0b3c\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b62-\u0b63\u0b82\u0bc0\u0bcd\u0c00\u0c04\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc6\u0ccc-\u0ccd\u0ce2-\u0ce3\u0d00-\u0d01\u0d3b-\u0d3c\u0d41-\u0d44\u0d4d\u0d62-\u0d63\u0dca\u0dd2-\u0dd4\u0dd6\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u1885-\u1886\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u3099-\u309a\ua66f\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4-\ua8c5\ua8e0-\ua8f1\ua8ff\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\U000101fd\U000102e0\U00010376-\U0001037a\U00010a01-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a0f\U00010a38-\U00010a3a\U00010a3f\U00010ae5-\U00010ae6\U00010d24-\U00010d27\U00010f46-\U00010f50\U00011001\U00011038-\U00011046\U0001107f-\U00011081\U000110b3-\U000110b6\U000110b9-\U000110ba\U00011100-\U00011102\U00011127-\U0001112b\U0001112d-\U00011134\U00011173\U00011180-\U00011181\U000111b6-\U000111be\U000111c9-\U000111cc\U0001122f-\U00011231\U00011234\U00011236-\U00011237\U0001123e\U000112df\U000112e3-\U000112ea\U00011300-\U00011301\U0001133b-\U0001133c\U00011340\U00011366-\U0001136c\U00011370-\U00011374\U00011438-\U0001143f\U00011442-\U00011444\U00011446\U0001145e\U000114b3-\U000114b8\U000114ba\U000114bf-\U000114c0\U000114c2-\U000114c3\U000115b2-\U000115b5\U000115bc-\U000115bd\U000115bf-\U000115c0\U000115dc-\U000115dd\U00011633-\U0001163a\U0001163d\U0001163f-\U00011640\U000116ab\U000116ad\U000116b0-\U000116b5\U000116b7\U0001171d-\U0001171f\U00011722-\U00011725\U00011727-\U0001172b\U0001182f-\U00011837\U00011839-\U0001183a\U00011a01-\U00011a0a\U00011a33-\U00011a38\U00011a3b-\U00011a3e\U00011a47\U00011a51-\U00011a56\U00011a59-\U00011a5b\U00011a8a-\U00011a96\U00011a98-\U00011a99\U00011c30-\U00011c36\U00011c38-\U00011c3d\U00011c3f\U00011c92-\U00011ca7\U00011caa-\U00011cb0\U00011cb2-\U00011cb3\U00011cb5-\U00011cb6\U00011d31-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d45\U00011d47\U00011d90-\U00011d91\U00011d95\U00011d97\U00011ef3-\U00011ef4\U00016af0-\U00016af4\U00016b30-\U00016b36\U00016f8f-\U00016f92\U0001bc9d-\U0001bc9e\U0001d167-\U0001d169\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e8d0-\U0001e8d6\U0001e944-\U0001e94a\U000e0100-\U000e01ef' - -Nd = '0-9\u0660-\u0669\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0de6-\u0def\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\ua9f0-\ua9f9\uaa50-\uaa59\uabf0-\uabf9\uff10-\uff19\U000104a0-\U000104a9\U00010d30-\U00010d39\U00011066-\U0001106f\U000110f0-\U000110f9\U00011136-\U0001113f\U000111d0-\U000111d9\U000112f0-\U000112f9\U00011450-\U00011459\U000114d0-\U000114d9\U00011650-\U00011659\U000116c0-\U000116c9\U00011730-\U00011739\U000118e0-\U000118e9\U00011c50-\U00011c59\U00011d50-\U00011d59\U00011da0-\U00011da9\U00016a60-\U00016a69\U00016b50-\U00016b59\U0001d7ce-\U0001d7ff\U0001e950-\U0001e959' - -Nl = '\u16ee-\u16f0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303a\ua6e6-\ua6ef\U00010140-\U00010174\U00010341\U0001034a\U000103d1-\U000103d5\U00012400-\U0001246e' - -No = '\xb2-\xb3\xb9\xbc-\xbe\u09f4-\u09f9\u0b72-\u0b77\u0bf0-\u0bf2\u0c78-\u0c7e\u0d58-\u0d5e\u0d70-\u0d78\u0f2a-\u0f33\u1369-\u137c\u17f0-\u17f9\u19da\u2070\u2074-\u2079\u2080-\u2089\u2150-\u215f\u2189\u2460-\u249b\u24ea-\u24ff\u2776-\u2793\u2cfd\u3192-\u3195\u3220-\u3229\u3248-\u324f\u3251-\u325f\u3280-\u3289\u32b1-\u32bf\ua830-\ua835\U00010107-\U00010133\U00010175-\U00010178\U0001018a-\U0001018b\U000102e1-\U000102fb\U00010320-\U00010323\U00010858-\U0001085f\U00010879-\U0001087f\U000108a7-\U000108af\U000108fb-\U000108ff\U00010916-\U0001091b\U000109bc-\U000109bd\U000109c0-\U000109cf\U000109d2-\U000109ff\U00010a40-\U00010a48\U00010a7d-\U00010a7e\U00010a9d-\U00010a9f\U00010aeb-\U00010aef\U00010b58-\U00010b5f\U00010b78-\U00010b7f\U00010ba9-\U00010baf\U00010cfa-\U00010cff\U00010e60-\U00010e7e\U00010f1d-\U00010f26\U00010f51-\U00010f54\U00011052-\U00011065\U000111e1-\U000111f4\U0001173a-\U0001173b\U000118ea-\U000118f2\U00011c5a-\U00011c6c\U00016b5b-\U00016b61\U00016e80-\U00016e96\U0001d2e0-\U0001d2f3\U0001d360-\U0001d378\U0001e8c7-\U0001e8cf\U0001ec71-\U0001ecab\U0001ecad-\U0001ecaf\U0001ecb1-\U0001ecb4\U0001f100-\U0001f10c' - -Pc = '_\u203f-\u2040\u2054\ufe33-\ufe34\ufe4d-\ufe4f\uff3f' - -Pd = '\\-\u058a\u05be\u1400\u1806\u2010-\u2015\u2e17\u2e1a\u2e3a-\u2e3b\u2e40\u301c\u3030\u30a0\ufe31-\ufe32\ufe58\ufe63\uff0d' - -Pe = ')\\]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u2309\u230b\u232a\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b\u301e-\u301f\ufd3e\ufe18\ufe36\ufe38\ufe3a\ufe3c\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e\uff09\uff3d\uff5d\uff60\uff63' - -Pf = '\xbb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d\u2e21' - -Pi = '\xab\u2018\u201b-\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c\u2e20' - -Po = "!-#%-'*,.-/:-;?-@\\\\\xa1\xa7\xb6-\xb7\xbf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3-\u05f4\u0609-\u060a\u060c-\u060d\u061b\u061e-\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964-\u0965\u0970\u09fd\u0a76\u0af0\u0c84\u0df4\u0e4f\u0e5a-\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9-\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d-\u166e\u16eb-\u16ed\u1735-\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944-\u1945\u1a1e-\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e-\u1c7f\u1cc0-\u1cc7\u1cd3\u2016-\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe-\u2cff\u2d70\u2e00-\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18-\u2e19\u2e1b\u2e1e-\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u2e3c-\u2e3f\u2e41\u2e43-\u2e4e\u3001-\u3003\u303d\u30fb\ua4fe-\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce-\ua8cf\ua8f8-\ua8fa\ua8fc\ua92e-\ua92f\ua95f\ua9c1-\ua9cd\ua9de-\ua9df\uaa5c-\uaa5f\uaade-\uaadf\uaaf0-\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45-\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a-\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e-\uff0f\uff1a-\uff1b\uff1f-\uff20\uff3c\uff61\uff64-\uff65\U00010100-\U00010102\U0001039f\U000103d0\U0001056f\U00010857\U0001091f\U0001093f\U00010a50-\U00010a58\U00010a7f\U00010af0-\U00010af6\U00010b39-\U00010b3f\U00010b99-\U00010b9c\U00010f55-\U00010f59\U00011047-\U0001104d\U000110bb-\U000110bc\U000110be-\U000110c1\U00011140-\U00011143\U00011174-\U00011175\U000111c5-\U000111c8\U000111cd\U000111db\U000111dd-\U000111df\U00011238-\U0001123d\U000112a9\U0001144b-\U0001144f\U0001145b\U0001145d\U000114c6\U000115c1-\U000115d7\U00011641-\U00011643\U00011660-\U0001166c\U0001173c-\U0001173e\U0001183b\U00011a3f-\U00011a46\U00011a9a-\U00011a9c\U00011a9e-\U00011aa2\U00011c41-\U00011c45\U00011c70-\U00011c71\U00011ef7-\U00011ef8\U00012470-\U00012474\U00016a6e-\U00016a6f\U00016af5\U00016b37-\U00016b3b\U00016b44\U00016e97-\U00016e9a\U0001bc9f\U0001da87-\U0001da8b\U0001e95e-\U0001e95f" - -Ps = '(\\[{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d\u208d\u2308\u230a\u2329\u2768\u276a\u276c\u276e\u2770\u2772\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26\u2e28\u2e42\u3008\u300a\u300c\u300e\u3010\u3014\u3016\u3018\u301a\u301d\ufd3f\ufe17\ufe35\ufe37\ufe39\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b\ufe5d\uff08\uff3b\uff5b\uff5f\uff62' - -Sc = '$\xa2-\xa5\u058f\u060b\u07fe-\u07ff\u09f2-\u09f3\u09fb\u0af1\u0bf9\u0e3f\u17db\u20a0-\u20bf\ua838\ufdfc\ufe69\uff04\uffe0-\uffe1\uffe5-\uffe6\U0001ecb0' - -Sk = '\\^`\xa8\xaf\xb4\xb8\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384-\u0385\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd-\u1ffe\u309b-\u309c\ua700-\ua716\ua720-\ua721\ua789-\ua78a\uab5b\ufbb2-\ufbc1\uff3e\uff40\uffe3\U0001f3fb-\U0001f3ff' - -Sm = '+<->|~\xac\xb1\xd7\xf7\u03f6\u0606-\u0608\u2044\u2052\u207a-\u207c\u208a-\u208c\u2118\u2140-\u2144\u214b\u2190-\u2194\u219a-\u219b\u21a0\u21a3\u21a6\u21ae\u21ce-\u21cf\u21d2\u21d4\u21f4-\u22ff\u2320-\u2321\u237c\u239b-\u23b3\u23dc-\u23e1\u25b7\u25c1\u25f8-\u25ff\u266f\u27c0-\u27c4\u27c7-\u27e5\u27f0-\u27ff\u2900-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2aff\u2b30-\u2b44\u2b47-\u2b4c\ufb29\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe9-\uffec\U0001d6c1\U0001d6db\U0001d6fb\U0001d715\U0001d735\U0001d74f\U0001d76f\U0001d789\U0001d7a9\U0001d7c3\U0001eef0-\U0001eef1' - -So = '\xa6\xa9\xae\xb0\u0482\u058d-\u058e\u060e-\u060f\u06de\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0d4f\u0d79\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fcf\u0fd5-\u0fd8\u109e-\u109f\u1390-\u1399\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2117\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u214a\u214c-\u214d\u214f\u218a-\u218b\u2195-\u2199\u219c-\u219f\u21a1-\u21a2\u21a4-\u21a5\u21a7-\u21ad\u21af-\u21cd\u21d0-\u21d1\u21d3\u21d5-\u21f3\u2300-\u2307\u230c-\u231f\u2322-\u2328\u232b-\u237b\u237d-\u239a\u23b4-\u23db\u23e2-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u25b6\u25b8-\u25c0\u25c2-\u25f7\u2600-\u266e\u2670-\u2767\u2794-\u27bf\u2800-\u28ff\u2b00-\u2b2f\u2b45-\u2b46\u2b4d-\u2b73\u2b76-\u2b95\u2b98-\u2bc8\u2bca-\u2bfe\u2ce5-\u2cea\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u32fe\u3300-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ua836-\ua837\ua839\uaa77-\uaa79\ufdfd\uffe4\uffe8\uffed-\uffee\ufffc-\ufffd\U00010137-\U0001013f\U00010179-\U00010189\U0001018c-\U0001018e\U00010190-\U0001019b\U000101a0\U000101d0-\U000101fc\U00010877-\U00010878\U00010ac8\U0001173f\U00016b3c-\U00016b3f\U00016b45\U0001bc9c\U0001d000-\U0001d0f5\U0001d100-\U0001d126\U0001d129-\U0001d164\U0001d16a-\U0001d16c\U0001d183-\U0001d184\U0001d18c-\U0001d1a9\U0001d1ae-\U0001d1e8\U0001d200-\U0001d241\U0001d245\U0001d300-\U0001d356\U0001d800-\U0001d9ff\U0001da37-\U0001da3a\U0001da6d-\U0001da74\U0001da76-\U0001da83\U0001da85-\U0001da86\U0001ecac\U0001f000-\U0001f02b\U0001f030-\U0001f093\U0001f0a0-\U0001f0ae\U0001f0b1-\U0001f0bf\U0001f0c1-\U0001f0cf\U0001f0d1-\U0001f0f5\U0001f110-\U0001f16b\U0001f170-\U0001f1ac\U0001f1e6-\U0001f202\U0001f210-\U0001f23b\U0001f240-\U0001f248\U0001f250-\U0001f251\U0001f260-\U0001f265\U0001f300-\U0001f3fa\U0001f400-\U0001f6d4\U0001f6e0-\U0001f6ec\U0001f6f0-\U0001f6f9\U0001f700-\U0001f773\U0001f780-\U0001f7d8\U0001f800-\U0001f80b\U0001f810-\U0001f847\U0001f850-\U0001f859\U0001f860-\U0001f887\U0001f890-\U0001f8ad\U0001f900-\U0001f90b\U0001f910-\U0001f93e\U0001f940-\U0001f970\U0001f973-\U0001f976\U0001f97a\U0001f97c-\U0001f9a2\U0001f9b0-\U0001f9b9\U0001f9c0-\U0001f9c2\U0001f9d0-\U0001f9ff\U0001fa60-\U0001fa6d' - -Zl = '\u2028' - -Zp = '\u2029' - -Zs = ' \xa0\u1680\u2000-\u200a\u202f\u205f\u3000' - -xid_continue = '0-9A-Z_a-z\xaa\xb5\xb7\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u05d0-\u05ea\u05ef-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u07fd\u0800-\u082d\u0840-\u085b\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u08d3-\u08e1\u08e3-\u0963\u0966-\u096f\u0971-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09f1\u09fc\u09fe\u0a01-\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0af9-\u0aff\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82-\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c00-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c5a\u0c60-\u0c63\u0c66-\u0c6f\u0c80-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2\u0d00-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d54-\u0d57\u0d5f-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18-\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1369-\u1371\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17d3\u17d7\u17dc-\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1878\u1880-\u18aa\u18b0-\u18f5\u1900-\u191e\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1ab0-\u1abd\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1cd0-\u1cd2\u1cd4-\u1cf9\u1d00-\u1df9\u1dfb-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u203f-\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099-\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua827\ua840-\ua873\ua880-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua8fd-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\ua9e0-\ua9fe\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabea\uabec-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe00-\ufe0f\ufe20-\ufe2f\ufe33-\ufe34\ufe4d-\ufe4f\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U000101fd\U00010280-\U0001029c\U000102a0-\U000102d0\U000102e0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U0001037a\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104a0-\U000104a9\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00-\U00010a03\U00010a05-\U00010a06\U00010a0c-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a38-\U00010a3a\U00010a3f\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae6\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d27\U00010d30-\U00010d39\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f50\U00011000-\U00011046\U00011066-\U0001106f\U0001107f-\U000110ba\U000110d0-\U000110e8\U000110f0-\U000110f9\U00011100-\U00011134\U00011136-\U0001113f\U00011144-\U00011146\U00011150-\U00011173\U00011176\U00011180-\U000111c4\U000111c9-\U000111cc\U000111d0-\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U00011237\U0001123e\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112ea\U000112f0-\U000112f9\U00011300-\U00011303\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133b-\U00011344\U00011347-\U00011348\U0001134b-\U0001134d\U00011350\U00011357\U0001135d-\U00011363\U00011366-\U0001136c\U00011370-\U00011374\U00011400-\U0001144a\U00011450-\U00011459\U0001145e\U00011480-\U000114c5\U000114c7\U000114d0-\U000114d9\U00011580-\U000115b5\U000115b8-\U000115c0\U000115d8-\U000115dd\U00011600-\U00011640\U00011644\U00011650-\U00011659\U00011680-\U000116b7\U000116c0-\U000116c9\U00011700-\U0001171a\U0001171d-\U0001172b\U00011730-\U00011739\U00011800-\U0001183a\U000118a0-\U000118e9\U000118ff\U00011a00-\U00011a3e\U00011a47\U00011a50-\U00011a83\U00011a86-\U00011a99\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c36\U00011c38-\U00011c40\U00011c50-\U00011c59\U00011c72-\U00011c8f\U00011c92-\U00011ca7\U00011ca9-\U00011cb6\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d36\U00011d3a\U00011d3c-\U00011d3d\U00011d3f-\U00011d47\U00011d50-\U00011d59\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d8e\U00011d90-\U00011d91\U00011d93-\U00011d98\U00011da0-\U00011da9\U00011ee0-\U00011ef6\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016a60-\U00016a69\U00016ad0-\U00016aed\U00016af0-\U00016af4\U00016b00-\U00016b36\U00016b40-\U00016b43\U00016b50-\U00016b59\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50-\U00016f7e\U00016f8f-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001bc9d-\U0001bc9e\U0001d165-\U0001d169\U0001d16d-\U0001d172\U0001d17b-\U0001d182\U0001d185-\U0001d18b\U0001d1aa-\U0001d1ad\U0001d242-\U0001d244\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001d7ce-\U0001d7ff\U0001da00-\U0001da36\U0001da3b-\U0001da6c\U0001da75\U0001da84\U0001da9b-\U0001da9f\U0001daa1-\U0001daaf\U0001e000-\U0001e006\U0001e008-\U0001e018\U0001e01b-\U0001e021\U0001e023-\U0001e024\U0001e026-\U0001e02a\U0001e800-\U0001e8c4\U0001e8d0-\U0001e8d6\U0001e900-\U0001e94a\U0001e950-\U0001e959\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d\U000e0100-\U000e01ef' - -xid_start = 'A-Z_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376-\u0377\u037b-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e-\u066f\u0671-\u06d3\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4-\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc-\u09dd\u09df-\u09e1\u09f0-\u09f1\u09fc\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0-\u0ae1\u0af9\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b5c-\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60-\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0-\u0ce1\u0cf1-\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e40-\u0e46\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065-\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae-\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5-\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fef\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a-\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7b9\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd-\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufbb1\ufbd3-\ufc5d\ufc64-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdf9\ufe71\ufe73\ufe77\ufe79\ufe7b\ufe7d\ufe7f-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc\U00010000-\U0001000b\U0001000d-\U00010026\U00010028-\U0001003a\U0001003c-\U0001003d\U0001003f-\U0001004d\U00010050-\U0001005d\U00010080-\U000100fa\U00010140-\U00010174\U00010280-\U0001029c\U000102a0-\U000102d0\U00010300-\U0001031f\U0001032d-\U0001034a\U00010350-\U00010375\U00010380-\U0001039d\U000103a0-\U000103c3\U000103c8-\U000103cf\U000103d1-\U000103d5\U00010400-\U0001049d\U000104b0-\U000104d3\U000104d8-\U000104fb\U00010500-\U00010527\U00010530-\U00010563\U00010600-\U00010736\U00010740-\U00010755\U00010760-\U00010767\U00010800-\U00010805\U00010808\U0001080a-\U00010835\U00010837-\U00010838\U0001083c\U0001083f-\U00010855\U00010860-\U00010876\U00010880-\U0001089e\U000108e0-\U000108f2\U000108f4-\U000108f5\U00010900-\U00010915\U00010920-\U00010939\U00010980-\U000109b7\U000109be-\U000109bf\U00010a00\U00010a10-\U00010a13\U00010a15-\U00010a17\U00010a19-\U00010a35\U00010a60-\U00010a7c\U00010a80-\U00010a9c\U00010ac0-\U00010ac7\U00010ac9-\U00010ae4\U00010b00-\U00010b35\U00010b40-\U00010b55\U00010b60-\U00010b72\U00010b80-\U00010b91\U00010c00-\U00010c48\U00010c80-\U00010cb2\U00010cc0-\U00010cf2\U00010d00-\U00010d23\U00010f00-\U00010f1c\U00010f27\U00010f30-\U00010f45\U00011003-\U00011037\U00011083-\U000110af\U000110d0-\U000110e8\U00011103-\U00011126\U00011144\U00011150-\U00011172\U00011176\U00011183-\U000111b2\U000111c1-\U000111c4\U000111da\U000111dc\U00011200-\U00011211\U00011213-\U0001122b\U00011280-\U00011286\U00011288\U0001128a-\U0001128d\U0001128f-\U0001129d\U0001129f-\U000112a8\U000112b0-\U000112de\U00011305-\U0001130c\U0001130f-\U00011310\U00011313-\U00011328\U0001132a-\U00011330\U00011332-\U00011333\U00011335-\U00011339\U0001133d\U00011350\U0001135d-\U00011361\U00011400-\U00011434\U00011447-\U0001144a\U00011480-\U000114af\U000114c4-\U000114c5\U000114c7\U00011580-\U000115ae\U000115d8-\U000115db\U00011600-\U0001162f\U00011644\U00011680-\U000116aa\U00011700-\U0001171a\U00011800-\U0001182b\U000118a0-\U000118df\U000118ff\U00011a00\U00011a0b-\U00011a32\U00011a3a\U00011a50\U00011a5c-\U00011a83\U00011a86-\U00011a89\U00011a9d\U00011ac0-\U00011af8\U00011c00-\U00011c08\U00011c0a-\U00011c2e\U00011c40\U00011c72-\U00011c8f\U00011d00-\U00011d06\U00011d08-\U00011d09\U00011d0b-\U00011d30\U00011d46\U00011d60-\U00011d65\U00011d67-\U00011d68\U00011d6a-\U00011d89\U00011d98\U00011ee0-\U00011ef2\U00012000-\U00012399\U00012400-\U0001246e\U00012480-\U00012543\U00013000-\U0001342e\U00014400-\U00014646\U00016800-\U00016a38\U00016a40-\U00016a5e\U00016ad0-\U00016aed\U00016b00-\U00016b2f\U00016b40-\U00016b43\U00016b63-\U00016b77\U00016b7d-\U00016b8f\U00016e40-\U00016e7f\U00016f00-\U00016f44\U00016f50\U00016f93-\U00016f9f\U00016fe0-\U00016fe1\U00017000-\U000187f1\U00018800-\U00018af2\U0001b000-\U0001b11e\U0001b170-\U0001b2fb\U0001bc00-\U0001bc6a\U0001bc70-\U0001bc7c\U0001bc80-\U0001bc88\U0001bc90-\U0001bc99\U0001d400-\U0001d454\U0001d456-\U0001d49c\U0001d49e-\U0001d49f\U0001d4a2\U0001d4a5-\U0001d4a6\U0001d4a9-\U0001d4ac\U0001d4ae-\U0001d4b9\U0001d4bb\U0001d4bd-\U0001d4c3\U0001d4c5-\U0001d505\U0001d507-\U0001d50a\U0001d50d-\U0001d514\U0001d516-\U0001d51c\U0001d51e-\U0001d539\U0001d53b-\U0001d53e\U0001d540-\U0001d544\U0001d546\U0001d54a-\U0001d550\U0001d552-\U0001d6a5\U0001d6a8-\U0001d6c0\U0001d6c2-\U0001d6da\U0001d6dc-\U0001d6fa\U0001d6fc-\U0001d714\U0001d716-\U0001d734\U0001d736-\U0001d74e\U0001d750-\U0001d76e\U0001d770-\U0001d788\U0001d78a-\U0001d7a8\U0001d7aa-\U0001d7c2\U0001d7c4-\U0001d7cb\U0001e800-\U0001e8c4\U0001e900-\U0001e943\U0001ee00-\U0001ee03\U0001ee05-\U0001ee1f\U0001ee21-\U0001ee22\U0001ee24\U0001ee27\U0001ee29-\U0001ee32\U0001ee34-\U0001ee37\U0001ee39\U0001ee3b\U0001ee42\U0001ee47\U0001ee49\U0001ee4b\U0001ee4d-\U0001ee4f\U0001ee51-\U0001ee52\U0001ee54\U0001ee57\U0001ee59\U0001ee5b\U0001ee5d\U0001ee5f\U0001ee61-\U0001ee62\U0001ee64\U0001ee67-\U0001ee6a\U0001ee6c-\U0001ee72\U0001ee74-\U0001ee77\U0001ee79-\U0001ee7c\U0001ee7e\U0001ee80-\U0001ee89\U0001ee8b-\U0001ee9b\U0001eea1-\U0001eea3\U0001eea5-\U0001eea9\U0001eeab-\U0001eebb\U00020000-\U0002a6d6\U0002a700-\U0002b734\U0002b740-\U0002b81d\U0002b820-\U0002cea1\U0002ceb0-\U0002ebe0\U0002f800-\U0002fa1d' - -cats = ['Cc', 'Cf', 'Cn', 'Co', 'Cs', 'Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Mc', 'Me', 'Mn', 'Nd', 'Nl', 'No', 'Pc', 'Pd', 'Pe', 'Pf', 'Pi', 'Po', 'Ps', 'Sc', 'Sk', 'Sm', 'So', 'Zl', 'Zp', 'Zs'] - -# Generated from unidata 11.0.0 - -def combine(*args): - return ''.join(globals()[cat] for cat in args) - - -def allexcept(*args): - newcats = cats[:] - for arg in args: - newcats.remove(arg) - return ''.join(globals()[cat] for cat in newcats) - - -def _handle_runs(char_list): # pragma: no cover - buf = [] - for c in char_list: - if len(c) == 1: - if buf and buf[-1][1] == chr(ord(c)-1): - buf[-1] = (buf[-1][0], c) - else: - buf.append((c, c)) - else: - buf.append((c, c)) - for a, b in buf: - if a == b: - yield a - else: - yield f'{a}-{b}' - - -if __name__ == '__main__': # pragma: no cover - import unicodedata - - categories = {'xid_start': [], 'xid_continue': []} - - with open(__file__, encoding='utf-8') as fp: - content = fp.read() - - header = content[:content.find('Cc =')] - footer = content[content.find("def combine("):] - - for code in range(0x110000): - c = chr(code) - cat = unicodedata.category(c) - if ord(c) == 0xdc00: - # Hack to avoid combining this combining with the preceding high - # surrogate, 0xdbff, when doing a repr. - c = '\\' + c - elif ord(c) in (0x2d, 0x5b, 0x5c, 0x5d, 0x5e): - # Escape regex metachars. - c = '\\' + c - categories.setdefault(cat, []).append(c) - # XID_START and XID_CONTINUE are special categories used for matching - # identifiers in Python 3. - if c.isidentifier(): - categories['xid_start'].append(c) - if ('a' + c).isidentifier(): - categories['xid_continue'].append(c) - - with open(__file__, 'w', encoding='utf-8') as fp: - fp.write(header) - - for cat in sorted(categories): - val = ''.join(_handle_runs(categories[cat])) - fp.write(f'{cat} = {val!a}\n\n') - - cats = sorted(categories) - cats.remove('xid_start') - cats.remove('xid_continue') - fp.write(f'cats = {cats!r}\n\n') - - fp.write(f'# Generated from unidata {unicodedata.unidata_version}\n\n') - - fp.write(footer) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py b/venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py deleted file mode 100755 index 548d9d7..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pygments/util.py +++ /dev/null @@ -1,324 +0,0 @@ -""" - pygments.util - ~~~~~~~~~~~~~ - - Utility functions. - - :copyright: Copyright 2006-present by the Pygments team, see AUTHORS. - :license: BSD, see LICENSE for details. -""" - -import re -from io import TextIOWrapper - - -split_path_re = re.compile(r'[/\\ ]') -doctype_lookup_re = re.compile(r''' - ]*> -''', re.DOTALL | re.MULTILINE | re.VERBOSE) -tag_re = re.compile(r'<(.+?)(\s.*?)?>.*?', - re.IGNORECASE | re.DOTALL | re.MULTILINE) -xml_decl_re = re.compile(r'\s*<\?xml[^>]*\?>', re.I) - - -class ClassNotFound(ValueError): - """Raised if one of the lookup functions didn't find a matching class.""" - - -class OptionError(Exception): - """ - This exception will be raised by all option processing functions if - the type or value of the argument is not correct. - """ - -def get_choice_opt(options, optname, allowed, default=None, normcase=False): - """ - If the key `optname` from the dictionary is not in the sequence - `allowed`, raise an error, otherwise return it. - """ - string = options.get(optname, default) - if normcase: - string = string.lower() - if string not in allowed: - raise OptionError('Value for option {} must be one of {}'.format(optname, ', '.join(map(str, allowed)))) - return string - - -def get_bool_opt(options, optname, default=None): - """ - Intuitively, this is `options.get(optname, default)`, but restricted to - Boolean value. The Booleans can be represented as string, in order to accept - Boolean value from the command line arguments. If the key `optname` is - present in the dictionary `options` and is not associated with a Boolean, - raise an `OptionError`. If it is absent, `default` is returned instead. - - The valid string values for ``True`` are ``1``, ``yes``, ``true`` and - ``on``, the ones for ``False`` are ``0``, ``no``, ``false`` and ``off`` - (matched case-insensitively). - """ - string = options.get(optname, default) - if isinstance(string, bool): - return string - elif isinstance(string, int): - return bool(string) - elif not isinstance(string, str): - raise OptionError(f'Invalid type {string!r} for option {optname}; use ' - '1/0, yes/no, true/false, on/off') - elif string.lower() in ('1', 'yes', 'true', 'on'): - return True - elif string.lower() in ('0', 'no', 'false', 'off'): - return False - else: - raise OptionError(f'Invalid value {string!r} for option {optname}; use ' - '1/0, yes/no, true/false, on/off') - - -def get_int_opt(options, optname, default=None): - """As :func:`get_bool_opt`, but interpret the value as an integer.""" - string = options.get(optname, default) - try: - return int(string) - except TypeError: - raise OptionError(f'Invalid type {string!r} for option {optname}; you ' - 'must give an integer value') - except ValueError: - raise OptionError(f'Invalid value {string!r} for option {optname}; you ' - 'must give an integer value') - -def get_list_opt(options, optname, default=None): - """ - If the key `optname` from the dictionary `options` is a string, - split it at whitespace and return it. If it is already a list - or a tuple, it is returned as a list. - """ - val = options.get(optname, default) - if isinstance(val, str): - return val.split() - elif isinstance(val, (list, tuple)): - return list(val) - else: - raise OptionError(f'Invalid type {val!r} for option {optname}; you ' - 'must give a list value') - - -def docstring_headline(obj): - if not obj.__doc__: - return '' - res = [] - for line in obj.__doc__.strip().splitlines(): - if line.strip(): - res.append(" " + line.strip()) - else: - break - return ''.join(res).lstrip() - - -def make_analysator(f): - """Return a static text analyser function that returns float values.""" - def text_analyse(text): - try: - rv = f(text) - except Exception: - return 0.0 - if not rv: - return 0.0 - try: - return min(1.0, max(0.0, float(rv))) - except (ValueError, TypeError): - return 0.0 - text_analyse.__doc__ = f.__doc__ - return staticmethod(text_analyse) - - -def shebang_matches(text, regex): - r"""Check if the given regular expression matches the last part of the - shebang if one exists. - - >>> from pygments.util import shebang_matches - >>> shebang_matches('#!/usr/bin/env python', r'python(2\.\d)?') - True - >>> shebang_matches('#!/usr/bin/python2.4', r'python(2\.\d)?') - True - >>> shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?') - False - >>> shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?') - False - >>> shebang_matches('#!/usr/bin/startsomethingwith python', - ... r'python(2\.\d)?') - True - - It also checks for common windows executable file extensions:: - - >>> shebang_matches('#!C:\\Python2.4\\Python.exe', r'python(2\.\d)?') - True - - Parameters (``'-f'`` or ``'--foo'`` are ignored so ``'perl'`` does - the same as ``'perl -e'``) - - Note that this method automatically searches the whole string (eg: - the regular expression is wrapped in ``'^$'``) - """ - index = text.find('\n') - if index >= 0: - first_line = text[:index].lower() - else: - first_line = text.lower() - if first_line.startswith('#!'): - try: - found = [x for x in split_path_re.split(first_line[2:].strip()) - if x and not x.startswith('-')][-1] - except IndexError: - return False - regex = re.compile(rf'^{regex}(\.(exe|cmd|bat|bin))?$', re.IGNORECASE) - if regex.search(found) is not None: - return True - return False - - -def doctype_matches(text, regex): - """Check if the doctype matches a regular expression (if present). - - Note that this method only checks the first part of a DOCTYPE. - eg: 'html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"' - """ - m = doctype_lookup_re.search(text) - if m is None: - return False - doctype = m.group(1) - return re.compile(regex, re.I).match(doctype.strip()) is not None - - -def html_doctype_matches(text): - """Check if the file looks like it has a html doctype.""" - return doctype_matches(text, r'html') - - -_looks_like_xml_cache = {} - - -def looks_like_xml(text): - """Check if a doctype exists or if we have some tags.""" - if xml_decl_re.match(text): - return True - key = hash(text) - try: - return _looks_like_xml_cache[key] - except KeyError: - m = doctype_lookup_re.search(text) - if m is not None: - return True - rv = tag_re.search(text[:1000]) is not None - _looks_like_xml_cache[key] = rv - return rv - - -def surrogatepair(c): - """Given a unicode character code with length greater than 16 bits, - return the two 16 bit surrogate pair. - """ - # From example D28 of: - # http://www.unicode.org/book/ch03.pdf - return (0xd7c0 + (c >> 10), (0xdc00 + (c & 0x3ff))) - - -def format_lines(var_name, seq, raw=False, indent_level=0): - """Formats a sequence of strings for output.""" - lines = [] - base_indent = ' ' * indent_level * 4 - inner_indent = ' ' * (indent_level + 1) * 4 - lines.append(base_indent + var_name + ' = (') - if raw: - # These should be preformatted reprs of, say, tuples. - for i in seq: - lines.append(inner_indent + i + ',') - else: - for i in seq: - # Force use of single quotes - r = repr(i + '"') - lines.append(inner_indent + r[:-2] + r[-1] + ',') - lines.append(base_indent + ')') - return '\n'.join(lines) - - -def duplicates_removed(it, already_seen=()): - """ - Returns a list with duplicates removed from the iterable `it`. - - Order is preserved. - """ - lst = [] - seen = set() - for i in it: - if i in seen or i in already_seen: - continue - lst.append(i) - seen.add(i) - return lst - - -class Future: - """Generic class to defer some work. - - Handled specially in RegexLexerMeta, to support regex string construction at - first use. - """ - def get(self): - raise NotImplementedError - - -def guess_decode(text): - """Decode *text* with guessed encoding. - - First try UTF-8; this should fail for non-UTF-8 encodings. - Then try the preferred locale encoding. - Fall back to latin-1, which always works. - """ - try: - text = text.decode('utf-8') - return text, 'utf-8' - except UnicodeDecodeError: - try: - import locale - prefencoding = locale.getpreferredencoding() - text = text.decode(prefencoding) - return text, prefencoding - except (UnicodeDecodeError, LookupError): - text = text.decode('latin1') - return text, 'latin1' - - -def guess_decode_from_terminal(text, term): - """Decode *text* coming from terminal *term*. - - First try the terminal encoding, if given. - Then try UTF-8. Then try the preferred locale encoding. - Fall back to latin-1, which always works. - """ - if getattr(term, 'encoding', None): - try: - text = text.decode(term.encoding) - except UnicodeDecodeError: - pass - else: - return text, term.encoding - return guess_decode(text) - - -def terminal_encoding(term): - """Return our best guess of encoding for the given *term*.""" - if getattr(term, 'encoding', None): - return term.encoding - import locale - return locale.getpreferredencoding() - - -class UnclosingTextIOWrapper(TextIOWrapper): - # Don't close underlying buffer on destruction. - def close(self): - self.flush() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/LICENSE deleted file mode 100755 index b0ae9db..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Thomas Kluyver - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py deleted file mode 100755 index 746b89f..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Wrappers to call pyproject.toml-based build backend hooks. -""" - -from typing import TYPE_CHECKING - -from ._impl import ( - BackendUnavailable, - BuildBackendHookCaller, - HookMissing, - UnsupportedOperation, - default_subprocess_runner, - quiet_subprocess_runner, -) - -__version__ = "1.2.0" -__all__ = [ - "BackendUnavailable", - "BackendInvalid", - "HookMissing", - "UnsupportedOperation", - "default_subprocess_runner", - "quiet_subprocess_runner", - "BuildBackendHookCaller", -] - -BackendInvalid = BackendUnavailable # Deprecated alias, previously a separate exception - -if TYPE_CHECKING: - from ._impl import SubprocessRunner - - __all__ += ["SubprocessRunner"] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 38225b606d210ee0514229b515bc8f86524b0c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 874 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py deleted file mode 100755 index d1e9d7b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_impl.py +++ /dev/null @@ -1,410 +0,0 @@ -import json -import os -import sys -import tempfile -from contextlib import contextmanager -from os.path import abspath -from os.path import join as pjoin -from subprocess import STDOUT, check_call, check_output -from typing import TYPE_CHECKING, Any, Iterator, Mapping, Optional, Sequence - -from ._in_process import _in_proc_script_path - -if TYPE_CHECKING: - from typing import Protocol - - class SubprocessRunner(Protocol): - """A protocol for the subprocess runner.""" - - def __call__( - self, - cmd: Sequence[str], - cwd: Optional[str] = None, - extra_environ: Optional[Mapping[str, str]] = None, - ) -> None: - ... - - -def write_json(obj: Mapping[str, Any], path: str, **kwargs) -> None: - with open(path, "w", encoding="utf-8") as f: - json.dump(obj, f, **kwargs) - - -def read_json(path: str) -> Mapping[str, Any]: - with open(path, encoding="utf-8") as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - - def __init__( - self, - traceback: str, - message: Optional[str] = None, - backend_name: Optional[str] = None, - backend_path: Optional[Sequence[str]] = None, - ) -> None: - # Preserving arg order for the sake of API backward compatibility. - self.backend_name = backend_name - self.backend_path = backend_path - self.traceback = traceback - super().__init__(message or "Error while importing backend") - - -class HookMissing(Exception): - """Will be raised on missing hooks (if a fallback can't be used).""" - - def __init__(self, hook_name: str) -> None: - super().__init__(hook_name) - self.hook_name = hook_name - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - - def __init__(self, traceback: str) -> None: - self.traceback = traceback - - -def default_subprocess_runner( - cmd: Sequence[str], - cwd: Optional[str] = None, - extra_environ: Optional[Mapping[str, str]] = None, -) -> None: - """The default method of calling the wrapper subprocess. - - This uses :func:`subprocess.check_call` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -def quiet_subprocess_runner( - cmd: Sequence[str], - cwd: Optional[str] = None, - extra_environ: Optional[Mapping[str, str]] = None, -) -> None: - """Call the subprocess while suppressing output. - - This uses :func:`subprocess.check_output` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) - - -def norm_and_check(source_tree: str, requested: str) -> str: - """Normalise and check a backend path. - - Ensure that the requested backend path is specified as a relative path, - and resolves to a location under the given source tree. - - Return an absolute version of the requested path. - """ - if os.path.isabs(requested): - raise ValueError("paths must be relative") - - abs_source = os.path.abspath(source_tree) - abs_requested = os.path.normpath(os.path.join(abs_source, requested)) - # We have to use commonprefix for Python 2.7 compatibility. So we - # normalise case to avoid problems because commonprefix is a character - # based comparison :-( - norm_source = os.path.normcase(abs_source) - norm_requested = os.path.normcase(abs_requested) - if os.path.commonprefix([norm_source, norm_requested]) != norm_source: - raise ValueError("paths must be inside source tree") - - return abs_requested - - -class BuildBackendHookCaller: - """A wrapper to call the build backend hooks for a source directory.""" - - def __init__( - self, - source_dir: str, - build_backend: str, - backend_path: Optional[Sequence[str]] = None, - runner: Optional["SubprocessRunner"] = None, - python_executable: Optional[str] = None, - ) -> None: - """ - :param source_dir: The source directory to invoke the build backend for - :param build_backend: The build backend spec - :param backend_path: Additional path entries for the build backend spec - :param runner: The :ref:`subprocess runner ` to use - :param python_executable: - The Python executable used to invoke the build backend - """ - if runner is None: - runner = default_subprocess_runner - - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - if backend_path: - backend_path = [norm_and_check(self.source_dir, p) for p in backend_path] - self.backend_path = backend_path - self._subprocess_runner = runner - if not python_executable: - python_executable = sys.executable - self.python_executable = python_executable - - @contextmanager - def subprocess_runner(self, runner: "SubprocessRunner") -> Iterator[None]: - """A context manager for temporarily overriding the default - :ref:`subprocess runner `. - - :param runner: The new subprocess runner to use within the context. - - .. code-block:: python - - hook_caller = BuildBackendHookCaller(...) - with hook_caller.subprocess_runner(quiet_subprocess_runner): - ... - """ - prev = self._subprocess_runner - self._subprocess_runner = runner - try: - yield - finally: - self._subprocess_runner = prev - - def _supported_features(self) -> Sequence[str]: - """Return the list of optional features supported by the backend.""" - return self._call_hook("_supported_features", {}) - - def get_requires_for_build_wheel( - self, - config_settings: Optional[Mapping[str, Any]] = None, - ) -> Sequence[str]: - """Get additional dependencies required for building a wheel. - - :param config_settings: The configuration settings for the build backend - :returns: A list of :pep:`dependency specifiers <508>`. - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook( - "get_requires_for_build_wheel", {"config_settings": config_settings} - ) - - def prepare_metadata_for_build_wheel( - self, - metadata_directory: str, - config_settings: Optional[Mapping[str, Any]] = None, - _allow_fallback: bool = True, - ) -> str: - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :param metadata_directory: The directory to write the metadata to - :param config_settings: The configuration settings for the build backend - :param _allow_fallback: - Whether to allow the fallback to building a wheel and extracting - the metadata from it. Should be passed as a keyword argument only. - - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_wheel`` hook and the dist-info extracted from - that will be returned. - """ - return self._call_hook( - "prepare_metadata_for_build_wheel", - { - "metadata_directory": abspath(metadata_directory), - "config_settings": config_settings, - "_allow_fallback": _allow_fallback, - }, - ) - - def build_wheel( - self, - wheel_directory: str, - config_settings: Optional[Mapping[str, Any]] = None, - metadata_directory: Optional[str] = None, - ) -> str: - """Build a wheel from this project. - - :param wheel_directory: The directory to write the wheel to - :param config_settings: The configuration settings for the build backend - :param metadata_directory: The directory to reuse existing metadata from - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_wheel`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_wheel`, the build backend would - not be invoked. Instead, the previously built wheel will be copied - to ``wheel_directory`` and the name of that file will be returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook( - "build_wheel", - { - "wheel_directory": abspath(wheel_directory), - "config_settings": config_settings, - "metadata_directory": metadata_directory, - }, - ) - - def get_requires_for_build_editable( - self, - config_settings: Optional[Mapping[str, Any]] = None, - ) -> Sequence[str]: - """Get additional dependencies required for building an editable wheel. - - :param config_settings: The configuration settings for the build backend - :returns: A list of :pep:`dependency specifiers <508>`. - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook( - "get_requires_for_build_editable", {"config_settings": config_settings} - ) - - def prepare_metadata_for_build_editable( - self, - metadata_directory: str, - config_settings: Optional[Mapping[str, Any]] = None, - _allow_fallback: bool = True, - ) -> Optional[str]: - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :param metadata_directory: The directory to write the metadata to - :param config_settings: The configuration settings for the build backend - :param _allow_fallback: - Whether to allow the fallback to building a wheel and extracting - the metadata from it. Should be passed as a keyword argument only. - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_editable`` hook and the dist-info - extracted from that will be returned. - """ - return self._call_hook( - "prepare_metadata_for_build_editable", - { - "metadata_directory": abspath(metadata_directory), - "config_settings": config_settings, - "_allow_fallback": _allow_fallback, - }, - ) - - def build_editable( - self, - wheel_directory: str, - config_settings: Optional[Mapping[str, Any]] = None, - metadata_directory: Optional[str] = None, - ) -> str: - """Build an editable wheel from this project. - - :param wheel_directory: The directory to write the wheel to - :param config_settings: The configuration settings for the build backend - :param metadata_directory: The directory to reuse existing metadata from - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_editable`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_editable`, the build backend - would not be invoked. Instead, the previously built wheel will be - copied to ``wheel_directory`` and the name of that file will be - returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook( - "build_editable", - { - "wheel_directory": abspath(wheel_directory), - "config_settings": config_settings, - "metadata_directory": metadata_directory, - }, - ) - - def get_requires_for_build_sdist( - self, - config_settings: Optional[Mapping[str, Any]] = None, - ) -> Sequence[str]: - """Get additional dependencies required for building an sdist. - - :returns: A list of :pep:`dependency specifiers <508>`. - """ - return self._call_hook( - "get_requires_for_build_sdist", {"config_settings": config_settings} - ) - - def build_sdist( - self, - sdist_directory: str, - config_settings: Optional[Mapping[str, Any]] = None, - ) -> str: - """Build an sdist from this project. - - :returns: - The name of the newly created sdist within ``wheel_directory``. - """ - return self._call_hook( - "build_sdist", - { - "sdist_directory": abspath(sdist_directory), - "config_settings": config_settings, - }, - ) - - def _call_hook(self, hook_name: str, kwargs: Mapping[str, Any]) -> Any: - extra_environ = {"_PYPROJECT_HOOKS_BUILD_BACKEND": self.build_backend} - - if self.backend_path: - backend_path = os.pathsep.join(self.backend_path) - extra_environ["_PYPROJECT_HOOKS_BACKEND_PATH"] = backend_path - - with tempfile.TemporaryDirectory() as td: - hook_input = {"kwargs": kwargs} - write_json(hook_input, pjoin(td, "input.json"), indent=2) - - # Run the hook in a subprocess - with _in_proc_script_path() as script: - python = self.python_executable - self._subprocess_runner( - [python, abspath(str(script)), hook_name, td], - cwd=self.source_dir, - extra_environ=extra_environ, - ) - - data = read_json(pjoin(td, "output.json")) - if data.get("unsupported"): - raise UnsupportedOperation(data.get("traceback", "")) - if data.get("no_backend"): - raise BackendUnavailable( - data.get("traceback", ""), - message=data.get("backend_error", ""), - backend_name=self.build_backend, - backend_path=self.backend_path, - ) - if data.get("hook_missing"): - raise HookMissing(data.get("missing_hook_name") or hook_name) - return data["return_val"] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py deleted file mode 100755 index 906d0ba..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -"""This is a subpackage because the directory is on sys.path for _in_process.py - -The subpackage should stay as empty as possible to avoid shadowing modules that -the backend might import. -""" - -import importlib.resources as resources - -try: - resources.files -except AttributeError: - # Python 3.8 compatibility - def _in_proc_script_path(): - return resources.path(__package__, "_in_process.py") - -else: - - def _in_proc_script_path(): - return resources.as_file( - resources.files(__package__).joinpath("_in_process.py") - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index c699d0243542ce549386cf52710c3b6a6f565a4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmZ`&O=}ZD7@qxV((T3+Ym3LB3N}cy#DW*2pv6mt_RwD1%d**>b~j(M%uHI-Ln+vk z^e7gDf?kx;Kj6*KV>o|g7)>zyYjq> z&=1+^H@!zLmVg`~A8jCC@zttQQ#VuvjU%F#wSKUIeC+^j=)Ss&?jT~^MJxqlx*S_a za&!m1)Yj3Ck~4NcuLU8;@VJ;aN|EbT+%1Aj#B&>*U=a}Phm3fFvZjopb(+X)h~wKx@RVxy+;X65XN;wi`wEHmPsh)v#noO%c%g zLcUP2c__$yZ!2y`VPrcH=2Hei;8YpBbOK5%+#V{=cAygq#{m=LTm1=#dn}9u6ea?e zfjVx&%NGFl(RucEJB!b)>BE)d7iZR7+nW1k6~0)7)`Mqf)?(XQ{H3Xr=5GYhLF%~4 zCScu&T~gS@u7^ObwQERz5FHFV9hkO?n4HaNOgbOyNu6n+O#VqpLS{)OYfnHDJ`Io@ z;BfD_(z^fXEL&`6i>-7qS&3NI#y6e{!NO8Qkmrn1 z_D|}|bn)swKVeg_MBXa?3ZSDYiqcVaMeiU97E(mT-o1WD^D6`rhz@`~l diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc deleted file mode 100755 index 09451da871d212f6303a3f0f523000cbfdbd620e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17468 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 (3, 8): - - def find_distributions(self, context=None): - # Delayed import: Python 3.7 does not contain importlib.metadata - from importlib.metadata import DistributionFinder, MetadataPathFinder - - context = DistributionFinder.Context(path=self.backend_path) - return MetadataPathFinder.find_distributions(context=context) - - -def _supported_features(): - """Return the list of options features supported by the backend. - - Returns a list of strings. - The only possible value is 'build_editable'. - """ - backend = _build_backend() - features = [] - if hasattr(backend, "build_editable"): - features.append("build_editable") - return features - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def get_requires_for_build_editable(config_settings): - """Invoke the optional get_requires_for_build_editable hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_editable - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel( - metadata_directory, config_settings, _allow_fallback -): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined, - unless _allow_fallback is False in which case HookMissing is raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - if not _allow_fallback: - raise HookMissing() - else: - return hook(metadata_directory, config_settings) - # fallback to build_wheel outside the try block to avoid exception chaining - # which can be confusing to users and is not relevant - whl_basename = backend.build_wheel(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel( - whl_basename, metadata_directory, config_settings - ) - - -def prepare_metadata_for_build_editable( - metadata_directory, config_settings, _allow_fallback -): - """Invoke optional prepare_metadata_for_build_editable - - Implements a fallback by building an editable wheel if the hook isn't - defined, unless _allow_fallback is False in which case HookMissing is - raised. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_editable - except AttributeError: - if not _allow_fallback: - raise HookMissing() - try: - build_hook = backend.build_editable - except AttributeError: - raise HookMissing(hook_name="build_editable") - else: - whl_basename = build_hook(metadata_directory, config_settings) - return _get_wheel_metadata_from_wheel( - whl_basename, metadata_directory, config_settings - ) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = "PYPROJECT_HOOKS_ALREADY_BUILT_WHEEL" - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r"[^/\\]+-[^/\\]+\.dist-info/", path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel(whl_basename, metadata_directory, config_settings): - """Extract the metadata from a wheel. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), "wb"): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split("/")[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook.""" - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, "*.whl")) - if not whl_files: - print("Found wheel built marker, but no .whl files") - return None - if len(whl_files) > 1: - print( - "Found multiple .whl files; unspecified behaviour. " - "Will call build_wheel." - ) - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel( - wheel_directory, config_settings, metadata_directory - ) - - -def build_editable(wheel_directory, config_settings, metadata_directory=None): - """Invoke the optional build_editable hook. - - If a wheel was already built in the - prepare_metadata_for_build_editable fallback, this - will copy it rather than rebuilding the wheel. - """ - backend = _build_backend() - try: - hook = backend.build_editable - except AttributeError: - raise HookMissing() - else: - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return hook(wheel_directory, config_settings, metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - - def __init__(self, traceback): - self.traceback = traceback - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, "UnsupportedOperation", _DummyException): - raise GotUnsupportedOperation(traceback.format_exc()) - - -HOOK_NAMES = { - "get_requires_for_build_wheel", - "prepare_metadata_for_build_wheel", - "build_wheel", - "get_requires_for_build_editable", - "prepare_metadata_for_build_editable", - "build_editable", - "get_requires_for_build_sdist", - "build_sdist", - "_supported_features", -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - - # Remove the parent directory from sys.path to avoid polluting the backend - # import namespace with this directory. - here = os.path.dirname(__file__) - if here in sys.path: - sys.path.remove(here) - - hook = globals()[hook_name] - - hook_input = read_json(pjoin(control_dir, "input.json")) - - json_out = {"unsupported": False, "return_val": None} - try: - json_out["return_val"] = hook(**hook_input["kwargs"]) - except BackendUnavailable as e: - json_out["no_backend"] = True - json_out["traceback"] = e.traceback - json_out["backend_error"] = e.message - except GotUnsupportedOperation as e: - json_out["unsupported"] = True - json_out["traceback"] = e.traceback - except HookMissing as e: - json_out["hook_missing"] = True - json_out["missing_hook_name"] = e.hook_name or hook_name - - write_json(json_out, pjoin(control_dir, "output.json"), indent=2) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/py.typed b/venv/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/requests/LICENSE deleted file mode 100755 index 67db858..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/LICENSE +++ /dev/null @@ -1,175 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py deleted file mode 100755 index 22d2c42..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,214 +0,0 @@ -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. -Basic GET usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> b'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key1": "value1", - "key2": "value2" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at . - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -from __future__ import annotations - -import warnings - -from pip._vendor import urllib3 - -from .exceptions import RequestsDependencyWarning - -charset_normalizer_version = None -chardet_version = None - - -def check_compatibility( - urllib3_version: str, - chardet_version: str | None, - charset_normalizer_version: str | None, -) -> None: - urllib3_version_list = urllib3_version.split(".")[:3] - assert urllib3_version_list != ["dev"] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version_list) == 2: - urllib3_version_list.append("0") - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version_list # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1 - assert major >= 1 - if major == 1: - assert minor >= 21 - - # Check charset_normalizer for compatibility. - if chardet_version: - major, minor, patch = chardet_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet_version >= 3.0.2, < 8.0.0 - assert (3, 0, 2) <= (major, minor, patch) < (8, 0, 0) - elif charset_normalizer_version: - major, minor, patch = charset_normalizer_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # charset_normalizer >= 2.0.0 < 4.0.0 - assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) - else: - # pip does not need or use character detection - pass - - -def _check_cryptography(cryptography_version: str) -> None: - # cryptography < 1.3.4 - try: - cryptography_version_list = list(map(int, cryptography_version.split("."))) - except ValueError: - return - - if cryptography_version_list < [1, 3, 4]: - warning = f"Old version of cryptography ({cryptography_version_list}) may cause slowdown." - warnings.warn(warning, RequestsDependencyWarning) - - -# Check imported dependencies for compatibility. -try: - check_compatibility( - urllib3.__version__, # type: ignore[reportPrivateImportUsage] - chardet_version, # type: ignore[reportUnknownArgumentType] - charset_normalizer_version, - ) -except (AssertionError, ValueError): - warnings.warn( - f"urllib3 ({urllib3.__version__}) or chardet " # type: ignore[reportPrivateImportUsage] - f"({chardet_version})/charset_normalizer ({charset_normalizer_version}) " - "doesn't match a supported version!", - RequestsDependencyWarning, - ) - -# Attempt to enable urllib3's fallback for SNI support -# if the standard library doesn't support SNI or the -# 'ssl' library isn't available. -try: - # Note: This logic prevents upgrading cryptography on Windows, if imported - # as part of pip. - from pip._internal.utils.compat import WINDOWS - if not WINDOWS: - raise ImportError("pip internals: don't import cryptography on Windows") - try: - import ssl - except ImportError: - ssl = None - - if not getattr(ssl, "HAS_SNI", False): - from pip._vendor.urllib3.contrib import pyopenssl - - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import ( # type: ignore[reportMissingImports] - __version__ as cryptography_version, # type: ignore[reportUnknownVariableType] - ) - - _check_cryptography(cryptography_version) # type: ignore[reportUnknownArgumentType] -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning - -warnings.simplefilter("ignore", DependencyWarning) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -from . import packages, utils -from .__version__ import ( - __author__, - __author_email__, - __build__, - __cake__, - __copyright__, - __description__, - __license__, - __title__, - __url__, - __version__, -) -from .api import delete, get, head, options, patch, post, put, request -from .exceptions import ( - ConnectionError, - ConnectTimeout, - FileModeWarning, - HTTPError, - JSONDecodeError, - ReadTimeout, - RequestException, - Timeout, - TooManyRedirects, - URLRequired, -) -from .models import PreparedRequest, Request, Response -from .sessions import Session, session -from .status_codes import codes - -__all__ = ( - "ConnectionError", - "ConnectTimeout", - "HTTPError", - "JSONDecodeError", - "PreparedRequest", - "ReadTimeout", - "Request", - "RequestException", - "Response", - "Session", - "Timeout", - "TooManyRedirects", - "URLRequired", - "codes", - "delete", - "get", - "head", - "options", - "packages", - "patch", - "post", - "put", - "request", - "session", - "utils", -) - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index a32fb60c348ca3ad620ae42a3f7258c3b4931cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6587 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc deleted file mode 100755 index ef4d67cf79c4f22a9b6b04546ad63e67e84aad69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 584 zcmY*WL2DC16rN4mWV7j}!4?A|xEH}tx?_``L`ua=QIMiNjfY{oGiJx^?yNJjf$VAj zfH$EaLXYZA@Q-+sB}e@Of!=!ZZEK3Yftm07-n=*Oz4`3A4g&l6;p5xy7DB&kvNGUT zcHzTuh8QAis(y~vnMKf-u*)mJ=VCgMzn+845Djr{SxKN5}o1}fa=JWaWY zyq8>OY|Ex)SxX1G xgR)cI+9@|HXQymez1wBC+Smroy<0lf)`K6YU-j;Q*dLZ|)xBTZ^-?`Z@dp%ezh(dc diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc deleted file mode 100755 index 0bad1ddf522a2f0cfc01de69b767271026e4511f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2262 zcma)6O=ufO6rSDHpI5SEyHP@%I2l^UiTWcoHKAY<2PbixnC1t|DUITIv)Ub7>qxum z%*c+6Q$onWUX3MQw%SxHW;q|lM}&CGk> zdo%OiH}hj}uZp1k@$Gkup%6lUiAkr0+k+Q>!{8w@Q4X1sDHo-jWGZH$D3_F+A|V+O zX)(}oGJ{Vfgr36JYPn#SJ=A3nb=kvR_HdUy(q)g35Q)soxgHWEVdzy7B`S%L9!t*k znti4iM_1r1W|YLt7>Uh?%-*}fT-=QN^Td3>Oxz9R`b;^CQvEAGtCW0QA&j%MX4#xj zTQ6!AZWWpO&5ow3m#DL3nS^0sws;lKS8Rh@j?FMH=p5^mU;}2A5;1WnRRD(gI@J{M`e@Lc3O zC3(?&#VT^k))=R30CaO#=f-B)H6iJ&eeM0(+{(b4I@T|sv)QY29n|U^Ap74?c|n~S zmgR*YzGW|X5n>yTDMlemc!k=A43RobkV1j)#dQ!55#J^SLaT_shI|6!r`vO?tfE`8 zom@qaw{;L;yRAw)DR4_(6{V9_e*fHBA~x1>Yj@bmFA{@)h$&gnsaYh9VP_umYMBU~ z*e(MwC1pw&vAHfv2M85I^9$IHW7#kz*apB7=>%_u>6{w6PwTC6>vc*W+cT6dsYB9@ZT(=EEMJm0JzW_-o z6s{_w;(mIHQ{hY`8TR~A%M_dv$&_?zIGHJD!5Piy<#Gm+vXm)W`AoUW3ywXSK6*66 zEKWWu>&6Xzfv`;3DrYo+nGVf#=%4ALf4W@t`naRD(jXWHb*FJydJsM~3gR~UM@5l= z2P5BqPz#UL!y`?k1VIJwVFH&j8GhX8e z+UCz4!2EyyFnJ2yk$Qk*Z|9HM#UBZYtN$M2BCG8-jA%eYSCFY>(K5QJTtUlHDzNg) z83GrwWZ48;^H4qu3ck$<$A()A_nqrdwswV$f=+bpE5jMM;ndcg{T49f&*F zC=laD8lSH)j`O4g@FNIz3bxq}$Cvzq;!p5(2zb54oG~h>IfnC&Q}i8Z5Dqo-St>xq zTkk0V^+G;zi8pY$b%sfCkI5vZ4oyk44{%IW0@GgM($_wzW--lw0B91_hXv{@5K#6w zitT<-_(7>fhwIT{H_-k!wL7(G+Rm0zWC1-2&6lIr)unr1qNrg<_YUa0jLwk}CnOspdD z2DL9IzBqSAJ3BdXW^!7)FmZlTo1WB8U74Bm_P*VgotgIb?KDA*%dh;pVs0CSMR-rqzpU*&{R@l1RD?Ond|^>3CJ5LNWE{S%@IK>7uF8982Z%u11r z(_zqwN--HEBujwa}uhDTlUK=`59|F|i=HRG%?4rB( zl8bgX_8oISopuMaF50sh=y9X(HUeR{=U_9aBxM)%H)E=lXd)2n*~iBoUG<00PW#<& YhTnCI!I+d>XH5j%WA1nVDf}G$3m4gG_y7O^ diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_types.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/_types.cpython-311.pyc deleted file mode 100755 index 1016cce7b0e903ca16268c2361d7d78fd8061c67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8724 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 Bn{NOB diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc deleted file mode 100755 index 0404ea0d8905135e74b456a48d50377570f5b251..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31813 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 HkXrZ;mAi8} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc deleted file mode 100755 index 30803b6be511525501c18471da967c341780b3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17156 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc deleted file mode 100755 index a7072deb32f688d4ff9c56c86f64e19a11fec49a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 730 zcmY*XPixdb6rXIeT1R^l!Fqa^wJxj)rB@L|6qLFLt(RWHZ02P%HknB$lhySgD|lGJ zV?po(RHWa)Pf`CJjqWDd!Zl z!s(6`J`zs$2={m=_lnM5$0O)-f4}2=^tBGbz;frvYRAsh(2+$vw!9*b@Zed){ciox znyJQv8Y@$U32IZ(H~$f(yP2q6>`^b+a&$trrY-x-6nRi7RLn>GLDD+?&4w`bCtyL z;%X_%FrJ{~N;lKCqtd<&bpDbRXnne+7Sennrw;J!d6cOFqk`!~MUT~3ZAYvuBMUK! zaxsd^smYYw4!5?VN*KJ|mR3bJQ`BaP&KDdt3l7Wa+1j1eLhtG;Hj8^3)f0Oxeb4ij z7pNC3i94Tc?6r1J F`Y*&`;zR%d diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc deleted file mode 100755 index 921409e82e270bb109a6f8898f7af55745c9350b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2441 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc deleted file mode 100755 index 8a811ed9fdad9e9be02e1c6f61d3c388841d334f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4436 zcmb7H%WoUU8J~UdO}!{llw@04Jz|=YMLJb%3AW+JsV&EfED4tFAiNMO?n+vT++}B% zlBrSvQ~01m3Zy^+8%YcZMe4Y93+T{8fEFnFAFKqX*e)PIK;eULEL;PEPyJ?hNs)?! zCbP5i*!kvr&FpW!`KGDKk0AZ?voBUctqA>_bgGGU8ZRr*c!&g)L;@wy87fIxHJzlb znn^NN%_do>nT#vzPP!>V%Vs=TZ_;bEUC{O=eb9Cbo{T>mNCu%zC!64H_7Q4trX|~& zY_+KAOk1+e;u=bZLhF>^dw`N1f?o`aouYe@ z?yg#a7HJ{yfK5h(AW(FP-9pnUO$Kq0Mq<|!Xg#aZ68`hn8*AQ(-cp2oM�ptnrd8 z$xGZqeu=|kPQetI zSd|nxm4dD>S5R`Itg4xGO+GYS@G|he+=ginkwzvvX{FX~)Or&Y!GDfb9St)qOUd+O zGbs5n%%Pn*yymXTKxn19?r4)P(knzCD}9Ls2KqHhr|&r$f9%?%-ppymTcr}%Rbm~& zrv=xxullvVF8*I0OY{@)#Iu?=HYxc6SmXYQ9ykeeJU?*`EqFJnA}Ydu`wDhS%+LP| z)VM8bc`S20CrD|HTbHzDPFohaxq`N=$efhTWyGuqn@EGT=XhD*oP7}Y`#DH+SXq+< zky}uli87xREjq%*q2-jtA7*N?N#`*JDVYL?^D^14ac)wdnEWbAghwxOQHM5qmWw(nkgxX4=%%Ckon=Yo7V~o2GHqSKt17o3 zs#?7;V(?sHu5gi)WG=^JO-ko8JU&ar=diNCFJuaqY(WuKISM)f8*UL)pRyeYt(#bp zZQa4BJZLKdvo#PTE!kdGmz8`*0NI?N$fCtgQ*2I3Ub8%xR=_{7KI$@`6RYk_E8ut{ z3zkY1xm;Ytzv->=Hp4l~u2kd3Fq@sv&J>eT3#!?cE943_+>qo&#dKx)6$L{j$##{-iW$UW zM&wl}*2Ij-t|*cmW6b7bB03xURlX)mq^RV_gzfnHPGVWfiis?b(@J7WSyILld@h$* z6Xmr809wM<6L!Me302a>(Hx&%<(EV?k&|)>;3*3VPGIquc~~DcL4Y!zE0`_E?8O5h zt`}aF0B8xl>O`Hrqv_=2iUXEQU$3Deb8Uaj#Y&KjH z#N+G2nK&Sp8}LRGv!=&^65Iyda61$;n5Az~5~%|cK#KR=C0;9+_QjUZ}f=ncfd zG%n;cWeM}S%R^?Zn1Hj)@1^$!; z-|fdR*!mcBVnv%I@_l3NfuQ3Ky9WnGbtx<+ZT0@JNqi(0wVHUC=+|GorH*qvO=$^>W|O z^!BmRw9$9w>5$%=(Ag8l$U8fNK76S(z3=I+Aj&mE8G~oPi@#frPwNA>bZ_6jreF3PX3hbv9h_+C%SbpW1<;v2yzu47IsS zH-UX9Ty7gFO@Yxn8~XUI?W8_1=H&Uidgr~;Ea(*;FnUIf&bRhY3_ZQ3pE$QaH1bs2 zo;AXQMtdL0z2}Xtn9X8uZDX425F zCGuYq)OxuHMdNKktDzah{BYvfNvp;4$L|c}Hufi`5eFONa5zm^z#P{`Yz~e$tuUIy zl5EFb@bdqlSEdPU?->Kz({+KCmQ!kXk+nck3u*_?t_f3hSlX4fed=m@7f#>Vn_j&ITJQ z&DhUjr3rZfP#CJ~s4!YPN;i$>Q0a!z9w|+er{Vz$K$A-76m^5Dpt|y1YJzfa37?KV zVm_VtM6Mv{9xv7?nwqGfTH!}*aBE|a>DHNUgY}lKeLVSKvSd9K2C+TxS#1Ho?zn%B O{vNp6#QY;jLHR!?&3fYi diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc deleted file mode 100755 index 98f3288ba74e0351683a8bfc30940f06d162f56a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1883 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc deleted file mode 100755 index 45ae0c7fb2945cc8d1c4583f23c117c7742bd972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcmah}O>5LZ7@mCWX1}+t)vnY^Td`1zo7QcmVC%uv`q2-B9@Nz~#GPrIn%%@CTkW2< zpb(@75y9dIE*@&7f54yM!9yZJLQaAwZwp?eCuepWx{Hc4lgZ?H-+7;Bo`k%Q$0Go@ zug_nu_OSqbCl7uL?k|3_GypFE1dx(J9zYs0GF7DWGzB1g5iG3d85lrJ1*hk6DheQW zn*v}LU(JTG;5J_F`T#)81YTpDLtr)J!|l6p<>`DFg%NuX^8=u#QMlGn>*xD-#KIt9 zZ{M#Cp)h8M!azF?smJs&e=EqxS{0!1L8KLj9EuSJqIz>?vx4Z2GNM=GewlpYzh@B| zXG#3`EQwbD2H()_nzhMRHLWW1NtA4j!4L|+0&i%d6#LcTD{Q@^1PpIuPj?%>k_guJ z&nlaXkebKuejW@)evst3ALPvrQXW@W5jBX6LE7WWnk-9qvmPtKl30nUlA00LPzfqp zW{=8LPP76Vx?e`Rp=VUFa8F!DdZv>46Vveb2nG*%jJ~dW!Gcm$MWcav-2OhVqsf4v z;3E-1kcz6J8G_&iWu+j>y2r|rZg^Z#fn^!#9)lNNL^nju&>u*~ipR*PKPkjs6XETkWGB0UamnAVe)v&AEEn?K-u?*^euB@oDADP(R)c{=c9(wyANy`6hGx3jb}LArf> z+&MmOPP*MEUZ1P!PWO;G7)RVaKv=>d1?sXG2>{HOWp5JE>ta_t(5% R^(0`su&O$HK(CQM#c%KUTND5Q diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc deleted file mode 100755 index 0ee56555b391ba7ffb0cedb3a93fc17fb2bca688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33936 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 VVxN9o7~#0bWdaGYfx{M*{|k%H5byv1 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc deleted file mode 100755 index cba5595e78f5fdc71a248808b46ab9dfcc62b7ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6450 zcmaJ_X>c6Jb)MM+3oI4~34kOhfgJG=2#Uml1Q}5zLrWG9NE8o=ha?^v47PiLCU<96 zGqWH8ffnR2F{Q}1BAO;dNfzz0Wjc~8{+lZ2N0Lfa?tm#)qM9mIx$Hl|zpi4GC`={J z*ZuZ_C}jYAGv9l!ulKrNcjKpRZD|9~zkKh;x!-mg#%~mAW?Y#R6qn*m;8-vGYKW`VD z`vc&&*cIUG>K`PmsT+4Ne(B(bf8aaOas1<}xSPpoQ4m~TJ;KH}ua*_KY=M+!^^=`79T#g5U7%Om# z3)uLUgUZ9u7h~lRb)hNA(XS{p7;>lNg<899%Z{(GI^BQ9 z%U0^zIy96{AM=WwMrutsliVtn3!y--$x#@+%d9akoUqEJ68AT2Uhpp9Gv@@{n&f_f zVZ#ggG<;KWuj6yeDJU~GXzhoCIJsg|HClt-`O(ojJ91DlG?lJI6MAO~Aw?zVobU6X zt$O0o#bIx-^;g&pOb)x` zd!d)}3c*5N>0(hD5*=}Oe7co8eqm}e48veyyi$K|g6GbcJjfQNsYs^m3p?~YyWqLw zQFkSpcB6FRua#*kih1Xwgc@Dcgu&Th&Gd#ue~o({n~oz&Te*p2 zSpPs3w!!Z_tV*M#rVIZ_%8rubhr%h;)TxSK;h&U2BFgBgWYY?ZI;s<^Drl{%Mby4X zD;DOdPn}KyV`gdG)XkI%3+kMe290beU%XM1(mXIkRUPc zxm>(Uq@%#y@o=Knuy~KE?J6M?BM%APt-K=&@KvT!DBdT_71a)?zJ*hi8ytU}M@uSe ztS%BipfWwxGPSg!3ixf9@!|tz5|5UZ-2i!5F9o}Z2s(B+RYIlr$)j{#EpAfj)s+UY z9(>0g=Q>IOd>rJ3ib7O%Th$=y`BFRaLsg#{E#((W*qJCu@lTw znRg+uk>3%4O2+rGV@6Bv6N$g1@_k4&lUN`+Zpa>XfsdmkvUz}RL~VOv*b9o)ClkB>cl;&X!)e$3kRci3V~<4eB8sXigTs-Z_;-QtoeLiJpcSx=G;u9 z0gf17YK|c2b2L^9j?9Q;LLIZCq^3Dc@Y<8Ympa$nRqOFv@#{udQyGTJQ};iMF93Uu zvuDrX?0?C)WX_miCoaXpWW7|_RR5ld%@`k|wU1Pb`Z0}}*v;ydvMSVXW-h*%1RK7( z)|(CO)hk)t&-+_`^W>W^u~?X?mtgU*z0UFpmbjdFBOc-kTzy{K)5us-oi|zXW=mDy z_`VX)o2=<_bJ$atHhOpQ`1Tr$`@2}H+Hp->wVRoN>sIRUK$s!e#QXk-#V#8m0$6=!jQZ{G|L@c#lf`F@88aW7Mv&31#Np}K zCTmeARBVUwcXtiopkbmTGsf98ilX4V_~*g<@sq}N(=^^}WhSbKO~*z@5C2Rp{n+48 zWV(Usnq}QPlbyiLC|h*=oR@vt8~28@xJ_m!xjUIHh_P&G3I`o`cyP;>Y=8^j=8}^; zkA)dzOQMv;`bWz2v(+q~ZCoCMrKx)@yT`eU?bF{gy&mT{5f1J~zC{MuGswJLoz%?A z=vA;0@Nf8;HRgMF;rG^(xs7u#;}1V1X~es*Hl~|5TI<rn>nM58On-U22BExW)*{w%$&4AV$7a5;Dl4(;)U(n& z?7xjt19AT@$&*DZ)=UeMuZ=dV_p!Y^^qdWg>*8f9@ zg6#I1kvqWNkvqL3x0^@in@4`twnV0kWM=lj>;dic!voF!k1<~5V85J03gUsUqOD`0 zeeeHB={s!Oak1^|vuOZdD|hMHqU+I~yw|)Nce!$b@A1|DmsBbXegI#~xM`X)w$w~W zqXrucbM3sbrtw!Mo;B04UnNpk`eagl$|fV(Jm2z=Olj7v*~79$vozS1)v{HSj8<)t zZJM=fHX=JT>r{ph$|agCRisaLY0|Cj_R1d3mMPV0xm=SKTD4a8YPM3de))iA4{CNu z_Gz|CvsH4nW)>J4dq|UY71esp9@Z=?`!zE(Zcyec<$xv|wZUrnh-RBKTPZhdHmD3& z$*d+r71b8awrch@Ijq?>Fih2SliaTP$}~DUJXfBT8N%Jg!x}@&u_)QprB~ zJn#bbD{rlu@7-~`cgLOH9ka>V>9^Kies$j1f#2K44%yUcHc6uf4;yCFZ1T0# M<bt7Y(#lW! zJGc6)>;}SU%jI)#-E+>p_k7%Q&%OO`ZEX<&&mV7nbopS1ApDs=s!xko5g+~ymD_?L zqy$4Wq^y{eQj$pZKsJyIrh>d4%!YE|R5;g?YRSndnYV?qt+_}ll8dIIxmYTeYfH7E zJ#4gO+jB}v5d}#wV}^W36ok+5?>(sw-rBmQ^)X3!MKB^a1S4uH<_@!CT6&_&BA8LL zqyBX#i2m?j=`YSXW8iEvJGXM)34j*=722If`+1>HS$HGD%y;HY+p&|j!{*Y?95e06 zueU#u$cXOfYMn@RW_3p`Sl3LZ{=C{p#E7JmTvr& zbckNtU!QZRmkOsF&@N24k~Wg|g!EuVX7M4z_ie!xQX(uY{Q`DP1q{gy8iCWmv{V-L!h(QEt! zWt-7wJcY8|2tvn)-1x9=o1=N#%-b0!bJZjz=zqk#hSW4LM>2JkIyq?oJ2`nIo4I1D z*3@M)?Ia@+70+m{kTr8=-mz6Zn^kkBGiw>B=MB{=K%HFIsx{4tCnx>7nVeL0TfJt2 z5hab0urXNLD$Gw#Ce@*=ZE?N=v#w?glWvu|>;zake6-%H<^BA;Bt2dg7VEnX)zBHqEZ3`9s9kpJ z5|==oz$(aQ(%hN@mu)Mb@RRDp!!Q4Af=HXus%p17!R9BuKxQIPEFjcSfel*PJ%*dLyr%|}WtaXjMgh!#~^_;0*gR@#JGn2`~<>%pI7J^81 zJ$N33NqRxag2~{ha|J_pO!5zs>YX_~n{no0@mxV?8R(Ns+^}HClV`9h^PXe#s5Yx# zg?ke(^~e_jd70f`lX%JmO$H;t1?KXGIi1PV#7N}}`x=7XMa&Icb5N~UMToj|$qj2< zlyNtR$?BWOD-orcCR^D{OSFY)7#%ApZUvAhli5nzTTJmBahateI zAczlthRSWhsck@la0e})b0PwZf>y&Vic3;PxGqX)yUQJfYt!lLwh@n1!3aKd@v zGjY5xz-SL*I{@6Ur+&ovplxQSS)4FC0c?uH(9ULRVAjf+138_gt${IX#yU0tmmh!u zt`1}~Qv-#0#I^jfWqtb5_ z+M7txjJEyHBu~pB?vhaa9yGGO1oi<`b!U_+irDu9ED0N7 zp{Mum&b8BA1H-pRe>?jAxm)K-vRdRXdkSPe4{QGc|M^_0dC>ve3N(m0Eu zPu2|p;cMdB1g#Mag3%`ZED7sM{N}G#k9~Ubqmv(=`uJ2?N!%67%Auls z=zBzb9;|vD;L5|TfP%+3kLFCH2)cQ+E zeqFpSEs7U}+lVDMBXuVi5Iv;iQCFr!!JsuJYChNAY&|`LbSe*EDa3$JEh|EZ!9Kl&s$kTvr>h_K@{nFbkJGz~b!iapI$%8{eQM3H_;_)6Ka za{Sh*lCrm~>@CWBJ%4+m=5JfKt>#kv|N7oS@-@nv$rkv}AyMpCr{)|aEzT^@nt9+P zzw(kj-<*OFi@WMkRBEpJSlv|@B}1r(r)jC;x;qS!{GLauah3!#BJ%(WSLVZ!2ZsUR zJw7*P&wys(nP%GNd|vL|#D~YhXVWCBK0HxWCQ64+-#zigg_W+=pRVou_++u82aQ`^ zpErlNhPJsuv|;S#+eQNc1^kLbKj5Q%8T_y4{lPcy4Zc|#JYOC>PZLun%D~AJoeCE}K8FnKXyL#GTbR)qY1902NEvI(yGY#a6 zIJ&VxpsKt75RpZ=QZ+*QTnve(X1;?py}Oy0c{oZ7?Oy_5Nk@0Cn4i2=iuRPFJsU!x zb^lk#&VD&pI`(?`*z3z<%VS^1_Z4INzEO5HPJXlf^*ggN__!p7; zN6+3ndbV`*)$-9-ONU3xhez)zqeXet3l3dPW^s`+;%)1YI{^9l76)jEaBDTwgRJ&^ zpUJAq4shLiQ4kAW*tQ0ObS_?KHrpg&{sBBTWkD1K_pcrQ{i*xi&)(~Pw$%Mxx%;`2 za-yu9D9R_e%s$D;0l8%Vh>Bk_2kq4d?)al+^E+oM>2Db72L8J=3t#XjU|>;l>L}{Rui@Jp_6Q z&}Pk^C2*3!AOYG-8AVV=j?Om@Pkof0dM-*afD~xAW20Vb_}h@WLh^<{;J6S<7K2Cd zmV!q%WZ|qhCT@h}(18u13Fr)jj$&o|Ktv23-VppCEQSyP`~Yn)iPX3SqFtrtMi7=l zzX0tvD2GFsp0Ew>5JM-ak4Aug6V%oec&Z`=rSV^Tf?iF0_)n<(GZxu*UHBP0jmMXT zY0+r8(S|F(T}CUe?7~Ku5kuL6vJItdwu0^nTnC2yfh83IW;b06Zfyts9-|Z2h>>OC zT`?6!YVf2RdCjt}%oRoupBJ7Wh`@|$cck}LZ-BjpF5Qqlhr31Y&D9Nux3_9q8h3X#&X^RqRCS4; z#W>+Yye@6+%x!{-=iUE{+_$p}XUo>FJKVD1H+1)BHw+IyS|`!k$FM&D2?3s^u+JcW_~gxH#A_K#w$=j$EnddJuYBdeY7kKGz8cP5G*V|c$D_DaBS0#dyFTLA!ZrLCP?!KZXu z`&{WKQ1Ktqn;&Ku@l$|5i>z#%*a~P-xdBMAO==#|w@XXuw5DAJTjhQM7bzW`H?QAU z)O(7$7GE<;%HgtdxF{dyQ+Hc%ZK%&>9pAMP;=CtAn9EQ*74z-kv&I{rX&Q+5s?S98b~5!&7ZL|CJh^)>dE4TbyrF>(2?CCon;PXCXYh zn4(Xfir_9-;I87fRf2dLKMQFZf@BIPekCyIMRVF@7=cMb{5Jricl~cY*j)^EKM1xh zjV_J8H@Xp&LVIY-{~jQVp+4Hu8$nnOVMY4^(v*HmQyM`;2)C~XM~c<=n*bVayp5&@ zp|`{PcV3Kvb?{Tg{O8chg=m$}xbL97KG;L+G_{ocY)Z};G zuF}ww)Th#nj**O(E*?cd5Bfk__55<<=TAq0C(v3??(nfex6p_v~hpWlE@w@4} xUFF@+eDTU3hX3=mZ#dz%jpT1j`$gDuJ6P#lNv|GTnZ5PYH-!DR2?{{hp7Zu|fM diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc deleted file mode 100755 index 3fd1a76e9734b32c6251a1b2c243142ed04e31f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44893 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py deleted file mode 100755 index fea814e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = "requests" -__description__ = "Python HTTP for Humans." -__url__ = "https://requests.readthedocs.io" -__version__ = "2.34.2" -__build__ = 0x023402 -__author__ = "Kenneth Reitz" -__author_email__ = "me@kennethreitz.org" -__license__ = "Apache-2.0" -__copyright__ = "Copyright Kenneth Reitz" -__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py deleted file mode 100755 index 0466a7d..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" - -import re - -from .compat import builtin_str - -_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*\Z") -_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*\Z") -_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*\Z|^\Z") -_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*\Z|^\Z") - -_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) -_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) -HEADER_VALIDATORS = { - bytes: _HEADER_VALIDATORS_BYTE, - str: _HEADER_VALIDATORS_STR, -} - - -def to_native_string(string: str | bytes, encoding: str = "ascii") -> str: - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string: str) -> bool: - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode("ascii") - return True - except UnicodeEncodeError: - return False diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/_types.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/_types.py deleted file mode 100755 index b2273d6..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/_types.py +++ /dev/null @@ -1,183 +0,0 @@ -""" -requests._types -~~~~~~~~~~~~~~~ - -This module contains type aliases used internally by the Requests library. -These types are not part of the public API and must not be relied upon -by external code. -""" - -from __future__ import annotations - -from collections.abc import Callable, Iterable, Mapping, MutableMapping, Sequence -from typing import ( - TYPE_CHECKING, - Any, - Protocol, - TypeAlias, - TypeVar, - runtime_checkable, -) - -_T_co = TypeVar("_T_co", covariant=True) -_KT_co = TypeVar("_KT_co", covariant=True) -_VT_co = TypeVar("_VT_co", covariant=True) - - -@runtime_checkable -class SupportsRead(Protocol[_T_co]): - def read(self, length: int = ..., /) -> _T_co: ... - - -@runtime_checkable -class SupportsItems(Protocol[_KT_co, _VT_co]): - def items(self) -> Iterable[tuple[_KT_co, _VT_co]]: ... - - -# These are needed at runtime for default_hooks() return type -HookType: TypeAlias = Callable[["Response"], Any] -HooksInputType: TypeAlias = Mapping[str, Iterable[HookType] | HookType] - - -def is_prepared(request: PreparedRequest) -> TypeIs[_ValidatedRequest]: - """Verify a PreparedRequest has been fully prepared.""" - if TYPE_CHECKING: - return request.url is not None and request.method is not None - # noop at runtime to avoid AssertionError - return True - - -if TYPE_CHECKING: - from http.cookiejar import CookieJar - from typing import TypeAlias, TypedDict - - from typing_extensions import ( - Buffer, # TODO: move to collections.abc when Python >= 3.12 - TypeIs, # TODO: move to typing when Python >= 3.13 - ) - - from .auth import AuthBase - from .cookies import RequestsCookieJar - from .models import PreparedRequest, Response - from .structures import CaseInsensitiveDict - - class _ValidatedRequest(PreparedRequest): - """Subtype asserting a PreparedRequest has been fully prepared before calling. - - The override suppression is required because mutable attribute types are - invariant (Liskov), but we only narrow after preparation is complete. This - is the explicit contract for Requests but Python's typing doesn't have a - better way to represent the requirement. - """ - - url: str # type: ignore[reportIncompatibleVariableOverride] - method: str # type: ignore[reportIncompatibleVariableOverride] - - # Type aliases for core API concepts (ordered by request() signature) - UriType: TypeAlias = str | bytes - - _ParamsMappingKeyType: TypeAlias = str | bytes | int | float - _ParamsMappingValueType: TypeAlias = ( - str | bytes | int | float | Iterable[str | bytes | int | float] | None - ) - ParamsType: TypeAlias = ( - SupportsItems[_ParamsMappingKeyType, _ParamsMappingValueType] - | tuple[tuple[_ParamsMappingKeyType, _ParamsMappingValueType], ...] - | Iterable[tuple[_ParamsMappingKeyType, _ParamsMappingValueType]] - | str - | bytes - | None - ) - - KVDataType: TypeAlias = Iterable[tuple[Any, Any]] | SupportsItems[Any, Any] - - RawDataType: TypeAlias = KVDataType | str | bytes - StreamDataType: TypeAlias = SupportsRead[str | bytes] - EncodableDataType: TypeAlias = RawDataType | StreamDataType - - DataType: TypeAlias = ( - KVDataType - | Iterable[bytes | str] - | str - | bytes - | Buffer - | SupportsRead[str | bytes] - | None - ) - - BodyType: TypeAlias = ( - bytes | str | Iterable[bytes | str] | SupportsRead[bytes | str] | None - ) - - HeadersType: TypeAlias = Mapping[str, str | bytes] | None - - CookiesType: TypeAlias = RequestsCookieJar | Mapping[str, str] - - # Building blocks for FilesType - _FileName: TypeAlias = str | None - _FileContent: TypeAlias = SupportsRead[str | bytes] | str | bytes - _FileSpecBasic: TypeAlias = tuple[_FileName, _FileContent] - _FileSpecWithContentType: TypeAlias = tuple[_FileName, _FileContent, str] - _FileSpecWithHeaders: TypeAlias = tuple[ - _FileName, _FileContent, str, CaseInsensitiveDict[str] | Mapping[str, str] - ] - _FileSpec: TypeAlias = ( - _FileContent | _FileSpecBasic | _FileSpecWithContentType | _FileSpecWithHeaders - ) - FilesType: TypeAlias = ( - Mapping[str, _FileSpec] | Iterable[tuple[str, _FileSpec]] | None - ) - - AuthType: TypeAlias = ( - tuple[str, str] | AuthBase | Callable[[PreparedRequest], PreparedRequest] | None - ) - - TimeoutType: TypeAlias = float | tuple[float | None, float | None] | None - ProxiesType: TypeAlias = MutableMapping[str, str] - HooksType: TypeAlias = dict[str, list[HookType]] | None - VerifyType: TypeAlias = bool | str - CertType: TypeAlias = str | tuple[str, str] | None - JsonType: TypeAlias = ( - None - | bool - | int - | float - | str - | Sequence["JsonType"] - | Mapping[str, "JsonType"] - ) - - # TypedDicts for Unpack kwargs (PEP 692) - - class BaseRequestKwargs(TypedDict, total=False): - headers: HeadersType - cookies: RequestsCookieJar | CookieJar | dict[str, str] | None - files: FilesType - auth: AuthType - timeout: TimeoutType - allow_redirects: bool - proxies: dict[str, str] | None - hooks: HooksInputType | None - stream: bool | None - verify: VerifyType | None - cert: CertType - - class RequestKwargs(BaseRequestKwargs, total=False): - """kwargs for request(), options(), head(), delete().""" - - params: ParamsType - data: DataType - json: JsonType - - class GetKwargs(BaseRequestKwargs, total=False): - data: DataType - json: JsonType - - class PostKwargs(BaseRequestKwargs, total=False): - params: ParamsType - - class DataKwargs(BaseRequestKwargs, total=False): - """kwargs for put(), patch().""" - - params: ParamsType - json: JsonType diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py deleted file mode 100755 index 5bf54af..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,748 +0,0 @@ -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -from __future__ import annotations - -import os.path -import socket # noqa: F401 # type: ignore[reportUnusedImport] -import typing -import warnings -from typing import Any - -from pip._vendor.urllib3.exceptions import ( - ClosedPoolError, - ConnectTimeoutError, - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, - ReadTimeoutError, - ResponseError, -) -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import InvalidHeader as _InvalidHeader -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util.retry import Retry - -from .auth import _basic_auth_str # type: ignore[reportPrivateUsage] -from .compat import basestring, urlparse -from .cookies import extract_cookies_to_jar -from .exceptions import ( - ConnectionError, - ConnectTimeout, - InvalidHeader, - InvalidProxyURL, - InvalidSchema, - InvalidURL, - ProxyError, - ReadTimeout, - RetryError, - SSLError, -) -from .models import Response -from .structures import CaseInsensitiveDict -from .utils import ( - DEFAULT_CA_BUNDLE_PATH, - get_auth_from_url, - get_encoding_from_headers, - prepend_scheme_if_needed, - select_proxy, - urldefragauth, -) - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager # type: ignore[assignment] -except ImportError: - - def SOCKSProxyManager(*args: Any, **kwargs: Any) -> None: - raise InvalidSchema("Missing dependencies for SOCKS support.") - - -if typing.TYPE_CHECKING: - from pip._vendor.urllib3.connectionpool import HTTPConnectionPool - from pip._vendor.urllib3.poolmanager import PoolManager as _PoolManager - - from . import _types as _t - from .models import PreparedRequest - -from ._types import is_prepared as _is_prepared - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -def _urllib3_request_context( - request: PreparedRequest, - verify: bool | str | None, - client_cert: tuple[str, str] | str | None, - poolmanager: PoolManager, -) -> tuple[dict[str, Any], dict[str, Any]]: - host_params: dict[str, Any] = {} - pool_kwargs: dict[str, Any] = {} - parsed_request_url = urlparse(request.url) - scheme = parsed_request_url.scheme.lower() - port = parsed_request_url.port - - cert_reqs = "CERT_REQUIRED" - if verify is False: - cert_reqs = "CERT_NONE" - elif isinstance(verify, str): - if not os.path.isdir(verify): - pool_kwargs["ca_certs"] = verify - else: - pool_kwargs["ca_cert_dir"] = verify - pool_kwargs["cert_reqs"] = cert_reqs - if client_cert is not None: - if isinstance(client_cert, tuple) and len(client_cert) == 2: - pool_kwargs["cert_file"] = client_cert[0] - pool_kwargs["key_file"] = client_cert[1] - else: - # According to our docs, we allow users to specify just the client - # cert path - pool_kwargs["cert_file"] = client_cert - host_params = { - "scheme": scheme, - "host": parsed_request_url.hostname, - "port": port, - } - return host_params, pool_kwargs - - -class BaseAdapter: - """The Base Transport Adapter""" - - def __init__(self) -> None: - super().__init__() - - def send( - self, - request: PreparedRequest, - stream: bool = False, - timeout: _t.TimeoutType = None, - verify: _t.VerifyType = True, - cert: _t.CertType = None, - proxies: dict[str, str] | None = None, - ) -> Response: - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self) -> None: - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session ` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - - __attrs__: list[str] = [ - "max_retries", - "config", - "_pool_connections", - "_pool_maxsize", - "_pool_block", - ] - - max_retries: Retry - config: dict[str, Any] - proxy_manager: dict[str, Any] - _pool_connections: int - _pool_maxsize: int - _pool_block: bool - poolmanager: _PoolManager - - def __init__( - self, - pool_connections: int = DEFAULT_POOLSIZE, - pool_maxsize: int = DEFAULT_POOLSIZE, - max_retries: int | Retry = DEFAULT_RETRIES, - pool_block: bool = DEFAULT_POOLBLOCK, - ) -> None: - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super().__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self) -> dict[str, Any]: - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state: dict[str, Any]) -> None: - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager( - self._pool_connections, self._pool_maxsize, block=self._pool_block - ) - - def init_poolmanager( - self, - connections: int, - maxsize: int, - block: bool = DEFAULT_POOLBLOCK, - **pool_kwargs: Any, - ) -> None: - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager( - num_pools=connections, - maxsize=maxsize, - block=block, - **pool_kwargs, - ) - - def proxy_manager_for(self, proxy: str, **proxy_kwargs: Any) -> Any: - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith("socks"): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - - return manager - - def cert_verify( - self, conn: Any, url: str, verify: _t.VerifyType, cert: _t.CertType - ) -> None: - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith("https") and verify: - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = DEFAULT_CA_BUNDLE_PATH - - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = "CERT_NONE" - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise OSError( - f"Could not find the TLS certificate file, " - f"invalid path: {conn.cert_file}" - ) - if conn.key_file and not os.path.exists(conn.key_file): - raise OSError( - f"Could not find the TLS key file, invalid path: {conn.key_file}" - ) - - def build_response(self, req: PreparedRequest, resp: Any) -> Response: - """Builds a :class:`Response ` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter ` - - :param req: The :class:`PreparedRequest ` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - assert _is_prepared(req) - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, "status", None) # type: ignore[assignment] - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode("utf-8") - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def build_connection_pool_key_attributes( - self, request: PreparedRequest, verify: _t.VerifyType, cert: _t.CertType = None - ) -> tuple[dict[str, Any], dict[str, Any]]: - """Build the PoolKey attributes used by urllib3 to return a connection. - - This looks at the PreparedRequest, the user-specified verify value, - and the value of the cert parameter to determine what PoolKey values - to use to select a connection from a given urllib3 Connection Pool. - - The SSL related pool key arguments are not consistently set. As of - this writing, use the following to determine what keys may be in that - dictionary: - - * If ``verify`` is ``True``, ``"ssl_context"`` will be set and will be the - default Requests SSL Context - * If ``verify`` is ``False``, ``"ssl_context"`` will not be set but - ``"cert_reqs"`` will be set - * If ``verify`` is a string, (i.e., it is a user-specified trust bundle) - ``"ca_certs"`` will be set if the string is not a directory recognized - by :py:func:`os.path.isdir`, otherwise ``"ca_cert_dir"`` will be - set. - * If ``"cert"`` is specified, ``"cert_file"`` will always be set. If - ``"cert"`` is a tuple with a second item, ``"key_file"`` will also - be present - - To override these settings, one may subclass this class, call this - method and use the above logic to change parameters as desired. For - example, if one wishes to use a custom :py:class:`ssl.SSLContext` one - must both set ``"ssl_context"`` and based on what else they require, - alter the other keys to ensure the desired behaviour. - - :param request: - The PreparedRequest being sent over the connection. - :type request: - :class:`~requests.models.PreparedRequest` - :param verify: - Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use. - :param cert: - (optional) Any user-provided SSL certificate for client - authentication (a.k.a., mTLS). This may be a string (i.e., just - the path to a file which holds both certificate and key) or a - tuple of length 2 with the certificate file path and key file - path. - :returns: - A tuple of two dictionaries. The first is the "host parameters" - portion of the Pool Key including scheme, hostname, and port. The - second is a dictionary of SSLContext related parameters. - """ - return _urllib3_request_context(request, verify, cert, self.poolmanager) - - def get_connection_with_tls_context( - self, - request: PreparedRequest, - verify: _t.VerifyType, - proxies: dict[str, str] | None = None, - cert: _t.CertType = None, - ) -> HTTPConnectionPool: - """Returns a urllib3 connection for the given request and TLS settings. - This should not be called from user code, and is only exposed for use - when subclassing the :class:`HTTPAdapter `. - - :param request: - The :class:`PreparedRequest ` object to be sent - over the connection. - :param verify: - Either a boolean, in which case it controls whether we verify the - server's TLS certificate, or a string, in which case it must be a - path to a CA bundle to use. - :param proxies: - (optional) The proxies dictionary to apply to the request. - :param cert: - (optional) Any user-provided SSL certificate to be used for client - authentication (a.k.a., mTLS). - :rtype: - urllib3.HTTPConnectionPool - """ - assert _is_prepared(request) - - proxy = select_proxy(request.url, proxies) - try: - host_params, pool_kwargs = self.build_connection_pool_key_attributes( - request, - verify, - cert, - ) - except ValueError as e: - raise InvalidURL(e, request=request) - if proxy: - proxy = prepend_scheme_if_needed(proxy, "http") - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL( - "Please check proxy URL. It is malformed " - "and could be missing the host." - ) - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_host( - **host_params, pool_kwargs=pool_kwargs - ) - else: - # Only scheme should be lower case - conn = self.poolmanager.connection_from_host( - **host_params, pool_kwargs=pool_kwargs - ) - - return conn - - def get_connection( - self, url: str, proxies: dict[str, str] | None = None - ) -> HTTPConnectionPool: - """DEPRECATED: Users should move to `get_connection_with_tls_context` - for all subclasses of HTTPAdapter using Requests>=2.32.2. - - Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.HTTPConnectionPool - """ - warnings.warn( - ( - "`get_connection` has been deprecated in favor of " - "`get_connection_with_tls_context`. Custom HTTPAdapter subclasses " - "will need to migrate for Requests>=2.32.2. Please see " - "https://github.com/psf/requests/pull/6710 for more details." - ), - DeprecationWarning, - ) - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, "http") - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL( - "Please check proxy URL. It is malformed " - "and could be missing the host." - ) - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self) -> None: - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url( - self, request: PreparedRequest, proxies: dict[str, str] | None - ) -> str: - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - assert _is_prepared(request) - - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = proxy and scheme != "https" - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith("socks") - - url = request.path_url - - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request: PreparedRequest, **kwargs: Any) -> None: - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter `. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy: str) -> dict[str, str]: - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers: dict[str, str] = {} - username, password = get_auth_from_url(proxy) - - if username: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return headers - - def send( - self, - request: PreparedRequest, - stream: bool = False, - timeout: _t.TimeoutType = None, - verify: _t.VerifyType = True, - cert: _t.CertType = None, - proxies: dict[str, str] | None = None, - ) -> Response: - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - assert _is_prepared(request) - - try: - conn = self.get_connection_with_tls_context( - request, verify, proxies=proxies, cert=cert - ) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers( - request, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - ) - - chunked = not (request.body is None or "Content-Length" in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - resolved_timeout = TimeoutSauce(connect=connect, read=read) - except ValueError: - raise ValueError( - f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " - f"or a single float to set both timeouts to the same value." - ) - elif isinstance(timeout, TimeoutSauce): - resolved_timeout = timeout - else: - resolved_timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, # type: ignore[arg-type] # urllib3 stubs don't accept Iterable[bytes | str] - headers=request.headers, # type: ignore[arg-type] # urllib3#3072 - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=resolved_timeout, - chunked=chunked, - ) - - except (ProtocolError, OSError) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - elif isinstance(e, _InvalidHeader): - raise InvalidHeader(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py deleted file mode 100755 index eeb3b54..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/api.py +++ /dev/null @@ -1,180 +0,0 @@ -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from . import sessions -from .models import Response - -if TYPE_CHECKING: - from typing_extensions import Unpack - - from . import _types as _t - - -def request( - method: str, url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs] -) -> Response: - """Constructs and sends a :class:`Request `. - - :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response ` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - >>> req - - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get( - url: _t.UriType, params: _t.ParamsType = None, **kwargs: Unpack[_t.GetKwargs] -) -> Response: - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("get", url, params=params, **kwargs) - - -def options(url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("options", url, **kwargs) - - -def head(url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. If - `allow_redirects` is not provided, it will be set to `False` (as - opposed to the default :meth:`request` behavior). - :return: :class:`Response ` object - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return request("head", url, **kwargs) - - -def post( - url: _t.UriType, - data: _t.DataType = None, - json: _t.JsonType = None, - **kwargs: Unpack[_t.PostKwargs], -) -> Response: - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("post", url, data=data, json=json, **kwargs) - - -def put( - url: _t.UriType, data: _t.DataType = None, **kwargs: Unpack[_t.DataKwargs] -) -> Response: - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("put", url, data=data, **kwargs) - - -def patch( - url: _t.UriType, data: _t.DataType = None, **kwargs: Unpack[_t.DataKwargs] -) -> Response: - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("patch", url, data=data, **kwargs) - - -def delete(url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("delete", url, **kwargs) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py deleted file mode 100755 index 2af481d..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,354 +0,0 @@ -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -from __future__ import annotations - -import hashlib -import os -import re -import threading -import time -import warnings -from base64 import b64encode -from typing import TYPE_CHECKING, Any, Final, cast, overload - -from ._internal_utils import to_native_string -from .compat import basestring, str, urlparse -from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header - -if TYPE_CHECKING: - from http.cookiejar import CookieJar - from typing import Any - - from .models import PreparedRequest, Response - -CONTENT_TYPE_FORM_URLENCODED: Final = "application/x-www-form-urlencoded" -CONTENT_TYPE_MULTI_PART: Final = "multipart/form-data" - - -def _basic_auth_str(username: bytes | str, password: bytes | str) -> str: - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): # type: ignore[reportUnnecessaryIsInstance] # runtime guard for non-str/bytes - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - f"3.0.0. Please convert the object you've passed in ({username!r}) to " - "a string or bytes object in the near future to avoid " - "problems.", - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): # type: ignore[reportUnnecessaryIsInstance] # runtime guard for non-str/bytes - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - f"3.0.0. Please convert the object you've passed in ({type(password)!r}) to " - "a string or bytes object in the near future to avoid " - "problems.", - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode("latin1") - - if isinstance(password, str): - password = password.encode("latin1") - - authstr = "Basic " + to_native_string( - b64encode(b":".join((username, password))).strip() - ) - - return authstr - - -class AuthBase: - """Base class that all auth implementations derive from""" - - def __call__(self, r: PreparedRequest) -> PreparedRequest: - raise NotImplementedError("Auth hooks must be callable.") - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - username: bytes | str - password: bytes | str - - @overload - def __init__(self, username: str, password: str) -> None: ... - @overload - def __init__(self, username: bytes, password: bytes) -> None: ... - - def __init__(self, username: bytes | str, password: bytes | str) -> None: - self.username = username - self.password = password - - def __eq__(self, other: object) -> bool: - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other: Any) -> bool: - return not self == other - - def __call__(self, r: PreparedRequest) -> PreparedRequest: - r.headers["Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r: PreparedRequest) -> PreparedRequest: - r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - username: bytes | str - password: bytes | str - _thread_local: threading.local - last_nonce: str - nonce_count: int - chal: dict[str, str] - pos: int | None - num_401_calls: int | None - - @overload - def __init__(self, username: str, password: str) -> None: ... - @overload - def __init__(self, username: bytes, password: bytes) -> None: ... - - def __init__(self, username: bytes | str, password: bytes | str) -> None: - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self) -> None: - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, "init"): - self._thread_local.init = True - self._thread_local.last_nonce = "" - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method: str, url: str) -> str | None: - """ - :rtype: str - """ - - realm = self._thread_local.chal["realm"] - nonce = self._thread_local.chal["nonce"] - qop = self._thread_local.chal.get("qop") - algorithm = self._thread_local.chal.get("algorithm") - opaque = self._thread_local.chal.get("opaque") - hash_utf8 = None - - if algorithm is None: - _algorithm = "MD5" - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == "MD5" or _algorithm == "MD5-SESS": - - def md5_utf8(x: str | bytes) -> str: - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.md5(x, usedforsecurity=False).hexdigest() - - hash_utf8 = md5_utf8 - elif _algorithm == "SHA": - - def sha_utf8(x: str | bytes) -> str: - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha1(x, usedforsecurity=False).hexdigest() - - hash_utf8 = sha_utf8 - elif _algorithm == "SHA-256": - - def sha256_utf8(x: str | bytes) -> str: - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha256(x, usedforsecurity=False).hexdigest() - - hash_utf8 = sha256_utf8 - elif _algorithm == "SHA-512": - - def sha512_utf8(x: str | bytes) -> str: - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha512(x, usedforsecurity=False).hexdigest() - - hash_utf8 = sha512_utf8 - - if hash_utf8 is None: - return None - - def KD(s: str, d: str) -> str: - return hash_utf8(f"{s}:{d}") - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += f"?{p_parsed.query}" - - A1 = f"{self.username}:{realm}:{self.password}" - A2 = f"{method}:{path}" - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = f"{self._thread_local.nonce_count:08x}" - s = str(self._thread_local.nonce_count).encode("utf-8") - s += nonce.encode("utf-8") - s += time.ctime().encode("utf-8") - s += os.urandom(8) - - cnonce = hashlib.sha1(s, usedforsecurity=False).hexdigest()[:16] - if _algorithm == "MD5-SESS": - HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") # type: ignore[reportConstantRedefinition] # RFC 2617 terminology - - if not qop: - respdig = KD(HA1, f"{nonce}:{HA2}") - elif qop == "auth" or "auth" in qop.split(","): - noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = ( - f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' - f'uri="{path}", response="{respdig}"' - ) - if opaque: - base += f', opaque="{opaque}"' - if algorithm: - base += f', algorithm="{algorithm}"' - if entdig: - base += f', digest="{entdig}"' - if qop: - base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' - - return f"Digest {base}" - - def handle_redirect(self, r: Response, **kwargs: Any) -> None: - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r: Response, **kwargs: Any) -> Response: - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/psf/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - if (seek := getattr(r.request.body, "seek", None)) is not None: - seek(self._thread_local.pos) - s_auth = r.headers.get("www-authenticate", "") - - if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - self._thread_local.num_401_calls += 1 - pat = re.compile(r"digest ", flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - cookie_jar = cast("CookieJar", prep._cookies) # type: ignore[reportPrivateUsage] - extract_cookies_to_jar(cookie_jar, r.request, r.raw) - prep.prepare_cookies(cookie_jar) - - _digest_auth = self.build_digest_header( - cast(str, prep.method), cast(str, prep.url) - ) - if _digest_auth: - prep.headers["Authorization"] = _digest_auth - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r: PreparedRequest) -> PreparedRequest: - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - _digest_auth = self.build_digest_header( - cast(str, r.method), cast(str, r.url) - ) - if _digest_auth: - r.headers["Authorization"] = _digest_auth - if (tell := getattr(r.body, "tell", None)) is not None: - self._thread_local.pos = tell() - else: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook("response", self.handle_401) - r.register_hook("response", self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other: object) -> bool: - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other: Any) -> bool: - return not self == other diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py deleted file mode 100755 index c595348..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" - -from pip._vendor.certifi import where - -if __name__ == "__main__": - print(where()) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py deleted file mode 100755 index 0cbeae6..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,96 +0,0 @@ -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module previously handled import compatibility issues -between Python 2 and Python 3. It remains for backwards -compatibility until the next major version. -""" - -# pyright: reportUnusedImport=false - -from __future__ import annotations - -import sys - -# ------- -# urllib3 -# ------- -from pip._vendor.urllib3 import ( - __version__ as urllib3_version, # type: ignore[reportPrivateImportUsage] -) - -# Detect which major version of urllib3 is being used. -try: - is_urllib3_1 = int(urllib3_version.split(".")[0]) == 1 -except (TypeError, AttributeError): - # If we can't discern a version, prefer old functionality. - is_urllib3_1 = True - -# ------------------- -# Character Detection -# ------------------- - - -def _resolve_char_detection() -> None: - """Find supported character detection libraries.""" - chardet = None - return chardet - - -chardet = _resolve_char_detection() - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = _ver[0] == 2 - -#: Python 3.x? -is_py3 = _ver[0] == 3 - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -import json -from json import JSONDecodeError - -# Keep OrderedDict for backwards compatibility. -from collections import OrderedDict -from collections.abc import Callable, Mapping, MutableMapping -from http import cookiejar as cookielib -from http.cookies import Morsel -from io import StringIO - -# -------------- -# Legacy Imports -# -------------- -from urllib.parse import ( - quote, - quote_plus, - unquote, - unquote_plus, - urldefrag, - urlencode, - urljoin, - urlparse, - urlsplit, - urlunparse, -) -from urllib.request import ( - getproxies, - getproxies_environment, - parse_http_list, - proxy_bypass, - proxy_bypass_environment, # type: ignore[attr-defined] # https://github.com/python/cpython/issues/145331 -) - -builtin_str = str -str = str -bytes = bytes -basestring = (str, bytes) -numeric_types = (int, float) -integer_types = (int,) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py deleted file mode 100755 index 2e3fc21..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,625 +0,0 @@ -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `http.cookiejar.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -from __future__ import annotations - -import calendar -import copy -import time -from collections.abc import Iterator, MutableMapping -from http.cookiejar import Cookie, CookieJar, CookiePolicy -from typing import TYPE_CHECKING, Any, TypeVar, overload - -from ._internal_utils import to_native_string -from ._types import is_prepared as _is_prepared -from .compat import Morsel, cookielib, urlparse, urlunparse - -if TYPE_CHECKING: - from _typeshed import SupportsKeysAndGetItem - - from .models import PreparedRequest - -import threading - - -class MockRequest: - """Wraps a `requests.PreparedRequest` to mimic a `urllib2.Request`. - - The code in `http.cookiejar.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - type: str - - def __init__(self, request: PreparedRequest) -> None: - assert _is_prepared(request) - self._r = request - self._new_headers: dict[str, str] = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self) -> str: - return self.type - - def get_host(self) -> str: - return urlparse(self._r.url).netloc - - def get_origin_req_host(self) -> str: - return self.get_host() - - def get_full_url(self) -> str: - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get("Host"): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers["Host"], encoding="utf-8") - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse( - [ - parsed.scheme, - host, - parsed.path, - parsed.params, - parsed.query, - parsed.fragment, - ] - ) - - def is_unverifiable(self) -> bool: - return True - - def has_header(self, name: str) -> bool: - return name in self._r.headers or name in self._new_headers - - def get_header(self, name: str, default: str | None = None) -> str | None: - return self._r.headers.get(name, self._new_headers.get(name, default)) # type: ignore[return-value] - - def add_header(self, key: str, val: str) -> None: - """cookiejar has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError( - "Cookie headers should be added with add_unredirected_header()" - ) - - def add_unredirected_header(self, name: str, value: str) -> None: - self._new_headers[name] = value - - def get_new_headers(self) -> dict[str, str]: - return self._new_headers - - @property - def unverifiable(self) -> bool: - return self.is_unverifiable() - - @property - def origin_req_host(self) -> str: - return self.get_origin_req_host() - - @property - def host(self) -> str: - return self.get_host() - - -class MockResponse: - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `http.cookiejar` expects to see them. - """ - - def __init__(self, headers: Any) -> None: - """Make a MockResponse for `cookiejar` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self) -> Any: - return self._headers - - def getheaders(self, name: str) -> Any: - self._headers.getheaders(name) - - -def extract_cookies_to_jar( - jar: CookieJar, request: PreparedRequest, response: Any -) -> None: - """Extract the cookies from the response into a CookieJar. - - :param jar: http.cookiejar.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, "_original_response") and response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) # type: ignore[arg-type] - - -def get_cookie_header(jar: CookieJar, request: PreparedRequest) -> str | None: - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) # type: ignore[arg-type] - return r.get_new_headers().get("Cookie") - - -def remove_cookie_by_name( - cookiejar: CookieJar, name: str, domain: str | None = None, path: str | None = None -) -> None: - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables: list[tuple[str, str, str]] = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(CookieJar, MutableMapping[str, str | None]): # type: ignore[misc] - """Compatibility class; is a http.cookiejar.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - _policy: CookiePolicy - - def get( # type: ignore[override] - self, - name: str, - default: str | None = None, - domain: str | None = None, - path: str | None = None, - ) -> str | None: - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set( - self, name: str, value: str | Morsel[dict[str, str]] | None, **kwargs: Any - ) -> Cookie | None: - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name( - self, name, domain=kwargs.get("domain"), path=kwargs.get("path") - ) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self) -> Iterator[str]: - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self) -> list[str]: # type: ignore[override] - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self) -> Iterator[str | None]: - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self) -> list[str | None]: # type: ignore[override] - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self) -> Iterator[tuple[str, str | None]]: - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self) -> list[tuple[str, str | None]]: # type: ignore[override] - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self) -> list[str]: - """Utility method to list all the domains in the jar.""" - domains: list[str] = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self) -> list[str]: - """Utility method to list all the paths in the jar.""" - paths: list[str] = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self) -> bool: - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains: list[str] = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: # type: ignore[reportUnnecessaryComparison] # defensive check - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict( - self, domain: str | None = None, path: str | None = None - ) -> dict[str, str | None]: - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary: dict[str, str | None] = {} - for cookie in iter(self): - if (domain is None or cookie.domain == domain) and ( - path is None or cookie.path == path - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __iter__(self) -> Iterator[Cookie]: # type: ignore[override] - """RequestCookieJar's __iter__ comes from CookieJar not MutableMapping.""" - return super().__iter__() - - def __contains__(self, name: object) -> bool: - try: - return super().__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name: str) -> str | None: - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__( - self, name: str, value: str | Morsel[dict[str, str]] | None - ) -> None: - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name: str) -> None: - """Deletes a cookie given a name. Wraps ``http.cookiejar.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie: Cookie, *args: Any, **kwargs: Any) -> None: - if ( - (value := cookie.value) is not None - and value.startswith('"') - and value.endswith('"') - ): - cookie.value = value.replace('\\"', "") - return super().set_cookie(cookie, *args, **kwargs) - - def update( # type: ignore[override] - self, other: CookieJar | SupportsKeysAndGetItem[str, str] - ) -> None: - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super().update(other) - - def _find( - self, name: str, domain: str | None = None, path: str | None = None - ) -> str | None: - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def _find_no_duplicates( - self, name: str, domain: str | None = None, path: str | None = None - ) -> str: - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: - # if there are multiple cookies that meet passed in criteria - raise CookieConflictError( - f"There are multiple cookies with name, {name!r}" - ) - # we will eventually return this as long as no cookie conflict - toReturn = cookie.value - - if toReturn is not None: - return toReturn - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def __getstate__(self) -> dict[str, Any]: - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop("_cookies_lock") - return state - - def __setstate__(self, state: dict[str, Any]) -> None: - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if "_cookies_lock" not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self) -> RequestsCookieJar: - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self) -> CookiePolicy: - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar: CookieJar | None) -> CookieJar | None: # type: ignore[reportUnusedFunction] # cross-module usage in models.py - if jar is None: - return None - - if copy_method := getattr(jar, "copy", None): - # We're dealing with an instance of RequestsCookieJar - return copy_method() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name: str, value: str, **kwargs: Any) -> Cookie: - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result: dict[str, Any] = { - "version": 0, - "name": name, - "value": value, - "port": None, - "domain": "", - "path": "/", - "secure": False, - "expires": None, - "discard": True, - "comment": None, - "comment_url": None, - "rest": {"HttpOnly": None}, - "rfc2109": False, - } - - badargs = set(kwargs) - set(result) - if badargs: - raise TypeError( - f"create_cookie() got unexpected keyword arguments: {list(badargs)}" - ) - - result.update(kwargs) - result["port_specified"] = bool(result["port"]) - result["domain_specified"] = bool(result["domain"]) - result["domain_initial_dot"] = result["domain"].startswith(".") - result["path_specified"] = bool(result["path"]) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel: Morsel[Any]) -> Cookie: - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires: int | None = None - if morsel["max-age"]: - try: - expires = int(time.time() + int(morsel["max-age"])) - except ValueError: - raise TypeError(f"max-age: {morsel['max-age']} must be integer") - elif morsel["expires"]: - time_template = "%a, %d-%b-%Y %H:%M:%S GMT" - expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) - return create_cookie( - comment=morsel["comment"], - comment_url=bool(morsel["comment"]), - discard=False, - domain=morsel["domain"], - expires=expires, - name=morsel.key, - path=morsel["path"], - port=None, - rest={"HttpOnly": morsel["httponly"]}, - rfc2109=False, - secure=bool(morsel["secure"]), - value=morsel.value, - version=morsel["version"] or 0, - ) - - -_CookieJarT = TypeVar("_CookieJarT", bound=CookieJar) - - -@overload -def cookiejar_from_dict( - cookie_dict: dict[str, str] | None, - cookiejar: None = None, - overwrite: bool = True, -) -> RequestsCookieJar: ... - - -@overload -def cookiejar_from_dict( - cookie_dict: dict[str, str] | None, - cookiejar: _CookieJarT, - overwrite: bool = True, -) -> _CookieJarT: ... - - -def cookiejar_from_dict( - cookie_dict: dict[str, str] | None, - cookiejar: CookieJar | None = None, - overwrite: bool = True, -) -> CookieJar: - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies( - cookiejar: CookieJar, cookies: dict[str, str] | CookieJar | None -) -> CookieJar: - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): # type: ignore[reportUnnecessaryIsInstance] # runtime guard - raise ValueError("You can only merge into CookieJar") - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - if update_method := getattr(cookiejar, "update", None): - update_method(cookies) - else: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py deleted file mode 100755 index 3de8f0d..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - -from .compat import JSONDecodeError as CompatJSONDecodeError - -if TYPE_CHECKING: - from .models import PreparedRequest, Request, Response - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - response: Response | None - request: Request | PreparedRequest | None - - def __init__(self, *args: Any, **kwargs: Any) -> None: - """Initialize RequestException with `request` and `response` objects.""" - response: Response | None = kwargs.pop("response", None) - self.response = response - self.request = kwargs.pop("request", None) - if response is not None and not self.request and hasattr(response, "request"): - self.request = response.request - super().__init__(*args, **kwargs) - - -class InvalidJSONError(RequestException): - """A JSON error occurred.""" - - -class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): - """Couldn't decode the text into json""" - - def __init__(self, *args: Any, **kwargs: Any) -> None: - """ - Construct the JSONDecodeError instance first with all - args. Then use it's args to construct the IOError so that - the json specific args aren't used as IOError specific args - and the error message from JSONDecodeError is preserved. - """ - CompatJSONDecodeError.__init__(self, *args) - InvalidJSONError.__init__(self, *self.args, **kwargs) - - def __reduce__(self) -> tuple[Any, ...] | str: - """ - The __reduce__ method called when pickling the object must - be the one from the JSONDecodeError (be it json/simplejson) - as it expects all the arguments for instantiation, not just - one like the IOError, and the MRO would by default call the - __reduce__ method from the IOError due to the inheritance order. - """ - return CompatJSONDecodeError.__reduce__(self) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL scheme (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """The URL scheme provided is either invalid or unsupported.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content.""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed.""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body.""" - - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py deleted file mode 100755 index 33f2d57..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/help.py +++ /dev/null @@ -1,127 +0,0 @@ -"""Module containing bug report helper(s).""" - -# pyright: reportUnknownMemberType=false - -import json -import platform -import ssl -import sys -from typing import Any - -from pip._vendor import idna -from pip._vendor import urllib3 - -from . import __version__ as requests_version - -charset_normalizer = None -chardet = None - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import cryptography # type: ignore[import-not-found] - import OpenSSL # type: ignore[import-not-found] - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 3.10.3 it will return - {'name': 'CPython', 'version': '3.10.3'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == "CPython": - implementation_version = platform.python_version() - elif implementation == "PyPy": - pypy = sys.pypy_version_info # type: ignore[attr-defined] - implementation_version = f"{pypy.major}.{pypy.minor}.{pypy.micro}" - if sys.pypy_version_info.releaselevel != "final": # type: ignore[attr-defined] - implementation_version = "".join( - [implementation_version, sys.pypy_version_info.releaselevel] # type: ignore[attr-defined] - ) - elif implementation == "Jython": - implementation_version = platform.python_version() # Complete Guess - elif implementation == "IronPython": - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = "Unknown" - - return {"name": implementation, "version": implementation_version} - - -def info() -> dict[str, Any]: - """Generate information for a bug report.""" - try: - platform_info = { - "system": platform.system(), - "release": platform.release(), - } - except OSError: - platform_info = { - "system": "Unknown", - "release": "Unknown", - } - - implementation_info = _implementation() - urllib3_info = {"version": urllib3.__version__} # type: ignore[reportPrivateImportUsage] - charset_normalizer_info = {"version": None} - chardet_info: dict[str, str | None] = {"version": None} - if charset_normalizer: - charset_normalizer_info = {"version": charset_normalizer.__version__} - if chardet: - chardet_info = {"version": chardet.__version__} - - pyopenssl_info: dict[str, str | None] = { - "version": None, - "openssl_version": "", - } - if OpenSSL: - pyopenssl_info = { - "version": OpenSSL.__version__, - "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", - } - cryptography_info = { - "version": getattr(cryptography, "__version__", ""), - } - idna_info = { - "version": getattr(idna, "__version__", ""), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} # type: ignore[reportUnnecessaryComparison] - - return { - "platform": platform_info, - "implementation": implementation_info, - "system_ssl": system_ssl_info, - "using_pyopenssl": pyopenssl is not None, - "using_charset_normalizer": chardet is None, - "pyOpenSSL": pyopenssl_info, - "urllib3": urllib3_info, - "chardet": chardet_info, - "charset_normalizer": charset_normalizer_info, - "cryptography": cryptography_info, - "idna": idna_info, - "requests": { - "version": requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py deleted file mode 100755 index 11ff9e9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,48 +0,0 @@ -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" - -from __future__ import annotations - -from collections.abc import Callable, Iterable -from typing import TYPE_CHECKING, Any - -if TYPE_CHECKING: - from . import _types as _t - from .models import Response - -HOOKS: list[str] = ["response"] - - -def default_hooks() -> dict[str, list[_t.HookType]]: - return {event: [] for event in HOOKS} - - -# TODO: response is the only one - - -def dispatch_hook( - key: str, - hooks: _t.HooksInputType | None, - hook_data: Response, - **kwargs: Any, -) -> Response: - """Dispatches a hook dictionary on a given piece of data.""" - hooks_dict = hooks or {} - hook_list: Iterable[_t.HookType] | _t.HookType | None = hooks_dict.get(key) - if hook_list: - if isinstance(hook_list, Callable): - hook_list = [hook_list] - for hook in hook_list: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py deleted file mode 100755 index 3a70ae5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/models.py +++ /dev/null @@ -1,1180 +0,0 @@ -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -from __future__ import annotations - -import datetime - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. -import encodings.idna # noqa: F401 # type: ignore[reportUnusedImport] -from collections.abc import Callable, Generator, Iterable, Iterator, Mapping -from io import UnsupportedOperation -from typing import ( - TYPE_CHECKING, - Any, - Final, - Literal, - cast, - overload, -) - -from pip._vendor.urllib3.exceptions import ( - DecodeError, - LocationParseError, - ProtocolError, - ReadTimeoutError, - SSLError, -) -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url - -from ._internal_utils import to_native_string, unicode_is_ascii -from ._types import SupportsRead as _SupportsRead -from .auth import HTTPBasicAuth -from .compat import ( - JSONDecodeError, - basestring, - builtin_str, - chardet, - cookielib, - urlencode, - urlsplit, - urlunparse, -) -from .compat import json as complexjson -from .cookies import ( - _copy_cookie_jar, # type: ignore[reportPrivateUsage] - cookiejar_from_dict, - get_cookie_header, -) -from .exceptions import ( - ChunkedEncodingError, - ConnectionError, - ContentDecodingError, - HTTPError, - InvalidJSONError, - InvalidURL, - MissingSchema, - StreamConsumedError, -) -from .exceptions import JSONDecodeError as RequestsJSONDecodeError -from .exceptions import SSLError as RequestsSSLError -from .hooks import default_hooks -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( - check_header_validity, - get_auth_from_url, - guess_filename, - guess_json_utf, - iter_slices, - parse_header_links, - requote_uri, - stream_decode_response_unicode, - super_len, - to_key_val_list, -) - -if TYPE_CHECKING: - from http.cookiejar import CookieJar - - from typing_extensions import Self - - from . import _types as _t - from .adapters import HTTPAdapter - from .cookies import RequestsCookieJar - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI: Final[tuple[int, ...]] = ( # type: ignore[assignment] - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT: int = 30 -CONTENT_CHUNK_SIZE: int = 10 * 1024 -ITER_CHUNK_SIZE: int = 512 - - -class RequestEncodingMixin: - url: str | None - - @property - def path_url(self) -> str: - """Build the path URL to use.""" - - url: list[str] = [] - - p = urlsplit(cast(str, self.url)) - - path = p.path - if not path: - path = "/" - - url.append(path) - - query = p.query - if query: - url.append("?") - url.append(query) - - return "".join(url) - - @overload - @staticmethod - def _encode_params(data: str) -> str: ... - - @overload - @staticmethod - def _encode_params(data: bytes) -> bytes: ... - - @overload - @staticmethod - def _encode_params( - data: _t.SupportsRead[str | bytes], - ) -> _t.SupportsRead[str | bytes]: ... - - @overload - @staticmethod - def _encode_params(data: _t.KVDataType) -> str: ... - - @staticmethod - def _encode_params( - data: _t.EncodableDataType, - ) -> str | bytes | _t.SupportsRead[str | bytes]: - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif isinstance(data, _SupportsRead): - return data - elif hasattr(data, "__iter__"): - result: list[tuple[bytes, bytes]] = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): - vs = [vs] - for v in vs: - if v is not None: - result.append( - ( - k.encode("utf-8") if isinstance(k, str) else k, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - return urlencode(result, doseq=True) - else: - return data # type: ignore[return-value] # unreachable for valid _t.DataType - - @staticmethod - def _encode_files( - files: _t.FilesType, data: _t.RawDataType | None - ) -> tuple[bytes, str]: - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if not files: - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields: list[RequestField | tuple[str, bytes]] = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, "__iter__"): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - ( - field.decode("utf-8") - if isinstance(field, bytes) - else field, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - - for k, v in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif isinstance(fp, _SupportsRead): # type: ignore[reportUnnecessaryIsInstance] # defensive check for untyped callers - fdata = fp.read() - elif fp is None: # type: ignore[reportUnnecessaryComparison] # defensive check for untyped callers - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin: - hooks: dict[str, list[_t.HookType]] - - def register_hook( - self, event: str, hook: Iterable[_t.HookType] | _t.HookType - ) -> None: - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError(f'Unsupported event specified, with event name "{event}"') - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, "__iter__"): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) # type: ignore[reportUnnecessaryIsInstance] # defensive runtime filter - - def deregister_hook(self, event: str, hook: _t.HookType) -> bool: - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request ` object. - - Used to prepare a :class:`PreparedRequest `, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - - """ - - method: str | None - url: _t.UriType | None - headers: Mapping[str, str | bytes] - files: _t.FilesType - data: _t.DataType - json: _t.JsonType - params: _t.ParamsType - auth: _t.AuthType - cookies: RequestsCookieJar | CookieJar | dict[str, str] | None - - def __init__( - self, - method: str | None = None, - url: _t.UriType | None = None, - headers: _t.HeadersType = None, - files: _t.FilesType = None, - data: _t.DataType = None, - params: _t.ParamsType = None, - auth: _t.AuthType = None, - cookies: RequestsCookieJar | CookieJar | dict[str, str] | None = None, - hooks: _t.HooksInputType | None = None, - json: _t.JsonType = None, - ) -> None: - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for k, v in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self) -> str: - return f"" - - def prepare(self) -> PreparedRequest: - """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest ` object, - containing the exact bytes that will be sent to the server. - - Instances are generated from a :class:`Request ` object, and - should not be instantiated manually; doing so may produce undesirable - effects. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - >>> r - - - >>> s = requests.Session() - >>> s.send(r) - - """ - - method: str | None - url: str | None - headers: CaseInsensitiveDict[str | bytes] - _cookies: RequestsCookieJar | CookieJar | None - body: _t.BodyType - hooks: dict[str, list[_t.HookType]] - _body_position: int | object | None - - def __init__(self) -> None: - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None # type: ignore[assignment] - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare( - self, - method: str | None = None, - url: _t.UriType | None = None, - headers: Mapping[str, str | bytes] | None = None, - files: _t.FilesType = None, - data: _t.DataType = None, - params: _t.ParamsType = None, - auth: _t.AuthType = None, - cookies: RequestsCookieJar | CookieJar | dict[str, str] | None = None, - hooks: _t.HooksInputType | None = None, - json: _t.JsonType = None, - ) -> None: - """Prepares the entire request with the given parameters.""" - - url = cast("_t.UriType", url) - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self) -> str: - return f"" - - def copy(self) -> PreparedRequest: - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None # type: ignore[assignment] - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method: str | None) -> None: - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host: str) -> str: - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode("utf-8") - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url( - self, - url: _t.UriType, - params: _t.ParamsType, - ) -> None: - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/psf/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode("utf8") - else: - url = str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ":" in url and not url.lower().startswith("http"): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - raise MissingSchema( - f"Invalid URL {url!r}: No scheme supplied. " - f"Perhaps you meant https://{url}?" - ) - - if not host: - raise InvalidURL(f"Invalid URL {url!r}: No host supplied") - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL("URL has an invalid label.") - elif host.startswith(("*", ".")): - raise InvalidURL("URL has an invalid label.") - - # Carefully reconstruct the network location - netloc = auth or "" - if netloc: - netloc += "@" - netloc += host - if port: - netloc += f":{port}" - - # Bare domains aren't valid URLs. - if not path: - path = "/" - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - if params is not None: - enc_params = self._encode_params(params) - else: - enc_params = "" - - if enc_params: - if query: - query = f"{query}&{enc_params}" - else: - query = enc_params - - url = requote_uri(urlunparse((scheme, netloc, path, "", query, fragment))) - self.url = url - - def prepare_headers(self, headers: Mapping[str, str | bytes] | None) -> None: - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body( - self, data: _t.DataType, files: _t.FilesType, json: _t.JsonType = None - ) -> None: - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = "application/json" - - try: - body = complexjson.dumps(json, allow_nan=False) - except ValueError as ve: - raise InvalidJSONError(ve, request=self) - - if not isinstance(body, bytes): - body = body.encode("utf-8") - - # data that proxies attributes to underlying objects needs hasattr - is_iterable = isinstance(data, Iterable) or hasattr(data, "__iter__") - if is_iterable and not isinstance(data, (str, bytes, list, tuple, Mapping)): - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - body = data - - if getattr(body, "tell", None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() # type: ignore[union-attr] # guarded by getattr check - except OSError: - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError( - "Streamed bodies and files are mutually exclusive." - ) - - if length: - self.headers["Content-Length"] = builtin_str(length) - else: - self.headers["Transfer-Encoding"] = "chunked" - else: - # After is_stream filtering, remaining data is raw (not streamed) - raw_data = cast("_t.RawDataType | None", data) - - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, raw_data) - else: - if raw_data: - body = self._encode_params(raw_data) - if isinstance(data, basestring) or isinstance(data, _SupportsRead): - content_type = None - else: - content_type = "application/x-www-form-urlencoded" - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ("content-type" not in self.headers): - self.headers["Content-Type"] = content_type - - self.body = body # type: ignore[assignment] # body transforms from DataType to BodyType - - def prepare_content_length(self, body: _t.BodyType) -> None: - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers["Content-Length"] = builtin_str(length) - elif ( - self.method not in ("GET", "HEAD") - and self.headers.get("Content-Length") is None - ): - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers["Content-Length"] = "0" - - def prepare_auth( - self, - auth: _t.AuthType, - url: _t.UriType = "", - ) -> None: - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(cast(str, self.url)) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: # type: ignore[arg-type] # pyright widens tuple from Callable in AuthType - # special-case basic HTTP auth - auth_handler = HTTPBasicAuth(*auth) # type: ignore[arg-type] # pyright widens tuple from Callable in AuthType - else: - # TODO: can be fixed by flipping the conditionals - auth_handler = cast("Callable[..., PreparedRequest]", auth) - - # Allow auth to make its changes. - r = auth_handler(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies( - self, cookies: RequestsCookieJar | CookieJar | dict[str, str] | None - ) -> None: - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest ` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookies_jar = cast("CookieJar", self._cookies) - cookie_header = get_cookie_header(cookies_jar, self) - if cookie_header is not None: - self.headers["Cookie"] = cookie_header - - def prepare_hooks(self, hooks: _t.HooksInputType | None) -> None: - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or {} - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response: - """The :class:`Response ` object, which contains a - server's response to an HTTP request. - """ - - _content: bytes | Literal[False] | None - _content_consumed: bool - _next: PreparedRequest | None - status_code: int - headers: CaseInsensitiveDict[str] - raw: Any - url: str - encoding: str | None - history: list[Response] - reason: str - cookies: RequestsCookieJar - elapsed: datetime.timedelta - request: PreparedRequest - connection: HTTPAdapter - - __attrs__: list[str] = [ - "_content", - "status_code", - "headers", - "url", - "history", - "encoding", - "reason", - "cookies", - "elapsed", - "request", - ] - - def __init__(self) -> None: - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None # type: ignore[assignment] - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - #: This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None # type: ignore[assignment] - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response ` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None # type: ignore[assignment] - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest ` object to which this - #: is a response. - self.request = None # type: ignore[assignment] - - def __enter__(self) -> Self: - return self - - def __exit__(self, *args: Any) -> None: - self.close() - - def __getstate__(self) -> dict[str, Any]: - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state: dict[str, Any]) -> None: - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, "_content_consumed", True) - setattr(self, "raw", None) - - def __repr__(self) -> str: - return f"" - - def __bool__(self) -> bool: - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self) -> bool: - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self) -> Iterator[bytes]: - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self) -> bool: - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self) -> bool: - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return "location" in self.headers and self.status_code in REDIRECT_STATI - - @property - def is_permanent_redirect(self) -> bool: - """True if this Response one of the permanent versions of redirect.""" - return "location" in self.headers and self.status_code in ( - codes.moved_permanently, - codes.permanent_redirect, - ) - - @property - def next(self) -> PreparedRequest | None: - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self) -> str | None: - """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - if chardet is not None: - return chardet.detect(self.content)["encoding"] - else: - # If no character detection library is available, we'll fall back - # to a standard Python utf-8 str. - return "utf-8" - - @overload - def iter_content( - self, chunk_size: int | None = 1, decode_unicode: Literal[False] = False - ) -> Iterator[bytes]: ... - @overload - def iter_content( - self, chunk_size: int | None = 1, *, decode_unicode: Literal[True] - ) -> Iterator[str | bytes]: ... - def iter_content( - self, chunk_size: int | None = 1, decode_unicode: bool = False - ) -> Iterator[str | bytes]: - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using encoding - information from the response. If no encoding information is available, - bytes will be returned. This can be bypassed by manually setting - `encoding` on the response. - """ - - def generate() -> Generator[bytes, None, None]: - # Special case for urllib3. - if hasattr(self.raw, "stream"): - try: - yield from self.raw.stream(chunk_size, decode_content=True) - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - except SSLError as e: - raise RequestsSSLError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): # type: ignore[reportUnnecessaryIsInstance] # runtime guard for untyped callers - raise TypeError( - f"chunk_size must be an int, it is instead a {type(chunk_size)}." - ) - - if self._content_consumed: - # simulate reading small chunks of the content - content = cast(bytes, self._content) - chunks = iter_slices(content, chunk_size) - else: - chunks = generate() - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - @overload - def iter_lines( - self, - chunk_size: int = ITER_CHUNK_SIZE, - decode_unicode: Literal[False] = False, - delimiter: bytes | None = None, - ) -> Iterator[bytes]: ... - @overload - def iter_lines( - self, - chunk_size: int = ITER_CHUNK_SIZE, - *, - decode_unicode: Literal[True], - delimiter: str | bytes | None = None, - ) -> Iterator[str | bytes]: ... - def iter_lines( - self, - chunk_size: int = ITER_CHUNK_SIZE, - decode_unicode: bool = False, - delimiter: str | bytes | None = None, - ) -> Iterator[str | bytes]: - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - The decode_unicode param works the same as in `iter_content`, with the - same caveats. - - .. note:: This method is not reentrant safe. - """ - - pending: str | bytes | None = None - - for chunk in self.iter_content( - chunk_size=chunk_size, decode_unicode=decode_unicode - ): - if pending is not None: - # TODO: remove cast after iter_lines rewrite - chunk = cast("str | bytes", pending + chunk) # type: ignore[operator] - - if delimiter: - lines = chunk.split(delimiter) # type: ignore[arg-type] - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - yield from lines - - if pending is not None: - yield pending - - @property - def content(self) -> bytes: - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError("The content for this response was already consumed") - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content # type: ignore[return-value] - - @property - def text(self) -> str: - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``charset_normalizer`` or ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return "" - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding or "utf-8", errors="replace") - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors="replace") - - return content - - def json(self, **kwargs: Any) -> Any: - r"""Decodes the JSON response body (if any) as a Python object. - - This may return a dictionary, list, etc. depending on what is in the response. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises requests.exceptions.JSONDecodeError: If the response body does not - contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using charset_normalizer to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads(self.content.decode(encoding), **kwargs) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - except JSONDecodeError as e: - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - try: - return complexjson.loads(self.text, **kwargs) - except JSONDecodeError as e: - # Catch JSON-related errors and raise as requests.JSONDecodeError - # This aliases json.JSONDecodeError and simplejson.JSONDecodeError - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - @property - def links(self) -> dict[str, dict[str, str]]: - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get("link") - - resolved_links: dict[str, dict[str, str]] = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get("rel") or link.get("url") - if key is not None: - resolved_links[key] = link - - return resolved_links - - def raise_for_status(self) -> None: - """Raises :class:`HTTPError`, if one occurred.""" - - http_error_msg = "" - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode("utf-8") - except UnicodeDecodeError: - reason = self.reason.decode("iso-8859-1") - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = ( - f"{self.status_code} Client Error: {reason} for url: {self.url}" - ) - - elif 500 <= self.status_code < 600: - http_error_msg = ( - f"{self.status_code} Server Error: {reason} for url: {self.url}" - ) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self) -> None: - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, "release_conn", None) - if release_conn is not None: - release_conn() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py deleted file mode 100755 index 200c382..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,25 +0,0 @@ -import sys - -from .compat import chardet - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ("urllib3", "idna"): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -if chardet is not None: - target = chardet.__name__ - for mod in list(sys.modules): - if mod == target or mod.startswith(f"{target}."): - imported_mod = sys.modules[mod] - sys.modules[f"requests.packages.{mod}"] = imported_mod - mod = mod.replace(target, "chardet") - sys.modules[f"requests.packages.{mod}"] = imported_mod diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/py.typed b/venv/lib/python3.11/site-packages/pip/_vendor/requests/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py deleted file mode 100755 index feaf340..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,920 +0,0 @@ -""" -requests.sessions -~~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" - -from __future__ import annotations - -import os -import sys -import time -from collections import OrderedDict -from collections.abc import Generator, Mapping, MutableMapping -from datetime import timedelta -from typing import TYPE_CHECKING, Any, cast - -from ._internal_utils import to_native_string -from ._types import is_prepared as _is_prepared -from .adapters import HTTPAdapter -from .auth import _basic_auth_str # type: ignore[reportPrivateUsage] -from .compat import cookielib, urljoin, urlparse -from .cookies import ( - RequestsCookieJar, - cookiejar_from_dict, - extract_cookies_to_jar, - merge_cookies, -) -from .exceptions import ( - ChunkedEncodingError, - ContentDecodingError, - InvalidSchema, - TooManyRedirects, -) -from .hooks import default_hooks, dispatch_hook - -# formerly defined here, reexposed here for backward compatibility -from .models import ( # noqa: F401 - DEFAULT_REDIRECT_LIMIT, - REDIRECT_STATI, # type: ignore[reportUnusedImport] - PreparedRequest, - Request, - Response, -) -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( # noqa: F401 - DEFAULT_PORTS, - default_headers, - get_auth_from_url, - get_environ_proxies, - get_netrc_auth, - requote_uri, - resolve_proxies, - rewind_body, - should_bypass_proxies, # type: ignore[reportUnusedImport] # re-export for external consumers - to_key_val_list, -) - -if TYPE_CHECKING: - from http.cookiejar import CookieJar - - from typing_extensions import Self, Unpack - - from . import _types as _t - from .adapters import BaseAdapter - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == "win32": - preferred_clock = time.perf_counter -else: - preferred_clock = time.time - - -def merge_setting( - request_setting: Any, session_setting: Any, dict_class: type = OrderedDict -) -> Any: - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) # type: ignore[arg-type] # isinstance narrows Any to Mapping[Unknown] - merged_setting.update(to_key_val_list(request_setting)) # type: ignore[arg-type] - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks( - request_hooks: _t.HooksType, - session_hooks: _t.HooksType, - dict_class: type = OrderedDict, -) -> _t.HooksType: - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get("response") == []: - return request_hooks - - if request_hooks is None or request_hooks.get("response") == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin: - max_redirects: int - trust_env: bool - cookies: RequestsCookieJar - - def send(self, request: PreparedRequest, **kwargs: Any) -> Response: ... - - def get_redirect_target(self, resp: Response) -> str | None: - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers["location"] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - location = location.encode("latin1") - return to_native_string(location, "utf8") - return None - - def should_strip_auth(self, old_url: str, new_url: str) -> bool: - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if ( - old_parsed.scheme == "http" - and old_parsed.port in (80, None) - and new_parsed.scheme == "https" - and new_parsed.port in (443, None) - ): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if ( - not changed_scheme - and old_parsed.port in default_port - and new_parsed.port in default_port - ): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects( - self, - resp: Response, - req: PreparedRequest, - stream: bool = False, - timeout: _t.TimeoutType = None, - verify: _t.VerifyType = True, - cert: _t.CertType = None, - proxies: dict[str, str] | None = None, - yield_requests: bool = False, - **adapter_kwargs: Any, - ) -> Generator[Response, None, None]: - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist: list[Response] = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - resp.history = hist[:] - hist.append(resp) - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects( - f"Exceeded {self.max_redirects} redirects.", response=resp - ) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith("//"): - parsed_rurl = urlparse(resp.url) - url = ":".join([to_native_string(parsed_rurl.scheme), url]) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == "" and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/psf/requests/issues/1084 - if resp.status_code not in ( - codes.temporary_redirect, - codes.permanent_redirect, - ): - # https://github.com/psf/requests/issues/3490 - purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - headers.pop("Cookie", None) - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - cookie_jar = cast("CookieJar", prepared_request._cookies) # type: ignore[reportPrivateUsage] - extract_cookies_to_jar(cookie_jar, req, resp.raw) - merge_cookies(cookie_jar, self.cookies) - prepared_request.prepare_cookies(cookie_jar) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = prepared_request._body_position is not None and ( # type: ignore[reportPrivateUsage] - "Content-Length" in headers or "Transfer-Encoding" in headers - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req # type: ignore[misc] # Internal use only, returns PreparedRequest - else: - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs, - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth( - self, prepared_request: PreparedRequest, response: Response - ) -> None: - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - original_request = response.request - assert _is_prepared(original_request) - assert _is_prepared(prepared_request) - - headers = prepared_request.headers - original_url = original_request.url - url = prepared_request.url - - if "Authorization" in headers and self.should_strip_auth(original_url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers["Authorization"] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - def rebuild_proxies( - self, - prepared_request: PreparedRequest, - proxies: dict[str, str] | None, - ) -> dict[str, str]: - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - assert _is_prepared(prepared_request) - headers = prepared_request.headers - scheme = urlparse(prepared_request.url).scheme - new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) - - if "Proxy-Authorization" in headers: - del headers["Proxy-Authorization"] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - # urllib3 handles proxy authorization for us in the standard adapter. - # Avoid appending this to TLS tunneled requests where it may be leaked. - if not scheme.startswith("https") and username and password: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method( - self, prepared_request: PreparedRequest, response: Response - ) -> None: - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != "HEAD": - method = "GET" - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != "HEAD": - method = "GET" - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == "POST": - method = "GET" - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - - - Or as a context manager:: - - >>> with requests.Session() as s: - ... s.get('https://httpbin.org/get') - - """ - - headers: CaseInsensitiveDict[str] - auth: _t.AuthType - proxies: dict[str, str] - hooks: dict[str, list[_t.HookType]] - params: MutableMapping[str, Any] - stream: bool - verify: _t.VerifyType - cert: _t.CertType - max_redirects: int - trust_env: bool - cookies: RequestsCookieJar - adapters: MutableMapping[str, BaseAdapter] - - __attrs__: list[str] = [ - "headers", - "cookies", - "auth", - "proxies", - "hooks", - "params", - "verify", - "cert", - "adapters", - "stream", - "trust_env", - "max_redirects", - ] - - def __init__(self) -> None: - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request ` sent from this - #: :class:`Session `. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request `. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request `. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request `. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - #: Defaults to `True`, requiring requests to verify the TLS certificate at the - #: remote end. - #: If verify is set to `False`, requests will accept any TLS certificate - #: presented by the server, and will ignore hostname mismatches and/or - #: expired certificates, which will make your application vulnerable to - #: man-in-the-middle (MitM) attacks. - #: Only set this to `False` for testing. - #: If verify is set to a string, it must be the path to a CA bundle file - #: that will be used to verify the TLS certificate. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar `, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount("https://", HTTPAdapter()) - self.mount("http://", HTTPAdapter()) - - def __enter__(self) -> Self: - return self - - def __exit__(self, *args: Any) -> None: - self.close() - - def prepare_request(self, request: Request) -> PreparedRequest: - """Constructs a :class:`PreparedRequest ` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request ` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - url = cast("_t.UriType", request.url) - method = cast(str, request.method) - - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies - ) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(url) - - p = PreparedRequest() - p.prepare( - method=method.upper(), - url=url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting( - request.headers, self.headers, dict_class=CaseInsensitiveDict - ), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request( - self, - method: str, - url: _t.UriType, - params: _t.ParamsType = None, - data: _t.DataType = None, - headers: _t.HeadersType = None, - cookies: RequestsCookieJar | CookieJar | dict[str, str] | None = None, - files: _t.FilesType = None, - auth: _t.AuthType = None, - timeout: _t.TimeoutType = None, - allow_redirects: bool = True, - proxies: dict[str, str] | None = None, - hooks: _t.HooksInputType | None = None, - stream: bool | None = None, - verify: _t.VerifyType | None = None, - cert: _t.CertType = None, - json: _t.JsonType = None, - ) -> Response: - """Constructs a :class:`Request `, prepares it and sends it. - Returns :class:`Response ` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param hooks: (optional) Dictionary mapping hook name to one event or - list of events, event must be callable. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. When set to - ``False``, requests will accept any TLS certificate presented by - the server, and will ignore hostname mismatches and/or expired - certificates, which will make your application vulnerable to - man-in-the-middle (MitM) attacks. Setting verify to ``False`` - may be useful during local development or testing. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - if isinstance(url, bytes): - url = url.decode("utf-8") - - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - assert _is_prepared(prep) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - "timeout": timeout, - "allow_redirects": allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get( - self, - url: _t.UriType, - params: _t.ParamsType = None, - **kwargs: Unpack[_t.GetKwargs], - ) -> Response: - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("GET", url, params=params, **kwargs) - - def options(self, url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("OPTIONS", url, **kwargs) - - def head(self, url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return self.request("HEAD", url, **kwargs) - - def post( - self, - url: _t.UriType, - data: _t.DataType = None, - json: _t.JsonType = None, - **kwargs: Unpack[_t.PostKwargs], - ) -> Response: - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("POST", url, data=data, json=json, **kwargs) - - def put( - self, url: _t.UriType, data: _t.DataType = None, **kwargs: Unpack[_t.DataKwargs] - ) -> Response: - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PUT", url, data=data, **kwargs) - - def patch( - self, url: _t.UriType, data: _t.DataType = None, **kwargs: Unpack[_t.DataKwargs] - ) -> Response: - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PATCH", url, data=data, **kwargs) - - def delete(self, url: _t.UriType, **kwargs: Unpack[_t.RequestKwargs]) -> Response: - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("DELETE", url, **kwargs) - - def send(self, request: PreparedRequest, **kwargs: Any) -> Response: - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault("stream", self.stream) - kwargs.setdefault("verify", self.verify) - kwargs.setdefault("cert", self.cert) - if "proxies" not in kwargs: - kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError("You can only send PreparedRequests.") - - assert _is_prepared(request) - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop("allow_redirects", True) - stream = kwargs.get("stream") - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook("response", hooks, r, **kwargs) - - # Persist cookies - if r.history: - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Resolve redirects if allowed. - if allow_redirects: - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - history = [resp for resp in gen] - else: - history = [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next( # type: ignore[assignment] # yield_requests=True returns PreparedRequest - self.resolve_redirects(r, request, yield_requests=True, **kwargs) - ) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings( - self, - url: str, - proxies: dict[str, str] | None, - stream: bool | None, - verify: _t.VerifyType | None, - cert: _t.CertType, - ) -> dict[str, Any]: - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get("no_proxy") if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - if proxies is not None: - for k, v in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration - # and be compatible with cURL. - if verify is True or verify is None: - verify = ( - os.environ.get("REQUESTS_CA_BUNDLE") - or os.environ.get("CURL_CA_BUNDLE") - or verify - ) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} - - def get_adapter(self, url: str) -> BaseAdapter: - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for prefix, adapter in self.adapters.items(): - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema(f"No connection adapters were found for {url!r}") - - def close(self) -> None: - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix: str, adapter: BaseAdapter) -> None: - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self) -> dict[str, Any]: - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state: dict[str, Any]) -> None: - for attr, value in state.items(): - setattr(self, attr, value) - - -def session() -> Session: - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py deleted file mode 100755 index 6c59d6b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,128 +0,0 @@ -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - -Example:: - - >>> import requests - >>> requests.codes['temporary_redirect'] - 307 - >>> requests.codes.teapot - 418 - >>> requests.codes['\o/'] - 200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - # Informational. - 100: ("continue",), - 101: ("switching_protocols",), - 102: ("processing", "early-hints"), - 103: ("checkpoint",), - 122: ("uri_too_long", "request_uri_too_long"), - 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), - 201: ("created",), - 202: ("accepted",), - 203: ("non_authoritative_info", "non_authoritative_information"), - 204: ("no_content",), - 205: ("reset_content", "reset"), - 206: ("partial_content", "partial"), - 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), - 208: ("already_reported",), - 226: ("im_used",), - # Redirection. - 300: ("multiple_choices",), - 301: ("moved_permanently", "moved", "\\o-"), - 302: ("found",), - 303: ("see_other", "other"), - 304: ("not_modified",), - 305: ("use_proxy",), - 306: ("switch_proxy",), - 307: ("temporary_redirect", "temporary_moved", "temporary"), - 308: ( - "permanent_redirect", - "resume_incomplete", - "resume", - ), # "resume" and "resume_incomplete" to be removed in 3.0 - # Client Error. - 400: ("bad_request", "bad"), - 401: ("unauthorized",), - 402: ("payment_required", "payment"), - 403: ("forbidden",), - 404: ("not_found", "-o-"), - 405: ("method_not_allowed", "not_allowed"), - 406: ("not_acceptable",), - 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), - 408: ("request_timeout", "timeout"), - 409: ("conflict",), - 410: ("gone",), - 411: ("length_required",), - 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large", "content_too_large"), - 414: ("request_uri_too_large", "uri_too_long"), - 415: ("unsupported_media_type", "unsupported_media", "media_type"), - 416: ( - "requested_range_not_satisfiable", - "requested_range", - "range_not_satisfiable", - ), - 417: ("expectation_failed",), - 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), - 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable", "unprocessable_content"), - 423: ("locked",), - 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered", "too_early"), - 426: ("upgrade_required", "upgrade"), - 428: ("precondition_required", "precondition"), - 429: ("too_many_requests", "too_many"), - 431: ("header_fields_too_large", "fields_too_large"), - 444: ("no_response", "none"), - 449: ("retry_with", "retry"), - 450: ("blocked_by_windows_parental_controls", "parental_controls"), - 451: ("unavailable_for_legal_reasons", "legal_reasons"), - 499: ("client_closed_request",), - # Server Error. - 500: ("internal_server_error", "server_error", "/o\\", "✗"), - 501: ("not_implemented",), - 502: ("bad_gateway",), - 503: ("service_unavailable", "unavailable"), - 504: ("gateway_timeout",), - 505: ("http_version_not_supported", "http_version"), - 506: ("variant_also_negotiates",), - 507: ("insufficient_storage",), - 509: ("bandwidth_limit_exceeded", "bandwidth"), - 510: ("not_extended",), - 511: ("network_authentication_required", "network_auth", "network_authentication"), -} - -codes: LookupDict[int] = LookupDict(name="status_codes") - - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(("\\", "/")): - setattr(codes, title.upper(), code) - - def doc(code: int) -> str: - names = ", ".join(f"``{n}``" for n in _codes[code]) - return "* %d: %s" % (code, names) - - global __doc__ - __doc__ = ( - __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) - if __doc__ is not None - else None - ) - - -_init() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py deleted file mode 100755 index 7675eaf..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,130 +0,0 @@ -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from __future__ import annotations - -from collections import OrderedDict -from collections.abc import Iterable, Iterator, Mapping -from typing import Any, Generic, TypeVar, overload - -from .compat import MutableMapping - -_VT = TypeVar("_VT") -_D = TypeVar("_D") - - -class CaseInsensitiveDict(MutableMapping[str, _VT], Generic[_VT]): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - _store: OrderedDict[str, tuple[str, _VT]] - - def __init__( - self, - data: Mapping[str, _VT] | Iterable[tuple[str, _VT]] | None = None, - **kwargs: _VT, - ) -> None: - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key: str, value: _VT) -> None: - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key: str) -> _VT: - return self._store[key.lower()][1] - - def __delitem__(self, key: str) -> None: - del self._store[key.lower()] - - def __iter__(self) -> Iterator[str]: - return (casedkey for casedkey, _ in self._store.values()) - - def __len__(self) -> int: - return len(self._store) - - def lower_items(self) -> Iterator[tuple[str, _VT]]: - """Like iteritems(), but with all lowercase keys.""" - return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) - - def __eq__(self, other: object) -> bool: - if isinstance(other, Mapping): - other_dict: CaseInsensitiveDict[Any] = CaseInsensitiveDict(other) # type: ignore[reportUnknownArgumentType] - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other_dict.lower_items()) - - # Copy is required - def copy(self) -> CaseInsensitiveDict[_VT]: - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self) -> str: - return str(dict(self.items())) - - -class LookupDict(dict[str, _VT]): - """Dictionary lookup object.""" - - name: Any - - def __init__(self, name: Any = None) -> None: - self.name = name - super().__init__() - - def __repr__(self) -> str: - return f"" - - def __getattr__(self, key: str) -> _VT | None: - # We need this for type checkers to infer typing - # on attribute access with status_codes.py - if key in self.__dict__: - return self.__dict__[key] - else: - raise AttributeError( - f"'{type(self).__name__}' object has no attribute '{key}'" - ) - - def __getitem__(self, key: str) -> _VT | None: # type: ignore[override] - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - @overload - def get(self, key: str, default: None = None) -> _VT | None: ... - - @overload - def get(self, key: str, default: _D | _VT) -> _D | _VT: ... - - def get(self, key: str, default: _D | None = None) -> _VT | _D | None: - return self.__dict__.get(key, default) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py b/venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py deleted file mode 100755 index e2a2a32..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,1155 +0,0 @@ -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -from __future__ import annotations - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile -from collections import OrderedDict -from collections.abc import Generator, Iterable -from typing import ( - TYPE_CHECKING, - Any, - Final, - TypeVar, - cast, - overload, -) - -from pip._vendor.urllib3.util import make_headers, parse_url - -from . import certs -from .__version__ import __version__ - -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import ( # noqa: F401 - _HEADER_VALIDATORS_BYTE, # type: ignore[reportPrivateUsage] - _HEADER_VALIDATORS_STR, # type: ignore[reportPrivateUsage] - HEADER_VALIDATORS, # type: ignore[reportUnusedImport] - to_native_string, # type: ignore[reportUnusedImport] -) -from ._types import SupportsItems as _SupportsItems -from .compat import ( - Mapping, - bytes, - getproxies, - getproxies_environment, - integer_types, - is_urllib3_1, - proxy_bypass, - proxy_bypass_environment, # type: ignore[attr-defined] # https://github.com/python/cpython/issues/145331 - quote, - str, - unquote, - urlparse, - urlunparse, -) -from .compat import parse_http_list as _parse_list_header -from .cookies import cookiejar_from_dict -from .exceptions import ( - FileModeWarning, - InvalidHeader, - InvalidURL, - UnrewindableBodyError, -) -from .structures import CaseInsensitiveDict - -if TYPE_CHECKING: - from http.cookiejar import CookieJar - from io import BufferedWriter - - from . import _types as _t - from .models import PreparedRequest, Request, Response - -NETRC_FILES: Final = (".netrc", "_netrc") - - -# Certificate is extracted by certifi when needed. -DEFAULT_CA_BUNDLE_PATH: str = certs.where() - - -DEFAULT_PORTS: Final = {"http": 80, "https": 443} - -_KT = TypeVar("_KT") -_VT = TypeVar("_VT") - -# Ensure that ', ' is used to preserve previous delimiter behavior. -DEFAULT_ACCEPT_ENCODING: Final = ", ".join( - re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) -) - - -if sys.platform == "win32": - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host: str) -> bool: - try: - import winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", - ) - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] - except (OSError, ValueError): - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(";") - # filter out empty strings to avoid re.match return true in the following code. - proxyOverride = filter(None, proxyOverride) - # now check if we match one of the registry values. - for test in proxyOverride: - if test == "": - if "." not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host: str) -> bool: # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence( - d: _t.SupportsItems[Any, Any] | Iterable[tuple[Any, Any]], -) -> Iterable[tuple[Any, Any]]: - """Returns an internal sequence dictionary update.""" - - if isinstance(d, _SupportsItems): - return d.items() - - return d - - -def super_len(o: Any) -> int: - total_length = None - current_position = 0 - - if not is_urllib3_1 and isinstance(o, str): - # urllib3 2.x+ treats all strings as utf-8 instead - # of latin-1 (iso-8859-1) like http.client. - o = o.encode("utf-8") - - if hasattr(o, "__len__"): - total_length = len(o) - - elif hasattr(o, "len"): - total_length = o.len - - elif hasattr(o, "fileno"): - try: - fileno = o.fileno() - except (io.UnsupportedOperation, AttributeError): - # AttributeError is a surprising exception, seeing as how we've just checked - # that `hasattr(o, 'fileno')`. It happens for objects obtained via - # `Tarfile.extractfile()`, per issue 5229. - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if "b" not in o.mode: - warnings.warn( - ( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode." - ), - FileModeWarning, - ) - - if hasattr(o, "tell"): - try: - current_position = o.tell() - except OSError: - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, "seek") and total_length is None: - # StringIO and BytesIO have seek but no usable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except OSError: - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth( - url: _t.UriType, raise_errors: bool = False -) -> tuple[str, str] | None: - """Returns the Requests tuple auth for a given url from netrc.""" - - if isinstance(url, bytes): - url = url.decode("utf-8") - - netrc_file = os.environ.get("NETRC") - if netrc_file is not None: - netrc_locations = (netrc_file,) - else: - netrc_locations = (f"~/{f}" for f in NETRC_FILES) - - try: - from netrc import NetrcParseError, netrc - - netrc_path = None - - for f in netrc_locations: - loc = os.path.expanduser(f) - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - host = ri.hostname - - if host is None: - return - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc and any(_netrc): - # Return with login / password - login_i = 0 if _netrc[0] else 1 - return (_netrc[login_i] or "", _netrc[2] or "") - except (NetrcParseError, OSError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # App Engine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj: Any) -> str | None: - """Tries to guess the filename of the given object.""" - name = getattr(obj, "name", None) - if name and isinstance(name, (str, bytes)) and name[0] != "<" and name[-1] != ">": - return os.path.basename(name) # type: ignore[return-value] # urllib3 accepts bytes but types str only - - -def extract_zipped_paths(path: str) -> str: - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - if not prefix: - # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), - # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users - break - member = "/".join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - suffix = os.path.splitext(member.split("/")[-1])[-1] - fd, extracted_path = tempfile.mkstemp(suffix=suffix) - try: - os.write(fd, zip_file.read(member)) - finally: - os.close(fd) - - return extracted_path - - -@contextlib.contextmanager -def atomic_open(filename: str) -> Generator[BufferedWriter, None, None]: - """Write a file to the disk in an atomic fashion""" - tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) - try: - with os.fdopen(tmp_descriptor, "wb") as tmp_handler: - yield tmp_handler - os.replace(tmp_name, filename) - except BaseException: - os.remove(tmp_name) - raise - - -def from_key_val_list( - value: Mapping[Any, Any] | Iterable[tuple[Any, Any]] | None, -) -> dict[Any, Any] | None: - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - return OrderedDict(value) - - -@overload -def to_key_val_list(value: None) -> None: ... -@overload -def to_key_val_list( - value: _t.SupportsItems[_KT, _VT] | Iterable[tuple[_KT, _VT]], -) -> list[tuple[_KT, _VT]]: ... -def to_key_val_list( - value: _t.SupportsItems[_KT, _VT] | Iterable[tuple[_KT, _VT]] | None, -) -> list[tuple[_KT, _VT]] | None: - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - if isinstance(value, _SupportsItems): - return list(value.items()) - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value: str) -> 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` - :rtype: list - """ - result: list[str] = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value: str) -> dict[str, str | None]: - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> 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. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result: dict[str, str | None] = {} - 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 - - -# From mitsuhiko/werkzeug (used with permission). -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. - - :param value: the header value to unquote. - :rtype: str - """ - 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 dict_from_cookiejar(cj: CookieJar) -> dict[str, str | None]: - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {cookie.name: cookie.value for cookie in cj} - return cookie_dict - - -def add_dict_to_cookiejar(cj: CookieJar, cookie_dict: dict[str, str]) -> CookieJar: - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content: str) -> list[str]: - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn( - ( - "In requests 3.0, get_encodings_from_content will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - charset_re = re.compile(r']', flags=re.I) - pragma_re = re.compile(r']', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return ( - charset_re.findall(content) - + pragma_re.findall(content) - + xml_re.findall(content) - ) - - -def _parse_content_type_header(header: str) -> tuple[str, dict[str, Any]]: - """Returns content type and parameters from given header. - - :param header: string - :return: tuple containing content type and dictionary of - parameters. - """ - - tokens = header.split(";") - content_type, params = tokens[0].strip(), tokens[1:] - params_dict: dict[str, str | bool] = {} - strip_chars = "\"' " - - for param in params: - param = param.strip() - if param and (idx := param.find("=")) != -1: - key = param[:idx].strip(strip_chars) - value = param[idx + 1 :].strip(strip_chars) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers: CaseInsensitiveDict[str]) -> str | None: - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get("content-type") - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if "charset" in params: - return params["charset"].strip("'\"") - - if "text" in content_type: - return "ISO-8859-1" - - if "application/json" in content_type: - # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset - return "utf-8" - - -def stream_decode_response_unicode( - iterator: Iterable[bytes], r: Response -) -> Generator[str | bytes, None, None]: - """Stream decodes an iterator.""" - - if r.encoding is None: - yield from iterator - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b"", final=True) - if rv: - yield rv - - -@overload -def iter_slices( - string: bytes, slice_length: int | None -) -> Generator[bytes, None, None]: ... -@overload -def iter_slices( - string: str, slice_length: int | None -) -> Generator[str, None, None]: ... -def iter_slices( - string: bytes | str, slice_length: int | None -) -> Generator[bytes | str, None, None]: - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos : pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r: Response) -> str | bytes | None: - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn( - ( - "In requests 3.0, get_unicode_from_response will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - if r.content is None: # type: ignore[reportUnnecessaryComparison] - return None - - tried_encodings: list[str] = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding or "utf-8", errors="replace") - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET: Final = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" -) - - -def unquote_unreserved(uri: str) -> str: - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split("%") - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = f"%{parts[i]}" - else: - parts[i] = f"%{parts[i]}" - return "".join(parts) - - -def requote_uri(uri: str) -> str: - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip: str, net: str) -> bool: - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] - netaddr, bits = net.split("/") - netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask: int) -> str: - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack(">I", bits)) - - -def is_ipv4_address(string_ip: str) -> bool: - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except OSError: - return False - return True - - -def is_valid_cidr(string_network: str) -> bool: - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count("/") == 1: - try: - mask = int(string_network.split("/")[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split("/")[0]) - except OSError: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name: str, value: str | None) -> Generator[None, None, None]: - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - old_value: str | None = None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url: str, no_proxy: str | None) -> bool: - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - def get_proxy(key: str) -> str | None: - return os.environ.get(key) or os.environ.get(key.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy("no_proxy") - parsed = urlparse(url) - hostname = parsed.hostname - - if hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy_hosts = (host for host in no_proxy.replace(" ", "").split(",") if host) - - if is_ipv4_address(hostname): - for proxy_ip in no_proxy_hosts: - if is_valid_cidr(proxy_ip): - if address_in_network(hostname, proxy_ip): - return True - elif hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = hostname - if parsed.port: - host_with_port += f":{parsed.port}" - - for host in no_proxy_hosts: - host = host.lstrip(".") - if hostname == host or host_with_port == host: - return True - host = "." + host - if hostname.endswith(host) or host_with_port.endswith(host): - return True - - with set_environ("no_proxy", no_proxy_arg): - try: - bypass = proxy_bypass(hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url: str, no_proxy: str | None = None) -> dict[str, str]: - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url: str, proxies: dict[str, str] | None) -> str | None: - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get("all")) - - proxy_keys = [ - urlparts.scheme + "://" + urlparts.hostname, - urlparts.scheme, - "all://" + urlparts.hostname, - "all", - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def resolve_proxies( - request: Request | PreparedRequest, - proxies: dict[str, str] | None, - trust_env: bool = True, -) -> dict[str, str]: - """This method takes proxy information from a request and configuration - input to resolve a mapping of target proxies. This will consider settings - such as NO_PROXY to strip proxy configurations. - - :param request: Request or PreparedRequest - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - :param trust_env: Boolean declaring whether to trust environment configs - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - url = cast(str, request.url) - scheme = urlparse(url).scheme - no_proxy = proxies.get("no_proxy") - new_proxies = proxies.copy() - - if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get("all")) - - if proxy: - new_proxies.setdefault(scheme, proxy) - return new_proxies - - -def default_user_agent(name: str = "python-requests") -> str: - """ - Return a string representing the default user agent. - - :rtype: str - """ - return f"{name}/{__version__}" - - -def default_headers() -> CaseInsensitiveDict[str]: - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict( - { - "User-Agent": default_user_agent(), - "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, - "Accept": "*/*", - "Connection": "keep-alive", - } - ) - - -def parse_header_links(value: str) -> list[dict[str, str]]: - """Return a list of parsed link headers proxies. - - i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" - - :rtype: list - """ - - links: list[dict[str, str]] = [] - - replace_chars = " '\"" - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(", *<", value): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, "" - - link: dict[str, str] = {"url": url.strip("<> '\"")} - - for param in params.split(";"): - try: - key, value = param.split("=") - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data: bytes) -> str | None: - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return "utf-32" # BOM included - if sample[:3] == codecs.BOM_UTF8: - return "utf-8-sig" # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return "utf-16" # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return "utf-8" - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return "utf-16-be" - if sample[1::2] == _null2: # 2nd and 4th are null - return "utf-16-le" - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return "utf-32-be" - if sample[1:] == _null3: - return "utf-32-le" - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url: str, new_scheme: str) -> str: - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - parsed = parse_url(url) - scheme, auth, _host, _port, path, query, fragment = parsed - - # A defect in urlparse determines that there isn't a netloc present in some - # urls. We previously assumed parsing was overly cautious, and swapped the - # netloc and path. Due to a lack of tests on the original defect, this is - # maintained with parse_url for backwards compatibility. - netloc = parsed.netloc - if not netloc: - netloc, path = path, netloc - - if auth: - # parse_url doesn't provide the netloc with auth - # so we'll add it ourselves. - netloc = cast(str, netloc) - netloc = "@".join([auth, netloc]) - if scheme is None: - scheme = new_scheme - if path is None: - path = "" - - return urlunparse((scheme, netloc, path, "", query, fragment)) - - -def get_auth_from_url(url: str) -> tuple[str, str]: - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - # except handles parsed.username/password being None - auth = (unquote(parsed.username), unquote(parsed.password)) # type: ignore[arg-type] - except (AttributeError, TypeError): - auth = ("", "") - - return auth - - -def check_header_validity(header: tuple[str | bytes, str | bytes]) -> None: - """Verifies that header parts don't contain leading whitespace - reserved characters, or return characters. - - :param header: tuple, in the format (name, value). - """ - name, value = header - _validate_header_part(header, name, 0) - _validate_header_part(header, value, 1) - - -def _validate_header_part( - header: tuple[str | bytes, str | bytes], - header_part: str | bytes, - header_validator_index: int, -) -> None: - if isinstance(header_part, str): - validator = _HEADER_VALIDATORS_STR[header_validator_index] - elif isinstance(header_part, bytes): # type: ignore[reportUnnecessaryIsInstance] - # runtime guard for non-str/bytes input - validator = _HEADER_VALIDATORS_BYTE[header_validator_index] - else: - raise InvalidHeader( - f"Header part ({header_part!r}) from {header} " - f"must be of type str or bytes, not {type(header_part)}" - ) - - if not validator.match(header_part): # type: ignore[arg-type] - header_kind = "name" if header_validator_index == 0 else "value" - raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return " - f"character(s) in header {header_kind}: {header_part!r}" - ) - - -def urldefragauth(url: str) -> str: - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, _fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit("@", 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, "")) - - -def rewind_body(prepared_request: PreparedRequest) -> None: - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, "seek", None) - if body_seek is not None and isinstance( - prepared_request._body_position, # type: ignore[reportPrivateUsage] - integer_types, - ): - try: - body_seek(prepared_request._body_position) # type: ignore[reportPrivateUsage] - except OSError: - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect." - ) - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/LICENSE deleted file mode 100755 index b907776..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2018, Tzu-ping Chung - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py deleted file mode 100755 index 4c7f815..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -__all__ = [ - "AbstractProvider", - "AbstractResolver", - "BaseReporter", - "InconsistentCandidate", - "RequirementsConflicted", - "ResolutionError", - "ResolutionImpossible", - "ResolutionTooDeep", - "Resolver", - "__version__", -] - -__version__ = "1.2.1" - - -from .providers import AbstractProvider -from .reporters import BaseReporter -from .resolvers import ( - AbstractResolver, - InconsistentCandidate, - RequirementsConflicted, - ResolutionError, - ResolutionImpossible, - ResolutionTooDeep, - Resolver, -) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 7349f6ba66b2e78144e267ae98d15223c2cd6470..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 zcmcIgzi$&U6t?ejxw~9K0hJC&Obn2LSfMLIDutm86$(sVtjpP?hVzfwPNa6~AAy9# z$Wrm&bVBG>CbpBhb;3SU0viiY*7y8AJ%4`hJ0Fb(z{l4QpWfYz0Qeq?>+p3Kmxn%m z1PegHXNUoX7}AKwbtGaOL*Vbdx+fBxboZq0ixj6K!vlN%9&?jWXz8|5q@#{j5I$h~CW9 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc deleted file mode 100755 index 5bf0d548bb4595df60c6bdbecfb6bfaf8b714237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10444 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 z z>@RK`c+m2&>EXFAnjW?l2ai9Y2G7c^-s0PM7ykn@e+0b diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py deleted file mode 100755 index 524e3d8..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/providers.py +++ /dev/null @@ -1,196 +0,0 @@ -from __future__ import annotations - -from typing import ( - TYPE_CHECKING, - Generic, - Iterable, - Iterator, - Mapping, - Sequence, -) - -from .structs import CT, KT, RT, Matches, RequirementInformation - -if TYPE_CHECKING: - from typing import Any, Protocol - - class Preference(Protocol): - def __lt__(self, __other: Any) -> bool: ... - - -class AbstractProvider(Generic[RT, CT, KT]): - """Delegate class to provide the required interface for the resolver.""" - - def identify(self, requirement_or_candidate: RT | CT) -> KT: - """Given a requirement or candidate, return an identifier for it. - - This is used to identify, e.g. whether two requirements - should have their specifier parts merged or a candidate matches a - requirement via ``find_matches()``. - """ - raise NotImplementedError - - def get_preference( - self, - identifier: KT, - resolutions: Mapping[KT, CT], - candidates: Mapping[KT, Iterator[CT]], - information: Mapping[KT, Iterator[RequirementInformation[RT, CT]]], - backtrack_causes: Sequence[RequirementInformation[RT, CT]], - ) -> Preference: - """Produce a sort key for given requirement based on preference. - - As this is a sort key it will be called O(n) times per backtrack - step, where n is the number of `identifier`s, if you have a check - which is expensive in some sense. E.g. It needs to make O(n) checks - per call or takes significant wall clock time, consider using - `narrow_requirement_selection` to filter the `identifier`s, which - is applied before this sort key is called. - - The preference is defined as "I think this requirement should be - resolved first". The lower the return value is, the more preferred - this group of arguments is. - - :param identifier: An identifier as returned by ``identify()``. This - identifies the requirement being considered. - :param resolutions: Mapping of candidates currently pinned by the - resolver. Each key is an identifier, and the value is a candidate. - The candidate may conflict with requirements from ``information``. - :param candidates: Mapping of each dependency's possible candidates. - Each value is an iterator of candidates. - :param information: Mapping of requirement information of each package. - Each value is an iterator of *requirement information*. - :param backtrack_causes: Sequence of *requirement information* that are - the requirements that caused the resolver to most recently - backtrack. - - A *requirement information* instance is a named tuple with two members: - - * ``requirement`` specifies a requirement contributing to the current - list of candidates. - * ``parent`` specifies the candidate that provides (depended on) the - requirement, or ``None`` to indicate a root requirement. - - The preference could depend on various issues, including (not - necessarily in this order): - - * Is this package pinned in the current resolution result? - * How relaxed is the requirement? Stricter ones should probably be - worked on first? (I don't know, actually.) - * How many possibilities are there to satisfy this requirement? Those - with few left should likely be worked on first, I guess? - * Are there any known conflicts for this requirement? We should - probably work on those with the most known conflicts. - - A sortable value should be returned (this will be used as the ``key`` - parameter of the built-in sorting function). The smaller the value is, - the more preferred this requirement is (i.e. the sorting function - is called with ``reverse=False``). - """ - raise NotImplementedError - - def find_matches( - self, - identifier: KT, - requirements: Mapping[KT, Iterator[RT]], - incompatibilities: Mapping[KT, Iterator[CT]], - ) -> Matches[CT]: - """Find all possible candidates that satisfy the given constraints. - - :param identifier: An identifier as returned by ``identify()``. All - candidates returned by this method should produce the same - identifier. - :param requirements: A mapping of requirements that all returned - candidates must satisfy. Each key is an identifier, and the value - an iterator of requirements for that dependency. - :param incompatibilities: A mapping of known incompatibile candidates of - each dependency. Each key is an identifier, and the value an - iterator of incompatibilities known to the resolver. All - incompatibilities *must* be excluded from the return value. - - This should try to get candidates based on the requirements' types. - For VCS, local, and archive requirements, the one-and-only match is - returned, and for a "named" requirement, the index(es) should be - consulted to find concrete candidates for this requirement. - - The return value should produce candidates ordered by preference; the - most preferred candidate should come first. The return type may be one - of the following: - - * A callable that returns an iterator that yields candidates. - * An collection of candidates. - * An iterable of candidates. This will be consumed immediately into a - list of candidates. - """ - raise NotImplementedError - - def is_satisfied_by(self, requirement: RT, candidate: CT) -> bool: - """Whether the given requirement can be satisfied by a candidate. - - The candidate is guaranteed to have been generated from the - requirement. - - A boolean should be returned to indicate whether ``candidate`` is a - viable solution to the requirement. - """ - raise NotImplementedError - - def get_dependencies(self, candidate: CT) -> Iterable[RT]: - """Get dependencies of a candidate. - - This should return a collection of requirements that `candidate` - specifies as its dependencies. - """ - raise NotImplementedError - - def narrow_requirement_selection( - self, - identifiers: Iterable[KT], - resolutions: Mapping[KT, CT], - candidates: Mapping[KT, Iterator[CT]], - information: Mapping[KT, Iterator[RequirementInformation[RT, CT]]], - backtrack_causes: Sequence[RequirementInformation[RT, CT]], - ) -> Iterable[KT]: - """ - An optional method to narrow the selection of requirements being - considered during resolution. This method is called O(1) time per - backtrack step. - - :param identifiers: An iterable of `identifiers` as returned by - ``identify()``. These identify all requirements currently being - considered. - :param resolutions: A mapping of candidates currently pinned by the - resolver. Each key is an identifier, and the value is a candidate - that may conflict with requirements from ``information``. - :param candidates: A mapping of each dependency's possible candidates. - Each value is an iterator of candidates. - :param information: A mapping of requirement information for each package. - Each value is an iterator of *requirement information*. - :param backtrack_causes: A sequence of *requirement information* that are - the requirements causing the resolver to most recently - backtrack. - - A *requirement information* instance is a named tuple with two members: - - * ``requirement`` specifies a requirement contributing to the current - list of candidates. - * ``parent`` specifies the candidate that provides (is depended on for) - the requirement, or ``None`` to indicate a root requirement. - - Must return a non-empty subset of `identifiers`, with the default - implementation being to return `identifiers` unchanged. Those `identifiers` - will then be passed to the sort key `get_preference` to pick the most - prefered requirement to attempt to pin, unless `narrow_requirement_selection` - returns only 1 requirement, in which case that will be used without - calling the sort key `get_preference`. - - This method is designed to be used by the provider to optimize the - dependency resolution, e.g. if a check cost is O(m) and it can be done - against all identifiers at once then filtering the requirement selection - here will cost O(m) but making it part of the sort key in `get_preference` - will cost O(m*n), where n is the number of `identifiers`. - - Returns: - Iterable[KT]: A non-empty subset of `identifiers`. - """ - return identifiers diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/py.typed b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py deleted file mode 100755 index 6c14220..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/reporters.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Collection, Generic - -from .structs import CT, KT, RT, RequirementInformation, State - -if TYPE_CHECKING: - from .resolvers import Criterion - - -class BaseReporter(Generic[RT, CT, KT]): - """Delegate class to provide progress reporting for the resolver.""" - - def starting(self) -> None: - """Called before the resolution actually starts.""" - - def starting_round(self, index: int) -> None: - """Called before each round of resolution starts. - - The index is zero-based. - """ - - def ending_round(self, index: int, state: State[RT, CT, KT]) -> None: - """Called before each round of resolution ends. - - This is NOT called if the resolution ends at this round. Use `ending` - if you want to report finalization. The index is zero-based. - """ - - def ending(self, state: State[RT, CT, KT]) -> None: - """Called before the resolution ends successfully.""" - - def adding_requirement(self, requirement: RT, parent: CT | None) -> None: - """Called when adding a new requirement into the resolve criteria. - - :param requirement: The additional requirement to be applied to filter - the available candidaites. - :param parent: The candidate that requires ``requirement`` as a - dependency, or None if ``requirement`` is one of the root - requirements passed in from ``Resolver.resolve()``. - """ - - def resolving_conflicts( - self, causes: Collection[RequirementInformation[RT, CT]] - ) -> None: - """Called when starting to attempt requirement conflict resolution. - - :param causes: The information on the collision that caused the backtracking. - """ - - def rejecting_candidate(self, criterion: Criterion[RT, CT], candidate: CT) -> None: - """Called when rejecting a candidate during backtracking.""" - - def pinning(self, candidate: CT) -> None: - """Called when adding a candidate to the potential solution.""" diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py deleted file mode 100755 index b249221..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -from ..structs import RequirementInformation -from .abstract import AbstractResolver, Result -from .criterion import Criterion -from .exceptions import ( - InconsistentCandidate, - RequirementsConflicted, - ResolutionError, - ResolutionImpossible, - ResolutionTooDeep, - ResolverException, -) -from .resolution import Resolution, Resolver - -__all__ = [ - "AbstractResolver", - "Criterion", - "InconsistentCandidate", - "RequirementInformation", - "RequirementsConflicted", - "Resolution", - "ResolutionError", - "ResolutionImpossible", - "ResolutionTooDeep", - "Resolver", - "ResolverException", - "Result", -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index a484aad195a1aa37761c6833176ce519ca18a7eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 zcmb`Ezi$&U6vyqm(Rb3Gh3LV10P?)@&E@vk_u+N9>M0D#PfrP}! zg7`1^6EdO5D^s^f-8x}k5=E&P@mZgH&whU2=jR`3ngBa~fBE*|+5_N^b9Te}&A6S~ z-&a5YfedhnAq2!DKJ&Pbecr;Y#&5AU4{*@fZ5HwfM?A(cPjJFJxWl`+%Tt^-`vE)R zJ>27c+=pNWNcbJ%V-mdsgZRd&4xo8_K|jq)Nja_bxS9&db6tw+2D)v}^j}SsmU*Es zs1j^Jr3tJxXWAZ(N3zsZ+UP-G9*wI)RH{_kCK}}xDM_yBL3%Y3)s&Tmro{A`d~+vt zE~Sv>;eKJvYoSy*VbmP&SKkZqn$mi^WGgxUT+rGjuw^FuI1@Ft4H$G~+ulNk4v~ZJ z5IY<>xF?Yvhpt1T%fq?$Lg=l*|3e?ZlY7-{+;uDMSfw4VL-)xi_7Z;q Dm7MuE diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-311.pyc deleted file mode 100755 index 435a0e385a9dc43a7e1c4b7109d31e9454b1d2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2795 zcma(TO-~y~bk<(mi$D0x2Q;BwNZP~+v71KffhLtwl9Ck3iKwfp8=+;{8O(>%znS;u&HEmHEtT>F z#vecZd_R{ZLy=AbpC3<)Gf zrU}hIB(%UJmSshjXNAS|NTMBiCKB>He9=&j*+VJ9QumK1JG9UswD^ngECqb)z^SP$`ce%4-P{v`e_=V=NS>`$%q`nX$eR`(20ZULvM-7t^>o4q8VCM;8L=h-a zQr|!XS(>JEN#`h+}Hp9^x9=DLR6SRd}v z7U=SZTytzT7i1c!|N5!JbBT8MW+N$cfuu)!S`C~asj3a0QPm)?s+L2WCgMd^ebCg* zn9`@JN1U#zzmYvObDvh19E(*gjq6VJE2rUHse*#l6=ttgO=F?zuK7!jeWh~wa@7ML zU2-*jS!*z_>KblU1vcvNDrcT!t}x_}QSMc>*!dNAjSs<9At(XjeF|Xn$X{C;ZH04N z8f{DGTH)N5&b6gWt#EE92tS<&DyR7|#4%6#2>@M@i}O_2`v@q9k)wi=W}=dz{Zx7= zDp@)}d*L@n`ygV2hxr1LLwor8mHHBs{UwMOK+Tt3#upuKd9Y$KBo_Er4lQnCF3YP9 zU#id;>DLo54&a151F0bKI1TrQk0xaoPnI*k$?ZVI)X)zK3ammCVJ+;9hbC?a z8$<;x8XGBCVRDCq5-?Awl~Y`XHOB+xbRc@nTs++IP`E71d=!2$r3~BfRdszNu_19v zB_W*xMh{)TNjiBlGWJOPvD6-x@#hizg|P~XoIPklU0Tfcz5QZR%V6YOkX>HYc*Elv zkg-1q@}XRgTCc}p1Tq*3Ujgmy2jmIyaW5V}2xUS03mEF!GK59e9n*wHfDv&PVP#_% zFyQ_P*>eqFcA9<|z$1|Z6fUpi^WcGS)RznoLW|D#KqQ0;Sipv`X`xumfJMXZP5=++ zY(ic&{3RIzb|9_M)HobwjLMqtb7P_DGkJbK?gjJnQFei*KIn<}hWSTjU9+h{K_=+n z9Y|Zz%qH_HGA8FTTLT)$EM*4AlP;RR!enT8wr?yNjC)7ynsha;S-^J~l}Y*fyIoc} zxHUc*#SG3+YM_h30iXk9KA6TE%`nc9IbL%?H#N@#a1lUvPUm8` zt`EPF(lO->p23%Vll(nQ`o>$*SeV7NayBZIF_et;!;zJrMerd2pof=Uzzw`P%;|_e zfpm$V#NA;8`1S@lRi%y&ZMx@XVsX&h?E!usxvL1U)S}*p)yY3d09Kzj4dAeyw#92L z@!Ib3_cv=DF`F6dkZ#al%#3%)J3w>?iZ7qU$7Hby1pto;Ps3JFI4mqL$ogyej&Ttv zk+txT58*ik5_0FD>YBRmadaq$(j~lz0H1)MC+U$M?+w>UFZ6g{xQ^d9$L0fg2p^Cj zk8c_E@%@in(CwCe>1y=&ea=4vc5E2lEr6Z0AP8+T-s+yaWU!UYHo4LIe{+{qTmLn8 z)BPP%5bg?XaiY~d+v53F_iT%2TivrGrZbfec@sQ-@9DQ&v(E>g&u%F@qaVLSmRGOw z6-n>eNB4G0XSQy&Dz#{Cm+tJ8?reV9$&LsR`!~Vk)u(*xlP&&qedpwbm&owyEnH!8 F{0rND|3m-) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-311.pyc deleted file mode 100755 index 4a5a9704d4adeadf47d983d77b0c6fc9eaf0a3e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3532 zcmd59O>YxNbY}gLjbli{cS}`GP=PokHjq}OD4?oog(y`dAmU((oXyUJEbNDwSqB^$ zi30}?98g6?)T$CETEwM4B}h?~?g^=v_GT1LIrY6+du=B{y>>Hx^XBcmdEaj~zwX+V zBk=t3^ru^YX9@WW7wxAnM(D;ZK%Nm!ICY6f%akH+xQ3T1r@VAI?PbatFI&z6J;l>* zpJ$d$ufN>y<;poq403_+%tOMnA}#ubxnO+ImOx&l2zdp+_$d$YzN@5Q{)5W`jRq{= z4?-(+0$&xboF(Asst1FNQ)|^R8%NVIco8kUbR{)3cFrWi~o+Mck=5 zQh34-FZv6C^z@N-EHsA50uS9d4e%Keq)a&}8=RI?d=Jk(1S|Poo`*TZ_wn5@XZe0U z1aluB2AvN?{nOF`RX{oGGFWs)RHaZLQOjb%0;>i}IiM&5df?X33`A>gsPMJLs+N7* zx+#je9D`?e(NSzMaJgdPq7;HzVJMyXS}4@nc*huB?6?b#^JA%wf0Km)r~*>#wx#3D@;T5%>mVDJ4!1%9G%I9P87w(m zpaE!g5`svqY9^2?y=OJ=?8u z!4_oTq3Q~xOC5kjWQT3LEHu_~d^8nhCIRd4FfMq_4h3(?)Pm5unvdZGkM}sN%VvlT zxGFZo@wb@W4#dTfsl}k?a^{OAA=$iO!mEb$akNZSLw0vj_}ZIE2z1E&PIBl}YH24e zM+x4O1Zq0)7hDHTm}8@k4<|YheA`ljIiWtxy=&D~EVt0g#bOa%FV3EA9o))J+qINJ z9>))b53a!sL7neGA^70JI&(a)7Gil8+1S|E0Uk3p#*h}alZJt3>ZrB@g^(nDe36Kvx-Tj&-`k^_{c-`jy#n27EW7;cb!F+}*{FXJ@4dYtoO> zGl4JcwC)lyz?K1pPB%{KmeHUMQb}Gn3|P_jvXO#StHls#o>$3BI#Wo=-LOFpA=m=| zT3lKQcVP=zp-}7yo1(NBc%tN4(hf@B1~-Grl2xsimW01la-I27wH_`8{$%mgsgisaQlYdHM*sz_(Qdm22;3_4In3K1ZagFn zax3Bdn!JEbuab=~;LWS#?S0Bq4f-?T>0eUNjWaXL#yIN{3zr+2#Ap=(xkM<4Zjc*8 z-$PXH)B6S|zz*%cVE{CK$y_7PC?$`FIUbkZq@&B(akk`G=Qe3!=B2(}iYKEK6nK=a zS`zxa0;4cY5^uN7{;8XALEWp$^UFuOohad2s8otmZeUxkI$un-9S1IT3Bcd*2fii7 zNKS)4C(itK_4i||`OzmS05Ddr#WTQWs=ckl(81(kIBz+Z$RCvq2n8cb-wGUGCtksj zhkzF4yIYmQRBc&;*$^w;n+-AT7;ID*06ZY;2M<51|4{EpU!VGNZR$I%;ajxk9Rk1( zA$BPDDBsMIq4AaPRtHbChIvA3+^TN4$)Qqj^h7bKxlceQCXY@Mz~g6Yl0fW?nQaH? zG{6IrG#I!~8x+5C;-?k-JQk`v2sHc_>2lCZLmmNYM4fI=$)iA9o=Ci1#LofnUFX`{ z9`y-eQK(8B_0_>MFrJS*p-*?kcsJC}c}aELV8Xa5tbjP>qM@zwmOp&IF5}3InF@i6 zg@$X#KL=^A2hXel!8{X(Vy|wr7>emx)?nBK|0fZV=r*Yx*p;qv5JtBc9#`lNRfny+ z$N!V7gOe+l!T%;8TZZG?fY2F^8OvABVXciJo@=3Ye!DQ{CaS54P=>< z`uv%K8TbD|l%wy4VZ`u)kb4pAL$DtJ)UL*{CAaZH7mlB@1rrO{w>(j)M7c`E3wX^% zJYT8YsabC8O<$$L0~;#+L*S942u>mR48aHjY$dw2$z6ycFyW_s01uMCrZJo`n*_lz zGc(yFyzDY?OwFWDOGdoJb-tFK?--@yF)k^m1;9GqAZig+}CI13rU9PhL diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-311.pyc deleted file mode 100755 index 2c06e3bbaa612c823a0635f7319eda47698169ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5055 zcmd5=&2JmW6`%bexuhhM@`vJ&$XVNQR3$cP#YtNft`morWyYwQIzrJhFc#GANTR#k zWoAg#Qsh<#162zHMF9sEdeWg#BRB^gdeC2xGi3<1us{I=z1TMi(xK3)@6D1+E@{P1 z3ltshKF!X&nR)X*e)C3u?deGnD1U$O=iASsg!~gf8b$Lf($4oJLLL%}SdvXjQeKj< zF57ZR$txu_ua+YD2(&4dYDY`4e5|D9wNgAEmk3o@)QVV9J5lP&cS%GhBgBf`BbG+H zmlZ-D!RwcNkLZg-UxN0~2-Rq8LO#~$Cd(>t!&~P*Ah^4LyZaTmlY+YkxDU{twsljY zFA04qntJKFy@IREn;{2Nkbp?3bSm8`%~T>Ls`*$F5^hWle1%9fTvigZJqL5( z0`V*>R$!d#n7Cx4U@sJD=OECBgp#~uk-Th4dBu`JK*j65Nx5rJQ#O3Zq-7Lg_M0pE zc!5*hv!0kK09OQZJ({l_{#Ty1aUQBABGYXrTg=6u4f{ z$E%ZRF?4iL^)$n93MFb7UcxYZIicQd7@t=QcD*NN7?x`q#tPX%UF}U|rrZ+ElnTsr zGatK??!`=@T+U2WXF6jS$1~-b%9QI|Ob-oZIOzO*xnTaPFiCl)Tr6h{V6$A7sY{9c z4S{*4sls%5h8=*#1nGhbKM7<$_-)B*MB5@E!VWhEgiKtI8i-8j{#~n)wFNRES&@6) zVC=XRy9d#^K<-HS2pB#Qawwj4oe8^Wf)c&B+3=*j-oU9oyE%4F&yL;lqKsCm%<8u!BH?>pJzwlFM9*X>>Dky)Ux$- zV?I1_U6Gg$^K-PY zFRTZ^Aw-!y`R$^jck*jM=E-LA?I+2h$H}41?$jT1e?S3I#>!uQ^JL)K0Z0$ooOkP7)B!{r$XFwnn8ow=Bj+_Be_92=Q0YP6%#5Tkl zCQKicx|hEI&f+a_maw!CoOO9eat?SeFY*c;kXblYiWZy+fM$&#Pz($TN*&_@ zwJhNdJIZ&$xR4QijC`hocv|SYG zzlS}B#|gtDx)tx(JJ2wDVLu!02Xq5C*EuA3QVmAfd8`X(Nn;HGhoRNk1t2YuC8B?} z|6A8X1@Id{5UnmfNoF4>vw&9jN52zfMHGZAAbhdmmRupQ(e; z53mslMo1?JDTqJ&k%WpM^itx35Uydu8Jh(WV0g6cK>I*MWe2>zcly=`~G%+V?u-a$O7X^CL?37rX+)RwC`T6~`#% zKphVI0X8DR*yCu;(5b0J`q5!unfOkD^Sz=|M4KmM;1sd?4Nti1nCo7pwCr^;x9V7i z3AExVMW@nCA^smMkGWFA@>t)`^2eK&ukS1{JBBnL1kz#l6YJX94ee}AJG*(}tp#;M zJ6aQuZ+Vr81xIkzAgy9q{A`D(VQfV5eRw;qEk_10M|x%ATN~#a9Xy2B)rl(HwBYK> z(B-{oWu^@GV1~yLiy(<&a}3Uis#)QFb`!^T{3nio1au=uJh+kjH_q3v8`UEKNw}-n z1q)-=o_5K^8aj5;&-n)LuXT)vs6C z+PkaMU;lO+8Frgo$0aF_^0t#&-@rCD?>751Rf1^mB#R$>HM08An!I}L>z{68|8A4% VfFgm*zN$-6 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 Ai~s-t diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py deleted file mode 100755 index db32b3b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -import collections -from typing import TYPE_CHECKING, Any, Generic, Iterable, NamedTuple - -from ..structs import CT, KT, RT, DirectedGraph - -if TYPE_CHECKING: - from ..providers import AbstractProvider - from ..reporters import BaseReporter - from .criterion import Criterion - - class Result(NamedTuple, Generic[RT, CT, KT]): - mapping: dict[KT, CT] - graph: DirectedGraph[KT | None] - criteria: dict[KT, Criterion[RT, CT]] - -else: - Result = collections.namedtuple("Result", ["mapping", "graph", "criteria"]) - - -class AbstractResolver(Generic[RT, CT, KT]): - """The thing that performs the actual resolution work.""" - - base_exception = Exception - - def __init__( - self, - provider: AbstractProvider[RT, CT, KT], - reporter: BaseReporter[RT, CT, KT], - ) -> None: - self.provider = provider - self.reporter = reporter - - def resolve(self, requirements: Iterable[RT], **kwargs: Any) -> Result[RT, CT, KT]: - """Take a collection of constraints, spit out the resolution result. - - This returns a representation of the final resolution state, with one - guarenteed attribute ``mapping`` that contains resolved candidates as - values. The keys are their respective identifiers. - - :param requirements: A collection of constraints. - :param kwargs: Additional keyword arguments that subclasses may accept. - - :raises: ``self.base_exception`` or its subclass. - """ - raise NotImplementedError diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py deleted file mode 100755 index ee5019c..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - -from typing import Collection, Generic, Iterable, Iterator - -from ..structs import CT, RT, RequirementInformation - - -class Criterion(Generic[RT, CT]): - """Representation of possible resolution results of a package. - - This holds three attributes: - - * `information` is a collection of `RequirementInformation` pairs. - Each pair is a requirement contributing to this criterion, and the - candidate that provides the requirement. - * `incompatibilities` is a collection of all known not-to-work candidates - to exclude from consideration. - * `candidates` is a collection containing all possible candidates deducted - from the union of contributing requirements and known incompatibilities. - It should never be empty, except when the criterion is an attribute of a - raised `RequirementsConflicted` (in which case it is always empty). - - .. note:: - This class is intended to be externally immutable. **Do not** mutate - any of its attribute containers. - """ - - def __init__( - self, - candidates: Iterable[CT], - information: Collection[RequirementInformation[RT, CT]], - incompatibilities: Collection[CT], - ) -> None: - self.candidates = candidates - self.information = information - self.incompatibilities = incompatibilities - - def __repr__(self) -> str: - requirements = ", ".join( - f"({req!r}, via={parent!r})" for req, parent in self.information - ) - return f"Criterion({requirements})" - - def iter_requirement(self) -> Iterator[RT]: - return (i.requirement for i in self.information) - - def iter_parent(self) -> Iterator[CT | None]: - return (i.parent for i in self.information) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py deleted file mode 100755 index 35e2755..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Collection, Generic - -from ..structs import CT, RT, RequirementInformation - -if TYPE_CHECKING: - from .criterion import Criterion - - -class ResolverException(Exception): - """A base class for all exceptions raised by this module. - - Exceptions derived by this class should all be handled in this module. Any - bubbling pass the resolver should be treated as a bug. - """ - - -class RequirementsConflicted(ResolverException, Generic[RT, CT]): - def __init__(self, criterion: Criterion[RT, CT]) -> None: - super().__init__(criterion) - self.criterion = criterion - - def __str__(self) -> str: - return "Requirements conflict: {}".format( - ", ".join(repr(r) for r in self.criterion.iter_requirement()), - ) - - -class InconsistentCandidate(ResolverException, Generic[RT, CT]): - def __init__(self, candidate: CT, criterion: Criterion[RT, CT]): - super().__init__(candidate, criterion) - self.candidate = candidate - self.criterion = criterion - - def __str__(self) -> str: - return "Provided candidate {!r} does not satisfy {}".format( - self.candidate, - ", ".join(repr(r) for r in self.criterion.iter_requirement()), - ) - - -class ResolutionError(ResolverException): - pass - - -class ResolutionImpossible(ResolutionError, Generic[RT, CT]): - def __init__(self, causes: Collection[RequirementInformation[RT, CT]]): - super().__init__(causes) - # causes is a list of RequirementInformation objects - self.causes = causes - - -class ResolutionTooDeep(ResolutionError): - def __init__(self, round_count: int) -> None: - super().__init__(round_count) - self.round_count = round_count diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py deleted file mode 100755 index 8c13d3b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +++ /dev/null @@ -1,627 +0,0 @@ -from __future__ import annotations - -import collections -import itertools -import operator -from typing import TYPE_CHECKING, Generic - -from ..structs import ( - CT, - KT, - RT, - DirectedGraph, - IterableView, - IteratorMapping, - RequirementInformation, - State, - build_iter_view, -) -from .abstract import AbstractResolver, Result -from .criterion import Criterion -from .exceptions import ( - InconsistentCandidate, - RequirementsConflicted, - ResolutionImpossible, - ResolutionTooDeep, - ResolverException, -) - -if TYPE_CHECKING: - from collections.abc import Collection, Iterable, Mapping - - from ..providers import AbstractProvider, Preference - from ..reporters import BaseReporter - -_OPTIMISTIC_BACKJUMPING_RATIO: float = 0.1 - - -def _build_result(state: State[RT, CT, KT]) -> Result[RT, CT, KT]: - mapping = state.mapping - all_keys: dict[int, KT | None] = {id(v): k for k, v in mapping.items()} - all_keys[id(None)] = None - - graph: DirectedGraph[KT | None] = DirectedGraph() - graph.add(None) # Sentinel as root dependencies' parent. - - connected: set[KT | None] = {None} - for key, criterion in state.criteria.items(): - if not _has_route_to_root(state.criteria, key, all_keys, connected): - continue - if key not in graph: - graph.add(key) - for p in criterion.iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey not in graph: - graph.add(pkey) - graph.connect(pkey, key) - - return Result( - mapping={k: v for k, v in mapping.items() if k in connected}, - graph=graph, - criteria=state.criteria, - ) - - -class Resolution(Generic[RT, CT, KT]): - """Stateful resolution object. - - This is designed as a one-off object that holds information to kick start - the resolution process, and holds the results afterwards. - """ - - def __init__( - self, - provider: AbstractProvider[RT, CT, KT], - reporter: BaseReporter[RT, CT, KT], - ) -> None: - self._p = provider - self._r = reporter - self._states: list[State[RT, CT, KT]] = [] - - # Optimistic backjumping variables - self._optimistic_backjumping_ratio = _OPTIMISTIC_BACKJUMPING_RATIO - self._save_states: list[State[RT, CT, KT]] | None = None - self._optimistic_start_round: int | None = None - - @property - def state(self) -> State[RT, CT, KT]: - try: - return self._states[-1] - except IndexError as e: - raise AttributeError("state") from e - - def _push_new_state(self) -> None: - """Push a new state into history. - - This new state will be used to hold resolution results of the next - coming round. - """ - base = self._states[-1] - state = State( - mapping=base.mapping.copy(), - criteria=base.criteria.copy(), - backtrack_causes=base.backtrack_causes[:], - ) - self._states.append(state) - - def _add_to_criteria( - self, - criteria: dict[KT, Criterion[RT, CT]], - requirement: RT, - parent: CT | None, - ) -> None: - self._r.adding_requirement(requirement=requirement, parent=parent) - - identifier = self._p.identify(requirement_or_candidate=requirement) - criterion = criteria.get(identifier) - if criterion: - incompatibilities = list(criterion.incompatibilities) - else: - incompatibilities = [] - - matches = self._p.find_matches( - identifier=identifier, - requirements=IteratorMapping( - criteria, - operator.methodcaller("iter_requirement"), - {identifier: [requirement]}, - ), - incompatibilities=IteratorMapping( - criteria, - operator.attrgetter("incompatibilities"), - {identifier: incompatibilities}, - ), - ) - - if criterion: - information = list(criterion.information) - information.append(RequirementInformation(requirement, parent)) - else: - information = [RequirementInformation(requirement, parent)] - - criterion = Criterion( - candidates=build_iter_view(matches), - information=information, - incompatibilities=incompatibilities, - ) - if not criterion.candidates: - raise RequirementsConflicted(criterion) - criteria[identifier] = criterion - - def _remove_information_from_criteria( - self, criteria: dict[KT, Criterion[RT, CT]], parents: Collection[KT] - ) -> None: - """Remove information from parents of criteria. - - Concretely, removes all values from each criterion's ``information`` - field that have one of ``parents`` as provider of the requirement. - - :param criteria: The criteria to update. - :param parents: Identifiers for which to remove information from all criteria. - """ - if not parents: - return - for key, criterion in criteria.items(): - criteria[key] = Criterion( - criterion.candidates, - [ - information - for information in criterion.information - if ( - information.parent is None - or self._p.identify(information.parent) not in parents - ) - ], - criterion.incompatibilities, - ) - - def _get_preference(self, name: KT) -> Preference: - return self._p.get_preference( - identifier=name, - resolutions=self.state.mapping, - candidates=IteratorMapping( - self.state.criteria, - operator.attrgetter("candidates"), - ), - information=IteratorMapping( - self.state.criteria, - operator.attrgetter("information"), - ), - backtrack_causes=self.state.backtrack_causes, - ) - - def _is_current_pin_satisfying( - self, name: KT, criterion: Criterion[RT, CT] - ) -> bool: - try: - current_pin = self.state.mapping[name] - except KeyError: - return False - return all( - self._p.is_satisfied_by(requirement=r, candidate=current_pin) - for r in criterion.iter_requirement() - ) - - def _get_updated_criteria(self, candidate: CT) -> dict[KT, Criterion[RT, CT]]: - criteria = self.state.criteria.copy() - for requirement in self._p.get_dependencies(candidate=candidate): - self._add_to_criteria(criteria, requirement, parent=candidate) - return criteria - - def _attempt_to_pin_criterion(self, name: KT) -> list[Criterion[RT, CT]]: - criterion = self.state.criteria[name] - - causes: list[Criterion[RT, CT]] = [] - for candidate in criterion.candidates: - try: - criteria = self._get_updated_criteria(candidate) - except RequirementsConflicted as e: - self._r.rejecting_candidate(e.criterion, candidate) - causes.append(e.criterion) - continue - - # Check the newly-pinned candidate actually works. This should - # always pass under normal circumstances, but in the case of a - # faulty provider, we will raise an error to notify the implementer - # to fix find_matches() and/or is_satisfied_by(). - satisfied = all( - self._p.is_satisfied_by(requirement=r, candidate=candidate) - for r in criterion.iter_requirement() - ) - if not satisfied: - raise InconsistentCandidate(candidate, criterion) - - self._r.pinning(candidate=candidate) - self.state.criteria.update(criteria) - - # Put newly-pinned candidate at the end. This is essential because - # backtracking looks at this mapping to get the last pin. - self.state.mapping.pop(name, None) - self.state.mapping[name] = candidate - - return [] - - # All candidates tried, nothing works. This criterion is a dead - # end, signal for backtracking. - return causes - - def _patch_criteria( - self, incompatibilities_from_broken: list[tuple[KT, list[CT]]] - ) -> bool: - # Create a new state from the last known-to-work one, and apply - # the previously gathered incompatibility information. - for k, incompatibilities in incompatibilities_from_broken: - if not incompatibilities: - continue - try: - criterion = self.state.criteria[k] - except KeyError: - continue - matches = self._p.find_matches( - identifier=k, - requirements=IteratorMapping( - self.state.criteria, - operator.methodcaller("iter_requirement"), - ), - incompatibilities=IteratorMapping( - self.state.criteria, - operator.attrgetter("incompatibilities"), - {k: incompatibilities}, - ), - ) - candidates: IterableView[CT] = build_iter_view(matches) - if not candidates: - return False - incompatibilities.extend(criterion.incompatibilities) - self.state.criteria[k] = Criterion( - candidates=candidates, - information=list(criterion.information), - incompatibilities=incompatibilities, - ) - return True - - def _save_state(self) -> None: - """Save states for potential rollback if optimistic backjumping fails.""" - if self._save_states is None: - self._save_states = [ - State( - mapping=s.mapping.copy(), - criteria=s.criteria.copy(), - backtrack_causes=s.backtrack_causes[:], - ) - for s in self._states - ] - - def _rollback_states(self) -> None: - """Rollback states and disable optimistic backjumping.""" - self._optimistic_backjumping_ratio = 0.0 - if self._save_states: - self._states = self._save_states - self._save_states = None - - def _backjump(self, causes: list[RequirementInformation[RT, CT]]) -> bool: - """Perform backjumping. - - When we enter here, the stack is like this:: - - [ state Z ] - [ state Y ] - [ state X ] - .... earlier states are irrelevant. - - 1. No pins worked for Z, so it does not have a pin. - 2. We want to reset state Y to unpinned, and pin another candidate. - 3. State X holds what state Y was before the pin, but does not - have the incompatibility information gathered in state Y. - - Each iteration of the loop will: - - 1. Identify Z. The incompatibility is not always caused by the latest - state. For example, given three requirements A, B and C, with - dependencies A1, B1 and C1, where A1 and B1 are incompatible: the - last state might be related to C, so we want to discard the - previous state. - 2. Discard Z. - 3. Discard Y but remember its incompatibility information gathered - previously, and the failure we're dealing with right now. - 4. Push a new state Y' based on X, and apply the incompatibility - information from Y to Y'. - 5a. If this causes Y' to conflict, we need to backtrack again. Make Y' - the new Z and go back to step 2. - 5b. If the incompatibilities apply cleanly, end backtracking. - """ - incompatible_reqs: Iterable[CT | RT] = itertools.chain( - (c.parent for c in causes if c.parent is not None), - (c.requirement for c in causes), - ) - incompatible_deps = {self._p.identify(r) for r in incompatible_reqs} - while len(self._states) >= 3: - # Remove the state that triggered backtracking. - del self._states[-1] - - # Optimistically backtrack to a state that caused the incompatibility - broken_state = self.state - while True: - # Retrieve the last candidate pin and known incompatibilities. - try: - broken_state = self._states.pop() - name, candidate = broken_state.mapping.popitem() - except (IndexError, KeyError): - raise ResolutionImpossible(causes) from None - - if ( - not self._optimistic_backjumping_ratio - and name not in incompatible_deps - ): - # For safe backjumping only backjump if the current dependency - # is not the same as the incompatible dependency - break - - # On the first time a non-safe backjump is done the state - # is saved so we can restore it later if the resolution fails - if ( - self._optimistic_backjumping_ratio - and self._save_states is None - and name not in incompatible_deps - ): - self._save_state() - - # If the current dependencies and the incompatible dependencies - # are overlapping then we have likely found a cause of the - # incompatibility - current_dependencies = { - self._p.identify(d) for d in self._p.get_dependencies(candidate) - } - if not current_dependencies.isdisjoint(incompatible_deps): - break - - # Fallback: We should not backtrack to the point where - # broken_state.mapping is empty, so stop backtracking for - # a chance for the resolution to recover - if not broken_state.mapping: - break - - # Guard: We need at least two state to remain to both - # backtrack and push a new state - if len(self._states) <= 1: - raise ResolutionImpossible(causes) - - incompatibilities_from_broken = [ - (k, list(v.incompatibilities)) for k, v in broken_state.criteria.items() - ] - - # Also mark the newly known incompatibility. - incompatibilities_from_broken.append((name, [candidate])) - - self._push_new_state() - success = self._patch_criteria(incompatibilities_from_broken) - - # It works! Let's work on this new state. - if success: - return True - - # State does not work after applying known incompatibilities. - # Try the still previous state. - - # No way to backtrack anymore. - return False - - def _extract_causes( - self, criteron: list[Criterion[RT, CT]] - ) -> list[RequirementInformation[RT, CT]]: - """Extract causes from list of criterion and deduplicate""" - return list({id(i): i for c in criteron for i in c.information}.values()) - - def resolve(self, requirements: Iterable[RT], max_rounds: int) -> State[RT, CT, KT]: - if self._states: - raise RuntimeError("already resolved") - - self._r.starting() - - # Initialize the root state. - self._states = [ - State( - mapping=collections.OrderedDict(), - criteria={}, - backtrack_causes=[], - ) - ] - for r in requirements: - try: - self._add_to_criteria(self.state.criteria, r, parent=None) - except RequirementsConflicted as e: - raise ResolutionImpossible(e.criterion.information) from e - - # The root state is saved as a sentinel so the first ever pin can have - # something to backtrack to if it fails. The root state is basically - # pinning the virtual "root" package in the graph. - self._push_new_state() - - # Variables for optimistic backjumping - optimistic_rounds_cutoff: int | None = None - optimistic_backjumping_start_round: int | None = None - - for round_index in range(max_rounds): - self._r.starting_round(index=round_index) - - # Handle if optimistic backjumping has been running for too long - if self._optimistic_backjumping_ratio and self._save_states is not None: - if optimistic_backjumping_start_round is None: - optimistic_backjumping_start_round = round_index - optimistic_rounds_cutoff = int( - (max_rounds - round_index) * self._optimistic_backjumping_ratio - ) - - if optimistic_rounds_cutoff <= 0: - self._rollback_states() - continue - elif optimistic_rounds_cutoff is not None: - if ( - round_index - optimistic_backjumping_start_round - >= optimistic_rounds_cutoff - ): - self._rollback_states() - continue - - unsatisfied_names = [ - key - for key, criterion in self.state.criteria.items() - if not self._is_current_pin_satisfying(key, criterion) - ] - - # All criteria are accounted for. Nothing more to pin, we are done! - if not unsatisfied_names: - self._r.ending(state=self.state) - return self.state - - # keep track of satisfied names to calculate diff after pinning - satisfied_names = set(self.state.criteria.keys()) - set(unsatisfied_names) - - if len(unsatisfied_names) > 1: - narrowed_unstatisfied_names = list( - self._p.narrow_requirement_selection( - identifiers=unsatisfied_names, - resolutions=self.state.mapping, - candidates=IteratorMapping( - self.state.criteria, - operator.attrgetter("candidates"), - ), - information=IteratorMapping( - self.state.criteria, - operator.attrgetter("information"), - ), - backtrack_causes=self.state.backtrack_causes, - ) - ) - else: - narrowed_unstatisfied_names = unsatisfied_names - - # If there are no unsatisfied names use unsatisfied names - if not narrowed_unstatisfied_names: - raise RuntimeError("narrow_requirement_selection returned 0 names") - - # If there is only 1 unsatisfied name skip calling self._get_preference - if len(narrowed_unstatisfied_names) > 1: - # Choose the most preferred unpinned criterion to try. - name = min(narrowed_unstatisfied_names, key=self._get_preference) - else: - name = narrowed_unstatisfied_names[0] - - failure_criterion = self._attempt_to_pin_criterion(name) - - if failure_criterion: - causes = self._extract_causes(failure_criterion) - # Backjump if pinning fails. The backjump process puts us in - # an unpinned state, so we can work on it in the next round. - self._r.resolving_conflicts(causes=causes) - - try: - success = self._backjump(causes) - except ResolutionImpossible: - if self._optimistic_backjumping_ratio and self._save_states: - failed_optimistic_backjumping = True - else: - raise - else: - failed_optimistic_backjumping = bool( - not success - and self._optimistic_backjumping_ratio - and self._save_states - ) - - if failed_optimistic_backjumping and self._save_states: - self._rollback_states() - else: - self.state.backtrack_causes[:] = causes - - # Dead ends everywhere. Give up. - if not success: - raise ResolutionImpossible(self.state.backtrack_causes) - else: - # discard as information sources any invalidated names - # (unsatisfied names that were previously satisfied) - newly_unsatisfied_names = { - key - for key, criterion in self.state.criteria.items() - if key in satisfied_names - and not self._is_current_pin_satisfying(key, criterion) - } - self._remove_information_from_criteria( - self.state.criteria, newly_unsatisfied_names - ) - # Pinning was successful. Push a new state to do another pin. - self._push_new_state() - - self._r.ending_round(index=round_index, state=self.state) - - raise ResolutionTooDeep(max_rounds) - - -class Resolver(AbstractResolver[RT, CT, KT]): - """The thing that performs the actual resolution work.""" - - base_exception = ResolverException - - def resolve( # type: ignore[override] - self, - requirements: Iterable[RT], - max_rounds: int = 100, - ) -> Result[RT, CT, KT]: - """Take a collection of constraints, spit out the resolution result. - - The return value is a representation to the final resolution result. It - is a tuple subclass with three public members: - - * `mapping`: A dict of resolved candidates. Each key is an identifier - of a requirement (as returned by the provider's `identify` method), - and the value is the resolved candidate. - * `graph`: A `DirectedGraph` instance representing the dependency tree. - The vertices are keys of `mapping`, and each edge represents *why* - a particular package is included. A special vertex `None` is - included to represent parents of user-supplied requirements. - * `criteria`: A dict of "criteria" that hold detailed information on - how edges in the graph are derived. Each key is an identifier of a - requirement, and the value is a `Criterion` instance. - - The following exceptions may be raised if a resolution cannot be found: - - * `ResolutionImpossible`: A resolution cannot be found for the given - combination of requirements. The `causes` attribute of the - exception is a list of (requirement, parent), giving the - requirements that could not be satisfied. - * `ResolutionTooDeep`: The dependency tree is too deeply nested and - the resolver gave up. This is usually caused by a circular - dependency, but you can try to resolve this by increasing the - `max_rounds` argument. - """ - resolution = Resolution(self.provider, self.reporter) - state = resolution.resolve(requirements, max_rounds=max_rounds) - return _build_result(state) - - -def _has_route_to_root( - criteria: Mapping[KT, Criterion[RT, CT]], - key: KT | None, - all_keys: dict[int, KT | None], - connected: set[KT | None], -) -> bool: - if key in connected: - return True - if key not in criteria: - return False - assert key is not None - for p in criteria[key].iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey in connected: - connected.add(key) - return True - if _has_route_to_root(criteria, pkey, all_keys, connected): - connected.add(key) - return True - return False diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py b/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py deleted file mode 100755 index 18c74d4..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/resolvelib/structs.py +++ /dev/null @@ -1,209 +0,0 @@ -from __future__ import annotations - -import itertools -from collections import namedtuple -from typing import ( - TYPE_CHECKING, - Callable, - Generic, - Iterable, - Iterator, - Mapping, - NamedTuple, - Sequence, - TypeVar, - Union, -) - -KT = TypeVar("KT") # Identifier. -RT = TypeVar("RT") # Requirement. -CT = TypeVar("CT") # Candidate. - -Matches = Union[Iterable[CT], Callable[[], Iterable[CT]]] - -if TYPE_CHECKING: - from .resolvers.criterion import Criterion - - class RequirementInformation(NamedTuple, Generic[RT, CT]): - requirement: RT - parent: CT | None - - class State(NamedTuple, Generic[RT, CT, KT]): - """Resolution state in a round.""" - - mapping: dict[KT, CT] - criteria: dict[KT, Criterion[RT, CT]] - backtrack_causes: list[RequirementInformation[RT, CT]] - -else: - RequirementInformation = namedtuple( - "RequirementInformation", ["requirement", "parent"] - ) - State = namedtuple("State", ["mapping", "criteria", "backtrack_causes"]) - - -class DirectedGraph(Generic[KT]): - """A graph structure with directed edges.""" - - def __init__(self) -> None: - self._vertices: set[KT] = set() - self._forwards: dict[KT, set[KT]] = {} # -> Set[] - self._backwards: dict[KT, set[KT]] = {} # -> Set[] - - def __iter__(self) -> Iterator[KT]: - return iter(self._vertices) - - def __len__(self) -> int: - return len(self._vertices) - - def __contains__(self, key: KT) -> bool: - return key in self._vertices - - def copy(self) -> DirectedGraph[KT]: - """Return a shallow copy of this graph.""" - other = type(self)() - other._vertices = set(self._vertices) - other._forwards = {k: set(v) for k, v in self._forwards.items()} - other._backwards = {k: set(v) for k, v in self._backwards.items()} - return other - - def add(self, key: KT) -> None: - """Add a new vertex to the graph.""" - if key in self._vertices: - raise ValueError("vertex exists") - self._vertices.add(key) - self._forwards[key] = set() - self._backwards[key] = set() - - def remove(self, key: KT) -> None: - """Remove a vertex from the graph, disconnecting all edges from/to it.""" - self._vertices.remove(key) - for f in self._forwards.pop(key): - self._backwards[f].remove(key) - for t in self._backwards.pop(key): - self._forwards[t].remove(key) - - def connected(self, f: KT, t: KT) -> bool: - return f in self._backwards[t] and t in self._forwards[f] - - def connect(self, f: KT, t: KT) -> None: - """Connect two existing vertices. - - Nothing happens if the vertices are already connected. - """ - if t not in self._vertices: - raise KeyError(t) - self._forwards[f].add(t) - self._backwards[t].add(f) - - def iter_edges(self) -> Iterator[tuple[KT, KT]]: - for f, children in self._forwards.items(): - for t in children: - yield f, t - - def iter_children(self, key: KT) -> Iterator[KT]: - return iter(self._forwards[key]) - - def iter_parents(self, key: KT) -> Iterator[KT]: - return iter(self._backwards[key]) - - -class IteratorMapping(Mapping[KT, Iterator[CT]], Generic[RT, CT, KT]): - def __init__( - self, - mapping: Mapping[KT, RT], - accessor: Callable[[RT], Iterable[CT]], - appends: Mapping[KT, Iterable[CT]] | None = None, - ) -> None: - self._mapping = mapping - self._accessor = accessor - self._appends: Mapping[KT, Iterable[CT]] = appends or {} - - def __repr__(self) -> str: - return "IteratorMapping({!r}, {!r}, {!r})".format( - self._mapping, - self._accessor, - self._appends, - ) - - def __bool__(self) -> bool: - return bool(self._mapping or self._appends) - - def __contains__(self, key: object) -> bool: - return key in self._mapping or key in self._appends - - def __getitem__(self, k: KT) -> Iterator[CT]: - try: - v = self._mapping[k] - except KeyError: - return iter(self._appends[k]) - return itertools.chain(self._accessor(v), self._appends.get(k, ())) - - def __iter__(self) -> Iterator[KT]: - more = (k for k in self._appends if k not in self._mapping) - return itertools.chain(self._mapping, more) - - def __len__(self) -> int: - more = sum(1 for k in self._appends if k not in self._mapping) - return len(self._mapping) + more - - -class _FactoryIterableView(Iterable[RT]): - """Wrap an iterator factory returned by `find_matches()`. - - Calling `iter()` on this class would invoke the underlying iterator - factory, making it a "collection with ordering" that can be iterated - through multiple times, but lacks random access methods presented in - built-in Python sequence types. - """ - - def __init__(self, factory: Callable[[], Iterable[RT]]) -> None: - self._factory = factory - self._iterable: Iterable[RT] | None = None - - def __repr__(self) -> str: - return f"{type(self).__name__}({list(self)})" - - def __bool__(self) -> bool: - try: - next(iter(self)) - except StopIteration: - return False - return True - - def __iter__(self) -> Iterator[RT]: - iterable = self._factory() if self._iterable is None else self._iterable - self._iterable, current = itertools.tee(iterable) - return current - - -class _SequenceIterableView(Iterable[RT]): - """Wrap an iterable returned by find_matches(). - - This is essentially just a proxy to the underlying sequence that provides - the same interface as `_FactoryIterableView`. - """ - - def __init__(self, sequence: Sequence[RT]): - self._sequence = sequence - - def __repr__(self) -> str: - return f"{type(self).__name__}({self._sequence})" - - def __bool__(self) -> bool: - return bool(self._sequence) - - def __iter__(self) -> Iterator[RT]: - return iter(self._sequence) - - -def build_iter_view(matches: Matches[CT]) -> Iterable[CT]: - """Build an iterable view from the value returned by `find_matches()`.""" - if callable(matches): - return _FactoryIterableView(matches) - if not isinstance(matches, Sequence): - matches = list(matches) - return _SequenceIterableView(matches) - - -IterableView = Iterable diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/LICENSE b/venv/lib/python3.11/site-packages/pip/_vendor/rich/LICENSE deleted file mode 100755 index 4415505..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Will McGugan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py deleted file mode 100755 index 73f58d7..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Rich text and beautiful formatting in the terminal.""" - -import os -from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union - -from ._extension import load_ipython_extension # noqa: F401 - -__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] - -if TYPE_CHECKING: - from .console import Console - -# Global console used by alternative print -_console: Optional["Console"] = None - -try: - _IMPORT_CWD = os.path.abspath(os.getcwd()) -except FileNotFoundError: - # Can happen if the cwd has been deleted - _IMPORT_CWD = "" - - -def get_console() -> "Console": - """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, - and hasn't been explicitly given one. - - Returns: - Console: A console instance. - """ - global _console - if _console is None: - from .console import Console - - _console = Console() - - return _console - - -def reconfigure(*args: Any, **kwargs: Any) -> None: - """Reconfigures the global console by replacing it with another. - - Args: - *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. - **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. - """ - from pip._vendor.rich.console import Console - - new_console = Console(*args, **kwargs) - _console = get_console() - _console.__dict__ = new_console.__dict__ - - -def print( - *objects: Any, - sep: str = " ", - end: str = "\n", - file: Optional[IO[str]] = None, - flush: bool = False, -) -> None: - r"""Print object(s) supplied via positional arguments. - This function has an identical signature to the built-in print. - For more advanced features, see the :class:`~rich.console.Console` class. - - Args: - sep (str, optional): Separator between printed objects. Defaults to " ". - end (str, optional): Character to write at end of output. Defaults to "\\n". - file (IO[str], optional): File to write to, or None for stdout. Defaults to None. - flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. - - """ - from .console import Console - - write_console = get_console() if file is None else Console(file=file) - return write_console.print(*objects, sep=sep, end=end) - - -def print_json( - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, -) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (str): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (int, optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - get_console().print_json( - json, - data=data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - - -def inspect( - obj: Any, - *, - console: Optional["Console"] = None, - title: Optional[str] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = False, - value: bool = True, -) -> None: - """Inspect any Python object. - - * inspect() to see summarized info. - * inspect(, methods=True) to see methods. - * inspect(, help=True) to see full (non-abbreviated) help. - * inspect(, private=True) to see private attributes (single underscore). - * inspect(, dunder=True) to see attributes beginning with double underscore. - * inspect(, all=True) to see all attributes. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value. Defaults to True. - """ - _console = console or get_console() - from pip._vendor.rich._inspect import Inspect - - # Special case for inspect(inspect) - is_inspect = obj is inspect - - _inspect = Inspect( - obj, - title=title, - help=is_inspect or help, - methods=is_inspect or methods, - docs=is_inspect or docs, - private=private, - dunder=dunder, - sort=sort, - all=all, - value=value, - ) - _console.print(_inspect) - - -if __name__ == "__main__": # pragma: no cover - print("Hello, **World**") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py deleted file mode 100755 index a583f1e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__main__.py +++ /dev/null @@ -1,245 +0,0 @@ -import colorsys -import io -from time import process_time - -from pip._vendor.rich import box -from pip._vendor.rich.color import Color -from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult -from pip._vendor.rich.markdown import Markdown -from pip._vendor.rich.measure import Measurement -from pip._vendor.rich.pretty import Pretty -from pip._vendor.rich.segment import Segment -from pip._vendor.rich.style import Style -from pip._vendor.rich.syntax import Syntax -from pip._vendor.rich.table import Table -from pip._vendor.rich.text import Text - - -class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - for y in range(0, 5): - for x in range(options.max_width): - h = x / options.max_width - l = 0.1 + ((y / 5) * 0.7) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("▄", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - def __rich_measure__( - self, console: "Console", options: ConsoleOptions - ) -> Measurement: - return Measurement(1, options.max_width) - - -def make_test_card() -> Table: - """Get a renderable that demonstrates a number of features.""" - table = Table.grid(padding=1, pad_edge=True) - table.title = "Rich features" - table.add_column("Feature", no_wrap=True, justify="center", style="bold red") - table.add_column("Demonstration") - - color_table = Table( - box=None, - expand=False, - show_header=False, - show_edge=False, - pad_edge=False, - ) - color_table.add_row( - ( - "✓ [bold green]4-bit color[/]\n" - "✓ [bold blue]8-bit color[/]\n" - "✓ [bold magenta]Truecolor (16.7 million)[/]\n" - "✓ [bold yellow]Dumb terminals[/]\n" - "✓ [bold cyan]Automatic color conversion" - ), - ColorBox(), - ) - - table.add_row("Colors", color_table) - - table.add_row( - "Styles", - "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", - ) - - lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." - lorem_table = Table.grid(padding=1, collapse_padding=True) - lorem_table.pad_edge = False - lorem_table.add_row( - Text(lorem, justify="left", style="green"), - Text(lorem, justify="center", style="yellow"), - Text(lorem, justify="right", style="blue"), - Text(lorem, justify="full", style="red"), - ) - table.add_row( - "Text", - Group( - Text.from_markup( - """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" - ), - lorem_table, - ), - ) - - def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: - table = Table(show_header=False, pad_edge=False, box=None, expand=True) - table.add_column("1", ratio=1) - table.add_column("2", ratio=1) - table.add_row(renderable1, renderable2) - return table - - table.add_row( - "Asian\nlanguage\nsupport", - ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", - ) - - markup_example = ( - "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " - ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " - ) - table.add_row("Markup", markup_example) - - example_table = Table( - show_edge=False, - show_header=True, - expand=False, - row_styles=["none", "dim"], - box=box.SIMPLE, - ) - example_table.add_column("[green]Date", style="green", no_wrap=True) - example_table.add_column("[blue]Title", style="blue") - example_table.add_column( - "[cyan]Production Budget", - style="cyan", - justify="right", - no_wrap=True, - ) - example_table.add_column( - "[magenta]Box Office", - style="magenta", - justify="right", - no_wrap=True, - ) - example_table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$275,000,000", - "$375,126,118", - ) - example_table.add_row( - "May 25, 2018", - "[b]Solo[/]: A Star Wars Story", - "$275,000,000", - "$393,151,347", - ) - example_table.add_row( - "Dec 15, 2017", - "Star Wars Ep. VIII: The Last Jedi", - "$262,000,000", - "[bold]$1,332,539,889[/bold]", - ) - example_table.add_row( - "May 19, 1999", - "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", - "$115,000,000", - "$1,027,044,677", - ) - - table.add_row("Tables", example_table) - - code = '''\ -def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''' - - pretty_data = { - "foo": [ - 3.1427, - ( - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - ), - ], - "atomic": (False, True, None), - } - table.add_row( - "Syntax\nhighlighting\n&\npretty\nprinting", - comparison( - Syntax(code, "python3", line_numbers=True, indent_guides=True), - Pretty(pretty_data, indent_guides=True), - ), - ) - - markdown_example = """\ -# Markdown - -Supports much of the *markdown* __syntax__! - -- Headers -- Basic formatting: **bold**, *italic*, `code` -- Block quotes -- Lists, and more... - """ - table.add_row( - "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) - ) - - table.add_row( - "+more!", - """Progress bars, columns, styled logging handler, tracebacks, etc...""", - ) - return table - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.panel import Panel - - console = Console( - file=io.StringIO(), - force_terminal=True, - ) - test_card = make_test_card() - - # Print once to warm cache - start = process_time() - console.print(test_card) - pre_cache_taken = round((process_time() - start) * 1000.0, 1) - - console.file = io.StringIO() - - start = process_time() - console.print(test_card) - taken = round((process_time() - start) * 1000.0, 1) - - c = Console(record=True) - c.print(test_card) - - console = Console() - console.print(f"[dim]rendered in [not dim]{pre_cache_taken}ms[/] (cold cache)") - console.print(f"[dim]rendered in [not dim]{taken}ms[/] (warm cache)") - console.print() - console.print( - Panel.fit( - "[b magenta]Hope you enjoy using Rich![/]\n\n" - "Please consider sponsoring me if you get value from my work.\n\n" - "Even the price of a ☕ can brighten my day!\n\n" - "https://github.com/sponsors/willmcgugan", - border_style="red", - title="Help ensure Rich is maintained", - ) - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index f39ef89afbefc9f6d5764160826db871c7991365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7494 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%0DRkp{Y%_&xj*#2-zBvu5_ixu#d@ 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%0ADQ+u_NG$3_aZhaiiCN~5vr-BN_B>XR36^snch z!}00>rV>w4hT4jzBSNm84x7$$AZs9u6L6A6&7R~t?+3+dZFy~)<>fW9t*^nap(qvzf?8}hlg{mF6qAN{y zCCRQrMTTn1lvZXOH5o@`)sK^{{8|9Jo=%Z1X|g3rwq(f?+t$R<>}JAVk=2v1^hUG8 znspErJF*ql3RrLmU{B0h~OOpe?#0EMt%)?C&*8h z4l=<}&Q&P8%t+x}S?m)KXG6nq5ZBx&ePWcOC&U=dMaIMlIwm7MfK2ozz-G0c6X3Rp z!`=eWfZ#xgqHA{0n<4NF(EJE)3U+JGVn7m~4o}dRMQPk)we}*v1k#6~X@l4XW$4f6 zUIS7h^e{eXLp^}A%mgUMQALT$-Cl19?4#H)I`DaO-O1j|;N1xaL$MGOkxs)1;+y+8 zAqqsJeGi;11N2 zy94zAp`)6fs$N|T6oDerZg*?fsl@-bSaI8hl%S^fkg8GZ)-=hhB&-0{wJ3Afarm-K zty$AtQ*T&>uG3i7{+J=5+h=v{ShQKex6*4dYZeRE(CakCx>>UZs@4#Nye`-kqnQLq zfl7PUCjm~ooFGZ4k{SS~QY6%W7GGYfmcscTc^?@G{6W}O1Al`Ehds3nh7Rrl;Bip+ z<6K0N5fX4MKw8xW!3N|NsS|aL?kTZq{}XjUyPiBG{SB0XsZYrN4IYuKL8sGYh_VF! zWe7_G|1v~lviN;K(8=OAL+nfzzZrr_ez!M6c#_3$hGS^Q=Qce40hkA}6a z*3!8nNff4T?cP*{YyM)&*|B&&W$R4aIupGQ zsIqDEtdgV}QdC2lYDn~CNaK%>UpqeCpCYT%WOb6P#$$YmpWze7bL1wS7v}#80_{za z18H&~Ne&ch`{rXwXP@?_$o@3hpCtQpwO7yHIGZ?|%VenXY2%C~t2fy9!8C2!l5w_Y e?Pkzx1O(rr;IX0DHe9w6I|*`A(ol!@#Qy>n%K;n! diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc deleted file mode 100755 index becc0da0936a12eb893dd29b12e8c1d837bf0321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7884 zcmYk>32>Fw83y40CV-TP!3AX#qo5GB8zd|y@q!SN2m}Hc<5Ee;LihyCH3@dKSVC~C zbpfqXa1^bMR?!-jR;R-z1w@p^1?X5EB0y(iy?<2#?vyyu+%PyYJ{ zny9D^P@6W4l|9U_WH1R+DuY~x}avp{iL1j=L{55n-P#&5Yq$Uj9914QeM8{4w zo4*7A9JtFEG5i87=DeDXjtIaToI5kPE;Uht#2}C=gomXa0DnYySdOK#9^p^f$oV&B zkN4TwtPR;h*s9<@;LN-An+BcG=!o#pjnGTM_2HakmP}@&*fgS?&ozyGY<#5+IY2mM z;D3a}296NEQ*g=WVAHO;sXL#*?}ES5G=NN^#=nFw6B-O0CA28GHqOarkBjjwke&#? zM{hzu16L9T7)T`yHE=WGRs+ij%MJX6u-d>5LL$C({@4u6l4T%5m}X!)p~yffq0GP% z!cqmdj&nD2w;R~lq7C_gu-(8%gq;d*Kj-t!9tYWIGL5sGFEEV|o-av6#Ba`JalX(r zB5aJ;hU60R3`{2EE4b;LFEV>X*|^g*7IN-x8cWz%Y8vY}Uu+s1*x0HK`GD}DfsY6~ z4ICsi8E7TM421AmkwirM?Q_1w92;RHTN{!~$TKjRkZ+)nP-LK#P^RGOIrlK9Y+z%v zHe?%NyMY~qoeFM0=bmPd0H12?{!bY|>B!`e^U=ktUKq28q1EqvA14{@? z72G<`z0I*3*w~^C*+$rIUXBOA)xrC_-?k&!jnryPS|Cj2i~^Q6XBnrk({s4J=|zQKLghg z`YT8TAY-ZV3%iqWpMeJm4;pxsu)@Gf!a4=Fjq{b}l)-pYN(A9gxsh!Z!*Dvka6F7Ad&JoCldx8rayS4GHk>kPZmHX*wa>z&t{YfjUCHffopG z82FaZVxT|X9Wol>PuWBG)WGM2!wT*@&V%*R-ATd_1^JOnPU{lcgm;I;5dM^;6hJb< z!$86?10{rV19J#f2KEq|4fMh%QhFn*2L!+T{xp>^$bcgpQ*h0khoT){;#vs96r>HG zH#v*&n_h$mU%DeaA4lBn@b2Xekf8*U0A z!@yKRrh?1_NFf#f@{bxtoU=^hDK=J^Mg!+-wc$1rA_~$Qf4_)QBqkJW}NB#cv# z<9LeY1S0-ey2W@ls;^@s{vK-tNQ@eXIy@}05)nT|o*}dt2=FM#UW9Kn6H@U!co>9P z!i4yyX@rPrTt|4?z)Hd@LVU?HgqUe`#PcO#gg<3C;V}ct2u%i#6Z+zr@=H=MORj+e z!p3}U1XBTzyri%Uvura^^)jFu;jgroaIb;q2&)Y=6HX|&guh|=c>OlGPJ{^tk_g!f z(hnd5sK0)J+z`$aO{0#DCEAd+gslb|2`3a>jB}3Je*WmrIywpoFl9fajBc zXs#nHHH~)&n-ttPoO8`7sjs0i3gPc%0_Qx_n8HTBHstq&dlg&*=j+Xqx7k>$4SARF zo`DU7jSB94&Xdd@N7*>84LL>l!9dd*z!8N10v#iKXCQbT@Zx?n;$NT!%n~ESAMM~Y zp|!o?`kui&*<43(7L8Z55nI|s0$zw;h`g;lYw&y$p*#{ zG8Eic&eO~(->~tmHl%-7zyO3lWzBhj*AX7t2r&aW$$$ccZ`2d+HxP6KBp`fa3?WCs zML8Fk3#(zHRvWUIP;a1t@Gk|op7V6w!)+$aFtC#_Qvts}#U2R=e_;a%=>{eeaui$* z=Nrr(b!^mYL*5~5GVmecV*|SgyA2Gv05BR6zYZ7ST&SnG>j*b0$N?@nqDv&W5Ri!Q z_mWA-G7uqT8^|T(8JJASS8zp~i_Ed5Y?Nt3<`Cu^h!ScIjJybtgYY*ui}Oup(*`#F ztqpmzJK!G(e=qM5HW~Pm@RfnIivi;he#siby9O@31TYxk8$)^kG7uipdIClwJd7rc zF_1}!D7bN)Z#MTbo{b6GkWUEv4SYdpRB(ql-(vO%^+KZy!e7S-!Zijm2@wUC%lTHb z$8iPYv2jOD+XRA{L{ejOSuOkzK6@;{9AJ!S!`UZ4H-+A zsNixr-)5FP%*JEdkY$AB2A(9WFwoK$@B_l%OK=$=gzy)Z$a$7IC7q27ZAgSL-auM9 zU>w44noB4&(0n`KB*Hh+<^e__{IS!jFc+I+rvv0cYW&CAMl@ zm z5)dA`5i$*oBjgzh;YkC}6LuKbP58_}BcWNr zo#cGGx!a%EXw`IL`CT9^={gSsM}~Tzjg0iA=^UQwb!cPW*AR&;pSVH@;0sd+gkmv!Qt@DEFC~q$Qe53$mG1WgXA;59OFEBMV z^hMHyiBqN&7hRuyLmvJ_+JePF>rLUgRSPP@3uafBRfQ*2RaT7%&yGgJcU9bRS9rdZ zhNE}a&aJv*#IWJR!!=S{F*G{6Y~Jk3ikfg#qTyoH%B!lw)lxP$TwGQ$e}3`rq`Y=+ z&9La*t(~(LRFyBBUlFNZh=W4-w+8>iFKA8-g+k4pCY+O;&>U#iCGnr?8Z`b7Z8)=G diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc deleted file mode 100755 index 87bba7f296deed1bb086ade3527f548aa09bb5db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208520 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc deleted file mode 100755 index 88885f85094a9d0cdf31daaed6fa6984bba61f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 975 zcmZ`%&1(}u6rb5mlkB#&rR|{wp@Ry|N|U9uNGT!|zldN1Mg$`gw%JLt?e5MpJ82t< zP{Biw6)FWU-l|gn0FV9&6-3H{Ab1iy1d0%H^3A5ziu&07@jm8#zgL5UIs*E%^I~OE zMd+&(PDtr7_~;@qyU0d1c9Dlm7)xGp6;CaxUZRu$S+i456Qw>oT||cdO*$Gl>bHEK z2}?N44-F+!@`WgU)pA{H*`<+IbzE9@omJXRCRPDO+JUET2oX^|!7(+ciY z5n~@9REdvlV0Mu>Wotoowz3D-efWFy7`O0~vl>!R3-5ty|HOcb=sXg~{Ym8o#G#A( z&{YwwqYd>wT8C)Ri~8vMO)7}2)n^%lR5|mA70c7as#I9R7mi;eRmMrc7DgBxR$>a;h0$Kda@7V25Jf2gYzvr|-?$#;c zG;FwnuxcE^XT+%zYt3@vkxvsSQqELrSwMNb8Bzr^wR3SbQL@+R609p#qp&-{BklS| zg$8nqhQgCDE#40h%JC7>Et+-aQPZ<{g_*Zljm?@?5SVM!Uo%~2*$kSZ&ivWj%#0a2 zf@TA&vTD_6Xa-JTmf@MrxXGPL-7NQV=YnRWL+)dd4?!N8HM|F~iGGZrjQP6xF7y7{ zhpGI>sr=@R!_?qGYND+qweiEziS0|z=6B||3Z2hG<874CPD2`vjc?Cw&$TtscRHQ6 zjs}Le=E4C8{al+wFZHbY7H8EZBhl+L1qPm$paB@kNH3SG4LDL-E^~QkQBpJmxB#Az zkK}>I1;0T@z#@JIpqswzF}vZ?D|`$@d9>kefVPS;K1AmZ{`|h6$%B7=?c@j^ZlnJI IABBiN0ZeZKEdT%j diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc deleted file mode 100755 index daa726fbfee668947afdb1b2328b772e66ed5aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14120 zcmb_@Yit`=mSz>-Z&KnzPfKOVl0`o#C$gQ6UlYfUV>^kRww1v|ZkwT1C7BK%nkp)` zv}DGa@nGm)&yL*dUaPxpG&`82m5GDa0%<@$c7Qan3-nLYAjU)i0t74qOat?Sfx7`C zSSaYZc5rz9+~@dd&(yHkDS4!Al3TL%)DyWGLoZ%sqJ0n|H+vfGevm$o+X zkrzbXc9s{?=K*(Y#v*nhKP>X+xp4O%sLeBBi)x!rNU@Zdo>nchQii@(d}rbbNwvn6 z=|oIXR9jq0rp0+A*_HTgDwdg-rLa{s9!)K%j$`RWLYmIR(<#+vDR2PW7CVQleIlkixtgkd*1zoD`i-r!sOn zfv+ejNcWzT=H!#{*((YB&=itfr|0Ju5PU0sJ)T0`{B|rQB@nQ@ElZiq0wqmSm(ZSR zQo5c|Z3J0wjBM0Eo0n75)TjDGvqZlqKLEJLWw`>rn;((?6s10Il>8CO;oHgaE9s;(o{Y)U>G9L)+4RJCY;JD+11a^vcp`pz93;7tPEAB! zcwtWI<8plZ%6K%MQsyvyk+}uc7iIm7Hu@oWxD> zA~$6a`6;7l5RLdV)u4$M=zY6rkxZghGE0^wTZ=ZyD%$aL;OE58g`XQg4}Ma$=#A?61$PtDH<@%J*xGTM#I=G%+FClZm_eENeeal3bE9J@HU$k;q2wBL~(}$ zQz;ykXO#miM6vYctHKzTRrr8#G(|BWw$u`7Ac9L0k}wAL*(IcFYYl}aSu&ax2gA3qy}p?fv4qmnPErEPipn#ZdM!okw>}80 z4Iw=vOve%lN>;wJQd(fosPSk*N!O-{)}Wv*!nUd=<@uKG&B^f(Vi{2U*_5bf$1+&Y zm*+DQH7m`=Qz@)&;aWU%MVKccr%b0II={Qm4DoplwKSk)NLbXX7t`}ZrDiMN*@%*s zGtX**l3SXHCFZWgE=!p>k$XX3qnE!UGP0>AB8zH7hgCCcMKz)g zc@*MH-cDeQK$yS|0y_!pBCwl4gg`&Qv;lw~JANdy>G$N{0Pb;_#&*GRpCaXR{In;_ zMH_ip9PT6;Y!UhEe9nZQC1=eVk!x<`nh>iiU0l{Y z$FqEEBj17)D{yR$6pGQ9*psy(#?(2AW*vw*wHyvg8Et@PCc`c{fHc*4rMYX%<18hb zjJ+>K+4OuL3KMa|PE3)Mm|-=1pF)jkQK)AmU~7-OmHJ?dV*86{qR~ZPO@v44DNs&1 zB@b|e`%^#Hzq8c0tK7FMZz|imEB;X4blX-5_7;N^%i`mK$fJSCic%VwC=W~^$5C;5 zsvK{RRKmN9uHE_90hVS9mP()-x%Nue06s3nmfl=GUP~!3@f@r%K?z%T-|CT*`080$pB7MXY$dMuVL?FcgURy9JV zt0vmqZX9k(Xle8}6-~~EG%*8|z+f>*rhbY%L6VJ#U6tYG&Rf&}f^K6C`8h|zhv^+^i)h|yi z4eD{+HcmF< zkZ8ym-{n%i49#QhL5_*%-o;V&Ja>(|j{Ix9Xv~?=gVrV0)@sg_>Ou<*8O(95b7h?cDB7u(2L{oVwG}+|dRo7tQ*`U;MbwxvWUZnJ(9$*zd)AH><5?V} zV_-~Z9G!(3DB!V%3LE*BKd@*Xi$o&fGmF03c_C64XP@B!%NEk2D-ln<51l$89T*>1 zUD4=Y&c_nO!qKQ|W(V~}drVnKO_PLFjR4>B!lJESp)6o1VXyoWJ~B<0>iBa~w_cOw zw5;0cM9hLRNoCb~_PiFOQ;%w;9>fS`zTQ!*M9qR)lh3TIq?kDnR^Jkx~`??e;e9SqvX6b{{HrA1Zer%DXGhUTX6=Uvc$3c5Qv++FBfXb#)K`Z^?D6>^fF- z9jo+gdE66z)DvFWQR>-O?%9|3Z1}s1{=*MmDom_+)=Z_o!{xridE1{XoXdav&z2`j z&cU*CkYs3ICD@-okw3BS4wT*4_Db&EW%uqXXQUi~ayFp6ocOwD%l$1CUnu`0`YZOm zQkeO5>f_Yv`L*HF=#ld15hT&;I$CiDi(TQOYe&V^`;FDq3vmsQ_f%b+Z=h(~q6}d+ z{(5kT``C5ZxN1La{BQhWqKIa5A}G1zX}p3#aKtu*#HIfT8Z5v$J-eY5;SyMBy3r<42*YKRWe`Ou}8 z)7W_|g~r~{TCeDS=xMJvYiaHZI5lxs8@mDa4l;$+o_4Cs0(L^ugf=~*7r5ZFmYo*6 z!$-EP{m;33JahuD_C;Hy8nH({h}t^qvDR;UyE#YJ@zJ)-_9jl&A$C0MY-`bJ;BaPh z>PMS%W}Tb*Kxa1g$nRu!*29~*OgZsg)KFf^(D|$OwD(yV%aHJ|JsDEcYtOBK=obTG z@L@==eTrQVyY(Y#>$mwhx5QtZ{SoM#b1~@7d0MG*wPC``y0Wf9Z@tCVuh^rfk8BWo zQ@q#*J7T}S^_(~B{^-rDw?Ky4O^;r;&iS&w0+|LjJ>nL9dpw6(vSxiWSDAxN^sHNt z*A~<97SG-O+t!)MwsE+;20k08*RAlk?>~=kK_^e!s5`P9H~Lv0y{)sB^<-@i2lTl5 z7@2D6bGzY;rpOv)I{uMvEXU_mb0U2W{veZlkrIvX zOAD$cDv@T(taAFZz3L!4UzEnGEDkqRKkYCYIh064vLh3dn?t2LQl&4cC^ph5%-NHVs=P4ot&V4N;!%5GR<8h+nXAIK@oFn-h z{~?@E+V>h?KmWlgrJY9Vc53nkkZVG^J}ogfLgY-?AfH87RQqf7G#uj3(0G^U|ZFG-Ry89o@7N%ETE)DD}59}*;?JxTF zKVA3tLz8unG(n|%%W`HZSM+Ubd!Y~A`P+)o|5jlVRG89(NC8&}M` z_4;9h_J@FdkDCQ+U+f_|77*Y3h@5`SuXbhmJBHi6U`t*#M58#XIha*mA&dWK2GtPR zBgasWLQ_?2z}L$aipG6X`!v1z~_2T+x4AdzX)`D8KpepFUg@OXJ7N z~}% zprT^{VB@0ifcCCTFAXncm$HRprLM7Z*I2P5+{j}CfwhbHLMFaDfdzL2U)3UApMxu2 zHOu7Q21{AVix!_*P&ruLYG>^Tc{1eJfIs;MI@mGan@NmgbO>BiCwJKgpy+y2=#JHO8CO~<%`U~qIpG?NO(vl6OU&1 zpreIqA|IY+dN7J{Sv7)AnlFbqNpt9QGsIarE~*aLFL4DSF`rDSRtn4MYiw+62a+#P z8DeF%lUWsD+)08;k{HEEWzsk`#}KhAvrRKIs7%grnG6ha0zfsvrn(@XVL=#5Waes8 zE%55Yo2=T=B)Tx4%BW7dI{@E_{Qmr0IHZ|Urdcs;dW!1Iq%$you)R(7f;v$~$Xa2u zmhNPqXoi`~|C;(hQ>7V&Ow?`F2EYs~8k^2ic7$57p%u;YV!alV$-Aj~n}!sv2oZzb zUeNqBY;lq4SF^zA;VZ9b=Jr>Rzvw+x7RFUmbu@*gYvk0G~r~aWI#TwP6CvC2g<$!d2_|-z5Oy( zv%TW#_=nR!KD~S(f4bxvExSgGuF}gx1W((2-K;NI7%_-Lm-~+Xf!l1`5}T zwt33V^o=x;;olLf{6U61`c9{G2yOqBfNW&b!EchNhz z-Zxk!Bct@}bt%F4F27k@ug^u1N`y;b(TRoOC8H5>h& zZ#aNI5`ZB47^hegzEwPMoR$slT{Dr3l_aXrFZC;yMMm> zXXE$Bm#h_E*FEn~yajK`x2NpeQ}pdY%93^2TIehEeKEN@^4W!l7fM@SE^mEVn|Clk z#n=6{w`#uJARh8>>pXMv*5^+?=mP(+1V`%j8(7s1Q`&Osd_LYW?mWPgFhWtZC z|BgzaZ|U{rlb_72yz`Z_IQnL3^vyD0;H`4tts;9jP}4${vjl%o8618*xc|}M{?+-? z;NkM%;bl{$Z?M?6v(mrwasP{t`d?hz`_m-&)-;am-_dY`}Y_7_ctn7ohbFcRPKMN*#FXo*0Vyo6xd%5 z>@NoPBe20pVf$osCAjuRap+`e=wuntcdG0=RrH-gpyCXbodWu6_kfFwF5O#kLoqbj zJ?ovJa_3Ohz;~SEm;a2&bdGO@-x#0A4o&Vbq8?Tm+niOacC#R=bGI5HjOh2|O8~vs ztzFfC<;-vc_ngji-{mv08-O*`%(-=&swYMwc?N_X$0nN-UraMR-AXYc4(`yhrYTrUJbu#1*C} z(2b8~4b)5R_8_aEc7qVTf>KnwaYY-D{?-+x)TX?C`-+I7CDD~AoNV+1U^n<$>N}?q zrg@Qzs;u9Eya3W(Jiscb5lRx96mMR~!uV3Sxz(78YcU0y46dd$iH#eZGWJ9G^$0`> zkkyY})RRdWhFUv83ICY@ZNxRTw&vCT8>B4uHnv&vcIfn#f1wg|D1&pmmxGXSjVs49d$R^XR4{v|?*gO2lJ6!UPl)WQBz^(_$!rOPO`-cnI48vuAIDdTIOA&9l z>#AXP?!-SQEdz#DeYM41a+)dzQNkk#f%qRgNOh zfQtsddB+OeR`{%rtxbFh#}I){CHvO7vpS&&*~Of#Y~4aywnz$yEQluo>o}eP z8eF_|eL6x+os`pHYVF{uTCcFC(E)8Q6W+V9{i>2qMMNz((t^2t zm$3cvd^`b%wi3~5-+u8uHdGx2NmP;SeexHKg3JuDJ*Ttb!7@jz3OYCMIlw||XtnbJ z$G92ife~hlF;Lkg{})s*e*o|;A7RoGXY8|x!hS%e4BT}Dn?yGoWG0@)NiEcAnmn6E zr~ict6*`XM(8U>DmL}M6b^OT)ckt4_8JcF6!;Sr+NpKSQ?L8$V0dM?6pWOE5oqTw3yuIT z3yuJ+-)0MIRqZ3bTVS^)7~@5?RmIrv*_s|L&vt>M7bwTMi+0lXvOGKxM)>id^WAo^ zd*Q~#JGxcz9w{o&S~Q6<8^0qQrL4;{4#N-LE3{eqk0ts6AV*u68_=eGe1OYS`wo$5~xKbBDXf2wa(I_T=0we?G zO(FU~QSfk~eXHk7!I#THoLCKJ+;jlQ+v)!Tx+jWGdK*_BIM?0{r!T)x7nSJ&EQ$V$ zgsDfGp@VG0WL#taIUnuHM&WHe;r{a8Z0ViCFv$46J0sc6cDDAFtuZd zTB5B>wP-Rzlj8L2hZg=p5Mh0b#=C`3mQ`!Tu`T8^wRm zTj5R@|NZXh0+gjAW6|TFee=A&XQU5**M<{a7c&ip8A6$kq zflopEuy6}-O&WP<7te zQoiabAAEzw+d-#;x2%M!96qb3*OV_|OG2<6^g8&Cirrf^(l_#hHUGmj3vZb1RWs5E K|CxZTi~j>)&|BXC diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc deleted file mode 100755 index 2b87ff5de108254a50424f60869193c207e43c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4767 zcmb6cOKcn0@h!O|m*kRMQldT-B~zm0h?XiQc3?-AoupAM$yTbgjheI!0)p1ABr3~K zA6K@et^gwlP&F_bp)g>jX#gJDRDpfSF_!{8_P7)l^CUK6PgK5h+^% z`uI5eX5PH_=FQB`%>FG9@DXVLy8ow*PkBQAjYzYxjlq)}!NKDitB zW{87G{1?FVu*pg?Q7KyOX`yWc(J%6k0-Za9B++Vb8&hj22A{_*hTbOlPYK^5XNoa7 zF{emMz96OCCU;$tXzr#gne3bSiehqam6d#{n3K)G@~?k(Ejzn#ZFcec(!A;VWfABm zH=C1XM8-rg+MX_;6@OX^eUoxg^8FyQ0 zT>=JO4dlsxVeo)RB*Ta#pBNKel2dfU-vfV6VkMX4Za0nS1-cK6#vPjr)wvoJ z10T6E-s8QzL>v%9q9BGPpBQQ5?t<0+HkBq_JYKazdirG~v=Pv1?imkLt4kfST5^o`P5=|VbJ zE~jrv#an4Pe=}X)Qr1hw3sWz>l&<6z=||<<$_KeMsgf?|%jqnzi6xq*`IYr_RxYi9 zTG6Se%3CIv&E|`s=TebeAnvb=fUi%529d&{V77a>>Yl;cPT`UBMJZb> znO+!tkVP5|1OJK_K(nEP*;aoCYzEPkfe1`m61p);t>`=p(Lk9|k;R17)%sji0*G3w*76Jo254 zm8Y&_8nG4b{IKP-_NjKp!DDHk>iz+lgU`ymMt1m)8~aX9U6Lw~S9jD5c z;Vs#KJXdc!tb%^uXe!&OA7{-3b&&l)>g2LR4oJUGSN9a<`Mar~!~fXfA8y zvCBY1$FUo|pz_s76Kj9ApD%`#7mnxDK<7Ez5D_{loft!k@zYK@xfj?DWX`r^23e2& zCwl5GC;S(7IptQMZLjL+l&=#z;XNvN&vv^mPS`uB2A{7#h?N|5iGs>~Mm~2G88Hl= z22u97x`2~B^wMeT#mF;qopzGvGXiIE^|Qn-74Xm5Q%*cZFKY1QX`m_pMt9TdD*p$l z$W%YX`0gc&FBg;`{^L5JLeXR?2gN+nocEM-qL?qPEpKB?o3e`)s1+*8mMm?1kz@xr zSTzN!OqZR`w*5F!kSZ03+a|kOl0_&-Tr>w2O`VS`-ID04T)JJ~79-(PCb7+9TuiLy zW$AJ{O_Q+WQ|9thCYg$wJ_xx=4&o=R&`J9!1p}@fKTURx=0(#j-6`jaqMeFNAIP0u zDao6KVm*=J8*FDYlV6jRY_s&TbDPPnG^#0z0m9@e3SGs!(ji=hna^}Xl7duYI%TP7 zdT@7Ix}6HqGsrQDU<|=o1a`i}*Nu)NNFg|f041-B>@IC8D>h*Hm1d<54!c#^zPy}q27IeEi|f!MlIqD zEHFlLsycIUr+`3s*I}AJtj4 zfr*+hsSA^uFlmgO-(&BGT3Q=2_|PXeKEAQHS>p$Feh_qa#Q8t*eeBzt*_+w_ZLMoU z@0zG_lR5`>oNQfx1a;;2j(pP>|J40w_wIFrk3Qz(hkV=+y1!0o@kK3u@n9N2z5g>} zIZ0sfJK_igzeix%z)gf+i?{+2L+F1jBo2i{wW}tK>B5*MjJ0S+@6g_x#v6-T>}@Uf z>OnsM=wH2Cewrc#a&JSz+@DbMoeihtzYFr$; z5sK~x=m>ah%Dp_dOfh6F)2NLvE!lBkX=y1HM2|1#psvnB37RdG#7!B;d^Y==&79nr zVQ-d7GR2HzI^i`oBXf2Uz6@`3^OK2UC1g7DMTHK-h+-KEBD{8?Xo48MVBKf+$1# zQgv2K&1j=D`p^|Ude!pd3{QkUD}bXQ3H9z(?iH*MVgiZ8_LKJqtuSH{(jDKQy??cS zayRjXttiq_hUbC0a#62n(*nfxY&ON%<@9#&y;3o8Q{I%`Uyx+E1bHLBwyr>~@@#BY zl>F*e8^=0wET#Hv>zQt4s|>lSZcqHiu?{;{ z-St)aF3_+_ue<@!axx5KkU_1p8)Q-Ye>#|#8P-VR*?!~{;3a1U4R%&Ly&G&?>+DC- z!Tme?8waD>(3BocYb0X17Z?VN`F!}DP5-`q_8kXd`Q7b9XTRp`H`o`o&VIy&c0IrM z-t*r5vBA22H~%4|ig7n4)p?8;f&#E_Pf(ahU7 zZ{B>o`TgGLm%+gZg7RSPhtJzQLVvK%P7!;`mJ7-)q#_mTsD#tF#HG0sNfV4Xq!E?- z86)&7G{2;Im1tPw<2weV^3dlrLF02=U=6e!uL{@sbm%|K3&Fg;1Lv_FNw80#!H#_} zQ&hz{lnDRLPMRRDc+S#jc3#(9AyqZu)0bK?waZ!R;*=YzW%a67aYIzIsMtzHzQRG>$B`YOlP6D38$S;}6iMVuMpjV7n1!-UDj!TGpL*^(uyT}!A{MlrtcD$FT%CBd|6wz+`&1^F#Yw4Mma%fADqzbXC9f}1quF_ z#V5=1LCNTbVNRJVZiFcr@1S%Dwh2M2d=26+_^qNp553r|eK)x_xjNJ3 zh!A}k8*YAbKX#%WJ7Ej9u>G)qw2QD14Mazj?2sMm60mM>Z$FAiO~F3p@FRZh3>{^@ zM?7H*9qEPUC0lpI!%r%k=?`xWz&UP4$I(xbBx&I!c{)+P2e0Qv6ptK{1|(`gjyh>@ zH~M$erAL-Gd~lzUEP6KJ%5;jdw<`VY6 zWDC&|=pSMp-+(v(%lNVN#ryGzc6`E?Z0Q-WWY}@Sm?wPfK69jTN9@&3{5V^v1CUEj z`b=$~B0G;$VZX6Av}wC%#Hxga<4ourqvj?0)LM_pi|OQ=h#O zyKzlT`?v}Lu5=iJcLhHKJxm2KFid-(MuQB^c+if*_!zXxO%VSVv;(o#553$Z3||nv z++3e^qzOmt)lO^#>^m?=o5Rg(PUK~W-%~xHXA@yJWUZLRa-Op1i!!EC78+$wjLXj( zhVH#M9#ts|>Mq&>i99Yp7T+ovYE{?H&|_d@{{WQ-AmDYtxPwkP2iHe@|LRBf`(ItS zeqj}NLt%WRxx9hbzU(4UH2Vc&u4izq+>AMWAjJ?o?Z; z&1CE2->$V!p7Ct^#o+;ba{cVa#UE$72-G`gTbDLpyElCA>gL<+*Uz;l&wJ(r1w9I( F{R2=Z`Fa2V diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc deleted file mode 100755 index a20538357d8ca8af50664c5345ed827c6a71b62f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4179 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc deleted file mode 100755 index 2de3ca9821588e0a8ab2946cfb7117044672a73a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7758 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 Al>h($ diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc deleted file mode 100755 index aa5f10a04e657f0553302b52a14964bfc00cc6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13682 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc deleted file mode 100755 index 523466f14987cad8612a0b060e3e06f9f54deed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1128 zcmZ`&&1(}u6rY*>$Tn&Ep&o25&e1)Xwe(sFY9Sz{s4XIUS+={AW_7=u-2@YQh>$~( zf;k8+o;+2g|4apuvZsQl-csVJ7k#ryT8i~$=QnTmy?wv;d%O8sE*BBl&rhFUTNt5V z;xI9F>;GfvDmd3+eIfU}PnGO>$H;$l-`vP+m!CqOA5 zLiA{yijb*73yMozr7pW_Pc{oVWg$~GQrmgcx%Y@Bf$jS=X?OvRT8z`Jrst<#NPTFg znyH+nO&&Uz;-EBvB}5Ew0qmn47|E4H5JWojHI~veifL4*i6E+;{Q>)ibezcv^XrMI zM=xF&jVNG7U~?xjo<`fzl3~ZO(PClC@VzY~Zl{eXT&gZE8i|*(2Qiegw^?GuUTj#9 z=0@D$p3^X_5l!6AB;f5#m}TAXmQpteG^Z9a2%6Mj=drrVTcl0=*CFplJ%@&HJSx$PXRg zh8Z)xx(?$}M=3ht)4<5*020w4rCg}U< zAkDY`!iZgPuIoysrtR1Zx4C$2To#ZwocDFT*9&cVqN}k8iq8 k@_5Y7tik=wH}f?a%Mk&PC++4dJ}wzlSXcJOBUy diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc deleted file mode 100755 index 7e2f06bdd63ba8ca0aae91e2d2c5a7a814321939..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 981 zcmZ`%&1(}u6rb6hY?`I1RIvDkEa<_2&6?Ju)Kgomkb{a!F3Vb-pqURK7KQw^LZ5keS7!5`3WQR zBiW27n<^(&P__|86+|(W9PHu>#)&RFQbmH5II>GB1S2LjGo$NNq6$-JmJvE}Wps#Y zgyvpn_F%t1KC5J@`~(%$XjXk{yNqj=?+NxwXs+p*b;j>#zUQ>HR>-Jkdm3fcR=udI zKa&6j91{VT%An+yna8*(e9mPs#o4e`Z8A&53TL9ly@FgWmn~>>ObTc>VV=AJ@d#mP zQ=GA%FLMo3{0wbF>;L!Z;0OR+lR6TWB7kB|7D*{7b&nO{2$Zsu*q<5^&IfP9N(H-(|XMa?96O{JKA{n?azjGH+FP?5ZBLMZ@>z zi=~nt+Jemnru7nDE7Su!&<${-KG(TzHFP7Xo)?35oEd0*3UW-s3}1jahS5d86_lUe zSlV3bE*_FxcQF}9Qx`XCo3*XhhSyy_oW8ts@9mB5$`Q$}Kkum};GJl=4&_%ecR=QP zBR+xHs4x*{4TJiYVGMy#)4v5B#ENJK03T0Uj;B&X`sZRf6ns$V7sM}s1J8pvow)D% zwB@h`J_Fn2>B4moeHmlimt;)(C=n{cGd*%H^bSCBM$fUou?1<&^p eh^^uB@nNsHaB%Cv;OwvXB_rwDIsbueQ0X7HF8c%k diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc deleted file mode 100755 index 716c78206eb54a7309547445c6ec11a958e4b793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29948 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 REq2cS{Ut)*f_#!r{Re;S+fx7l diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc deleted file mode 100755 index 27ceea5651a9737d82b7846d0b98c31a4708b000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13399 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 Q2ay2`QI-xE60-3A2M>xT!vFvP diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc deleted file mode 100755 index 67ba93570b534e6fa917415f495f2d4b96a67145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10513 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 RSJtP%y`C~whsQPnDqWIccxuyA4!&M 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc deleted file mode 100755 index 135f0e4b6f6f7d5c88bbf753026272a6fda5128b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1873 zcmah}&2Jk;6rcUF9p}RkKn1C)Mrn(1W4y6LXd6WcNTVi^h}0&Lz<@Rz@Aw1OJIm}k zG$xT8DTi|N0V##5C|pXTUiu&KFBl0`)}A79;^r!xa^lUb>yM_uc>Q~C-h1=$e)DF2 z9UYA$XitCm>8lGWLVxnk^QLu_lPo9)$U>H6ql%Q1DsoPikc@63OWsG8LZpWZLXY7e zwwz+At0<}c#k)y4h_9FxVy#tOn*^E=`A(z|kxu92XHX6hK{?4nIe8t{%PB-9nkCPH zX9x*h>C@GY9knqLHF#i>lx4NTXrr4S25o-u? ziU%X})TV5Wl_49yrmvLm$Ue=X9RD4RC;V&==6#m3HM_#gcX;OTMq}$O09P4>;XQ?P8Jm z*oO^?wXh%V5tki2zq*P&f7>SMQ|V%$Ol9vJp(8a=Jz^JF6xLud4nqJQlmWufPCwI2 zv_kZX$?{ZRrbRlfo35*G5ob%c%bU8p?U$%Coz7%*uk4d|T{Hi+StOqBmR;R|FpDys zmGdQC?8oTrC+%(rN{QU5z0%KQ8Z2Xc`3yiEwIk>}{yp~QUFGh2<3=lyX-qd08Tjrk zg!0f2CC6Ci1O}l226Rvr?N9M$%&1Pba!Y?<=#^% zbt)wp&z>a!x+lP1g&tH)aq|VP!16i|>~J+U$kk*c-%L!x$GPJ2@J1*(#wOWoFm!+` ze&T|wE1(Qk8`PRq8%7AKEtF7yykAg&FS+*1Jax7R^C9VOwU-^A;(|?0sQgXhe+$)S++;v%Gk&@uh+ zU-^yqCaRqqD9N7V0?gqh0iZHpV0*l={{46N77iDF{N&MlPc9$LH4|5xv8#gRmE>p; zGYkiwKf?&(hEbtb)#mz$VSH0H?T#mE7#7WgSpo8bgkhMDLw(aPQ^x~q%w^OCmf_w& zp|Nq;2Rp}sA6%dbz8HVL!W{Yeiqc{HWfi~!z25-peZQ7^y{TS59vZ1H)))5{Tk4h8 z@K}AhzPz{GQd6z?Xnm=^w71k!Cy%w!wybE`#%ddZ=)p4uMaK3&70z}X^tK$;QalVq z54vI8I^GGp2Bckn^u`mdIWhCc`S*GBwI1{h>9Yz}MMf)0HHi4zZrLd^Ub}*eFkx|# wx+I*&=0es#V3#0{zp~yffVLt@QVU&bzU*s9CL~z)EHq}HaqHhNaf!YC11A^Ya{vGU diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc deleted file mode 100755 index 37884d8a8d19a61c833b80a417c5f53a5523f264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10644 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc deleted file mode 100755 index 07e9fe8b4cabab728a66c540824e9502824f4539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125346 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc deleted file mode 100755 index ac9e8b4c593ffa26574ccadc6756816d56f55591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10811 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc deleted file mode 100755 index 1c7f0c3865417fc4c15ff190aa0baa489b2baeba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2329 zcmb7EO;6N77@l^E>@Eu;ez7Q|A|ND6LpW)S2{FXP=$golOHqonL=m4v9`45Rbeio<_;15+Ps2rP`(@IbCq29H&dp5Zn;eGS8JHcSdl-RL^jR z9}^Eg)s~0I_HcZ%&dhb#mMwS(^ZVgBFde_XW??=$T%+B zcIY&zZ68-{yUDy(fN{;X_gYSnGQ+m*G1s<_$SGd`>#4QFn$&7K+-257w#`;8CyK0n z8tz+xzhy=3WQT>T%PT8Z>?ibA92+YE-*|dS z!0SK1Z^mM`*Ew=W3JXT2x{Tj zZU;AO~N0b-p}8B*GRka2Vp^fl}G-5uarrX zB4&XjPJ)>*6P)S!aTGZ10RfzXLBKQyHGn+Ym?~&xq`}sLWW(i@h6mGPXvT7EikeAf z%sAa^`F!9hy^6O3u8AvmN^f+Hv@3@YHkPW#mGze{jZm#sg_QM39(Z}eWE#sfk$WM( zSH9@~GWM%{SC#gAd`2vc5*xo0cv8|d?L^nKr4y2e&g~zV{rQ(FYuXHyS?JWEoPjc> zgmNCrEOcH$IS*w@31uD1EOhQbS%)&EgmMjRIR|A*3FQKm iS?Jt^askSe63YHjszI5F(jwN(f?9JCYi23A>AwNlVBi-3 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc deleted file mode 100755 index 2c2a68ad38f8b03c31244958562fa88abb549165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4033 zcmai1Z)_9E6`$FEwqrYX5)(o~j^!MV_)6_^p`xf@r4il(2uQ3zuU+v)=Ef7Ri(RcMoR!v^%y-!C0Q2{~EGQVvr=&Nm9^hQq%=B#gGhn z&$bXDx~wa+3aBk56~m*;ovpKi?!7ME1?l_E9!an6Gh~qT%}RO?^y|_6yzGZ^0LlS9 zqz54nf{Y(V=mox4SHSGB<9k1oH9ltftBXq~W>~6VsVQ|9s?>2KJ{MQ5MJsOEdVax< zsVP%enW1Nxk+v=M3d`7rrP_Jukao?EJDzQh;aWQq4&*4zuosv)oo@OZ+64Hp{QLrt zO;V&qq5878dfIMH7FfgzxWFB%i!DgXLeWwjuMRhWU&UZ;XM%e%e+@ov| zG7AS#*>0dt9~!`Q2Vo5jSsH0+y`wRL-SLdBkh(&`k+o}O?=Zt-;YemGXQZ1u0IG1E zxt@oB*(7$G4WM(gRHS#I*ZpSCbA8hxbzA&;OIFD&)urp+qBzy1 zSLe*jo}yA}2B5|qm=`^rk`U1N)4A?or9Vmz6HB@xToo^pE0mIppfTt?(i*LM2f&e) zr!7YI}`9d{}9OU=vkNv;ov84 zEYll83lvJt-PY0qZ0g#H7sw{)yS5KOdHVpeUC_btyHKiSGo}#}9U=Z5M?&7k5 zk_{{ZG-8#eF@yxiS4c5CV`uWFqd))vTz91Te8zO-bk;~Q)(=7qH@PDhSjMy+F>9DH zuZu?ev0iaQkt3s9EH;jHUemb3UB)Aiqd;sfEZ7zvwV$ePauHbO?pX?T`D-r-TA#zp zy+q8~vo-c-u@V}qhQ{iI`aYpg`bWxpFZ?s|H~sI!4~MHK&O-^_O8-o?f2JImsrBvJ z7+qCrBcrQwtrxuN@eS6Z2fv*BJ{Zw9yYN;p~#N6XLtt>HVvU+lZRueFLTuJ-;} zzTnSrSG+(1+%R&({p$)upS~eJ`)nnApc+0<4j-ud8iVs0p5a_CniICB?&4m)eA!jQ zi~sE*;equdHx}0x%ibXiE0YhCB~PDA10;jAwyIjL(6A3o%vV-O&gfjhOm9 z;5%ZfJeysxF1K$=UhxjfodyE8m%f3`-8Xk{MedAN`VLn64#H;h!*Ww!tQH8bO+OB( zj{<6Guo4)r2FA;QajgB()_#1-fxYg_&uoVa(Qxj_vu0oMC)tDmI9K zE$kQ;zmEiUyhr$?94Ht@CQkgoSpNaC(tK*t*|K!DE=lsCk`K18eCR>{gOh)Oa}DfY z&-1LC1c=gG7X*2v^iC=Lr=xK4Ph5M^6Qc7#Y zx5A$qNtFNJ`;?59JKq`^EO)+7#V{C6_tzw~-1*j(I0awqBcuga><9`y^ Bb`}5t diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc deleted file mode 100755 index 3f8f3efbb5bcf40aee58c276ed4bdc633410c817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3268 zcma)8O>7&-6`m!R%jJ(GTef7ig58M_AR?uZ`e}_qu?1MIQ@Dr|H&W14XhAJ^hvZiK z!_F*aQ>IX%$bk-gP=Nv#nilBEO<<$wp@$xG$RR*4au6iMo&*#H>Kg;67oYmxEPrGH z{TXPUW@g{}=FR)%A4f*g1jZM?`R&jDk|N~qxap6P-s0IYEFKVxY!XYUDw~QGv*J$7 zjc>+XbyIZ{n+aFj)D&W=R>IPL7qgNqY3VG^^l$XBh?Rn~G)u7LiL(ssPx54$UddV` z?`fN<9)|kDcf`mtjU|CEHpHpu*64fcX8MKu|DU^bYYgtnSZCHr?yT`Qg^<@9o*CG_ zCuqgzl(V|e1KX?8itR9A?=n%KYd+`xZD!F5_gz{Gg1T5K7OQqpYm^J7?-p-0Uq|ky z2$)-}H>IfDETz*MHAX9gJ1k~81_vnHqe0CU)b*`~!>FkF4acIUzr#3uVAQfJ6~>tt zq#J@!(-2Hhk1-2G1D{rz$G8zNYEThyR2LNIOaQ-ukD-1AKA|2I-vAiMBN(6?&Jde6 zJUf5~uG^l;@LCRtFkQoI0Dx}lvz<f_ZJ%aGqii=G0KX5x|4X4hz*cY!QU|TXnRK;e?5e1}OCu{7;@M z^rKjq0vyv8@HI>cRyV-9J`Yv2UZ{&k1r%Z;RLkH9o&hPI1rlnU1r6?*aoFI9!PH>l z{@I^^JRmJdp=~@TJZ8n#Vc&{vuwn}Fl>6r_?GGn#`gjEHY?0jr{7>$J_ARXyZ>f)y4^_AW zW;7rr^fx&GlU;3*mYV^4uFUUhawVRkD!Z5NuFMzi4otOI*}FS1*52Jcj-@3B#$;Z@ zl>r)RkX5b`;t&0*zg#rx z_2Lfmc8ZQ&hI9*RzPDUhTr3JZV6WBItd7!L@S0N@j?Ji!l_z;aLg&Y`CGQR4P_+q4TWkz zG5lqn#1d7t!Md`(6mkkb4~pcp(_Ws0Q+@%-6cB;AA>B$j7W43Y9j+*$(@Owfif-Z; z;nN(l-vF{tq@kZo%zi#G``^ucc>dROpJgr{WiAeked!qNKiR%=q+a0DfM)j1g5jKm zDUFzi#VI2~)>^Ta(uzHfKLjH^f*B1kjcP1|*!O%7%4q-w>IarA>ONX5s>!o;=o(yL zF=i5!$dw8V{GA21Qk!|F6ox3-X-uF

    k#4VTZS{CJuwlSo&;+v? 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 KXZ@d@Mf^WOr>NNg diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc deleted file mode 100755 index 7c2ce18640d9e3a874ae2be186d329d1dc18cfe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6404 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 QiGXAoJQ0vQm9QK1KLxMqNB{r; diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc deleted file mode 100755 index 95863433088ca334d3f7171fe13610fdcad82e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23311 zcmc(HYj7J^mR5vyLUu8 zV!kO~taGX})-}}?>z?Xn@y=*ZtaqxH-MgZFvHq!kcJGe*V*^tI?7ks77#o@zV)vft zaBO61BsMxV%EFD&EwR8>kwo0B4 zEFAX{{^~KcU2=(DX=v8msYh{BAr`mY5I4@sXhRw8(nMVuJ6Ku=(tOg6y0o1vtrKZo zADB@y{#wnuSV}iidL&cbQ@dGOFVgy?-F0buSXw{Q{2S8tN~0`w0I6PMeIKCOkMzp9 zsfVP8#lhEDYqBQ!1(6enqL0uBQEy4Uy4)Rzd#EmMpR_Nxzfxe$4doSw#gUt%#ul)6 zo4Dm>V3YWuICgWZG2Zyz7}b5^mg*?w4%Adxxn*^1ySe=X6W$ho^?S?8?W@!(?Yr=(-e=-o zlxpZ7)`EvN)Md!S-f%}vT?h5@YOmtM#__>Z9l6J9bLjWdzWSWvBWF1J2lstWnS$n$ z<Vsla|CCLa`Pd}BIc`fKDH9Ysy zsiWb;CypLI`L)U8CH_ccCRGx?hFsIIy zXQbB`r1*?fvZ_he=i^BEoG=bmG|1D)7?!1EB6^WpU_BI#%*BIz$$mHyN2FBpXg6w+ z$&%-^6c^Q+pSv6zE2=cMHLd}Mw+jBH{;9;eAs6}`kHT(eHuMTaDaPRSwKBq!or*Z3)yXvc6g08>vzr)Q+|i6{_yaW_MM zyf0XZhV{g8{0m9E_jJ-f?biluzWPw8#FcDOMksO!jVxJ{M8HHOsRcPcIb)&rYX?p1 z6uvhI@Gh4&rMa+{#BpgeLOKRP1U$oiXqpU~<%f_%ei#7g!zZQaY&9lHh57w{nJ|Kg zF%plY!r{fX+Sdx{(Nsp#3viVyw)bTCWmmDS3m0bwKQ;g*`;5j0?Fq(GlZNKgXbj69gF+IoT4bIDD$p&yt}md{@PQSw4gTtJmV4I(=@-KobWARq{eeY`|FZu}Q}9bupk#|hL@`P; zkZ@6wQ;`|WUHrM|f)wQ0P?xN!ND5fwK9`VznPCm5&Pz1O1YIRZZ2EHeQbbIhmrtNN z;6-FnVt7&FiS5e7@a0xYvdv&(0cYu=7(#)P>wL|0WtV9-kVzbnX{Ik(tHr8_b_}se z>P#RS9V)UlfpyairXdWFuD1^9jLB3>QUUlM_+917Hm=!MXd1{^i_O04eMUDKgy{d4%Igou`X%66Axu{+N z%XZG;`IVDv^nT`UUViGm_MGi|eK-2n0*ZTo-o3xz-d}8Kzdi_ z2^Ks1i>;kym#xuxmjn2MK$){SHU*4uf+m?Jm7sf5&h0~z{4{}n0wl`GM2B)4fer%C z5UAswdnk?ovBl&!0ctt?L4`lK-ZGFK&$kQ}T86HkEc0e-cbNlNxy&wW4tDuuH@nmW zq1oyzcJ!4kbPYbluIrArvK8SncORg#X=>99{*^-~l6!9>s>-HSsYEnSK`sGHW^#vQ z7ZI8@i`HxP>{~#Z4Q#qbZV?5^iTp0fE!x4nYm~vNL<5%Y*icr3=mg=pAQ0+PSl1KN zNy$GGolYkGvkBQhU75*3Z0zKdXuJFfz)XdQAwc)Ut?te5~bSx2{OQ!ru2`mT`9xGLAdotv7 zs?_fHACl*i`zj%d)$8{Mba6YNPK?3eKK~(qd?9vDlKqL<`Xcob>8dp%pb5tGoGi_x zrsH!9(P>#vP9^+I8kIto2BG7sT@?@s}Asp(}P)skh2Um^*nhTo*EX_HYNS+a|!B_UOjr0|?0Rgp3v zHk#6Q;}b`?SNdN@{w3#}SHKc~YiIKeWiC&8XU&Wic|3NsfsO71Ar2E|*MK%vd&$ZeNXf-6S}r%9Ht+`$X&G@Xw$u)WO2;uICNlsPX`+85FLY;2nH?D^d-gNm zNKRUPG4I=3@a@es6q{Qzw$EC88T)60Bf0Zy4f(-?g~5ZE5gmgJU=Evp{s2 zyAM#YoEq~_$R%K#i7v$A6-F`qAVx96@`6{`)Vr_DE=V3TunYBhaE#x70LSPtw#~>i z-lPH4nMOcq4E!TA4cq@Cron4$!GCXrIe?N|&p*4 zUKo0u7{m|*d3Qg!#DOZ8IJ9c};gf6Dwe;p(BARy(>RduCLFE#1gkG>tWO$9@2wb5? z*Ash4;X~`LR+ZR;DzOKN*lPiZeW;e$hcsdz+ML+YBs{PgP_dI5V<7e>M9^_BfO)|v z5~!BP8|EpSgA=#H2t#HV7-B@*4J*U}2n03a0pxtiQ4@9`?5qhpAvn13cVoGyLA1&oEB46`{d@U?rE7Dpvq=1o7Ok$_x6FH+8Bz8$YsZ(;)ibm{BZDRK| z+f>)4&rnbBVh?KUen5IJ(t93|-iP#Fal6=$YabKT)N=g@_lpDKpg2Ttj=F5(Fyj2; z2u5NQ{|0FQaa#~KC=N(NVn7;3Tr1*&h#RSi8%5k0;Ybf7(AAxeN=NO6D*?>vEnSYMRP?b$!IBi`0|`Jwh*;Z0Fnjs{Lv@3XPq`%Q=vMJmWHtiLhtx|| zAqqX9JTlq%0}<95ZT$j`t(2$s3CjdcN)ulnP+SbQzt}=7ym_%ttEv76mA9k%u56v; z0gY4B={;woF#nQ~bh8%Llz1_cWZ44e5{amx2hUPU1cv4-q%v++%yaUBHV!a{z6=f| zM*$|~X29oyR#kI<5`mJtwiilP*36P!tGnc^B24ueS*8M$1X2VZ0hj@@vV-Joi}t_w zOWcsrcHU!<*g2yuu-1qRxtj~?Ws&sFg{d@lK+@;J6)Bt`)~a z7OZqKlc~dNI`1R}sRv7rq-JwTmIVE_lszL_y4G8P0R=P7lQjUd_nLPy*}8!9mSpi z1v@oUxE|ZlheUUAa9?it{m`1PFt{&2c%U$N0I?0lEkRs7#ZmU8@3Xe9cV4*u0-~yh zbb|?rhI|PBdlvvy1rUa9jza2zxx}KGi?Ie!HI>)I1Cgr6bdj&*2NG3{={50WcD7B{ z_aYGtLv@&$H|yX!UAWYs8F^`$5*A)>rIRa*m*McAqs-(qfU1fWJ>IN%J(BY(o)JaR z&ih36tcZoa@wH~fvr`eYv*>BdrmipMb|{`oQBWujl%kO5^@aDwA5> zUD&!`5%zCvE3pB>gnPpPWJtVbXzvluNQ!8!d9fd6#-u->@voq65YZ_qWatbkyp<~O zvkHgXa zaB)cMf=bl~K(W)&bWwq_WZ}M;67`u#Ie4CNtE?^eTS1( zp+e1iZ9k!s$?nFwyXlAtW#x9ie-M{^?w z)?65eQyOZ7&^d45xq6H!S&)CxsdWeLe@1PC-9&4fx6s(H26>qE|}I}H}#EZ@We*$iCB&Tz|pnz33@ z-;?AQQA44s02G<^M^bDpH@-z*%6*XSw;}~WR+%J;s5)m?A3M#~KI^Q;x@7ZpweMcp zr>~|);z`(jXHb+Tl%Y-WgpTZ&u<$yYScr>N>0}btU&g)&gGv@y%)!r?O^U^;sv~>d zaFnggCaLquy2RG5WHKC8h7eExHNwf$06?!6&fT>9$O?bk)uXt2ime@)lk1(mH~Pw) zr6IsT)>`Zz{^Kj(zq0E6-ZyT1BkL}<_A9Mhi``okuXdI#oOj!LV`~P&B8uG{56Ey# zc#y+&s;vf77{)OkM}IWRkV`;u@{ zy26|gbVEApxrdNsG^D%2VRR7r>45)h%o7XBmAE23u@eC1(B`&xec$!148PNNy${QH zuI9|a&sw^a?tN>+066n4`wK1mvHDhQY|AvTu8{}utbvW`BGDcaw%&hi;PLu*XJHTT>0G`D1i2xT&J zZ`spzy(K!ZNNqz!?5Hjo|A2eXEIMzxj1F5%7O^Q~%h*wJBTBZRL>q~CM)RwQOOxKy zyf}WG@fTX;shMv`u}GdzT+;Cy3dO<80Y^2H-BU{GM8L!PNb`cak5!5y=B{+#fYYxbzKH_R3mc8jj4*1NfM|L z8RI^5k@Z12M2oTW$cG?Tk%RTt(iL{@y1eLUGrS4Nk%^xK2Ou8FbOQB`g6Kp0{In=W z;&Ua77>NaK@)gSU96*VmlOv)k^mkF%j*MZf4L}YhLMZXHGKZCT)$1%JU4|E0IJppm zXVMk%rY7?fG`gio~MSx#}bXq&FKX#{e;&$sq zzIA7zb!X*=`p;1C{gBdh=8tUIi|=@@d$OLj*|pi9 zp8e$5U%dL0S3i9|zxPaG?-_8PhGt}LX!(Pu-+p>!ILGJRBL(+};vOk>^khyHTe~yQ zFzWl#t@1~8S>!ng0| zfkrk*L!|K=Xc8Q(D(hCITcSxIBZjr=tczz2VH3B!k0~yeN%{L|5hn2;(1mBhM#+K^ zRuO>M9W=-Ha8W6XO&WGAK`zKiN&X(^i0lpTJqRa&5hLIZIpn z7X-=z*Vc8{WovGM8$vV6ssM{#G#g4_HhUT3r**u79Q8Wj92e4@<3c38hnP!=$ndz- zz9E$%J;U!(+r~s47i#)aP$%GO^{h1&Dq+2+b}OL_y4C+U4s|}Jtc#jw97DywMMUzy z1N<5XlldIGDjI@%Qxql?<5?6!it#M-PDjtmi86=FY8$)!2H@jb+A(#}%w2T1W{zi% zz4grUGezH{xr^_Aqp)Sa;(HWlvAwHo=bPXi0`LWa3}1E&4vfwNftPbMW$al#D`Ksx zAapB2H&x|QXF{fEn^>2Y?3&!dLY3)}I5{CD>CE^3Gk~T>nCq2?C5wYI*eFc3>xV{? zfzWA+dzp=aI3_#N53(^-M3A_Dh)dCEYR51993SQyhX`E@^qeg0Dk zIFB-?VgIx|w?N*vNt%}zqN4vC+4&aE1?vS=SRn~<^+UI9_yf$z`0K2-aJAaz$DIBO z6O&&s45HDx(!l6h9>rL&y zvTz*(x%MBm=i4U=?Gsp8rB#w2&)z!w=kbr@Ws9DbJ;Z2Zu@$nc-eG>|ol$5qlbEMh zsg2JPxJ-b}?Y~ENy9g`-=$ZjbdLI#(!!>L$Y6WoIB(v3`<`ErYAqbdU@=x#--lJV_ z*Lv4L*@^&|v=`(LkP*s)-EqkDD;wwSTRHzDA>X>A(7FS@Yt0i`AuFu6ZO=Y;{ngxw zLfiIy+jyaE9KLA{&C5?`p8ho))S7%)%E9Bc@Uxa4rT4M5hXHWrTOKd8Jg&GOFIy-h zxZ--xFd3n;uhTCtbSmsjy3p3|>_E@|jO#trYcZe{5iVmLr0Qs_!?b~Qka&l5_1JvY zuAi|Xd6UjzS^TR*A{=G?aY>hM1IZxCyUarvGMGAsUy)Q*qI!xcaNBB(_+;NF>iP{7 zTs77tNwK^iL02f+&{f1`35D*R1JHanxL3yhG3ie=_$_ZGaYf#bYGlGQ`9pwOg8R~O zU`~olm*?fG5r*W{deYM~jS$9?H=*Vk@%JXYD#=#qklc}ps7f{n!>|PF$|KR0{HN4% z!ZGkiRSs;O?{$K`P$2PpGla_KEf63ndV8EI=&WLG}}9AF_kW7m_jjIsmllO z1iIYKIa?fDPy)gRxtSJef*nvP9j{|4AO{3ufiW{H!gXU_W*nDym< znvNzxY*PML)W83_zJJ|nZ>le`*s5W5ZRD=|^zwM_ydsR(o*R3asE7Xdx&Vx7Jn+`^ zJLX4q2h=`nBZ75-Rm|2Z$@4z~FHQ&=DG8e~uAzhtwoCg$oISDV(HgFW_fwnO@x)bb z9p8&IZtP}9XauQoE=oWZKd4lc=G zGON;{iF*mpswpsjUwD3A#Jkj(P98{hRetZUTMQ;kC1#|W42g3W;A>iyyoj%*(O9+y zfO|$;WcoMImTiGGXt6=>JQjS6`i`UzMpd4cCbd6H-KzxO5 zi8dVi1BcZcV5xRjRTnOS2TBz!gwZ*46BUuA8iP1Z6g4Bwyc7uQ>+JLTd_s~lLw8!> zD7n@0!qG@vN~(K6npI2>!(t}IleAG!9-^$RT6}T_7J#_=M9`&@3(e*7UlAbV8FPaz z*|b7QimG@0va0c4IsybtVNJ9g`6e#;YuEl)7gUOAh055rb) z$GzpYd&{bI_4T!ZynA=Sy<2hbE;sA#VU4;=E&GB13qBYyx_?mCWD8zBbLij`t(Kp+ z@=tWwf8J#Rta{fO2%bbDM(}4fg0Iyi3FX1F&Gk-xb0%6+sxC*t+G?qq=9a8;+>$MA zt4X(~E%IrITz34eAD~JSR@B328O9u86KhxuVOK;0Ge^m$|-;GxU);}iL-Z4sl zXkLcbyy`%>6`A3oUD4GU-5I2CEaOsJ)MebQ+SCQti`OJLb5J|T4WmYfuVg+?{!3F|*0y3JJ9BIH7!>x}L?$dSGdzs%me-^!K|%E$w_z7AbcT{;J~1!T zGOsGuzKFY$Et!z9xl|@b4QCTJ|4vet6O@WAm5>oj{QN@ly!;<2#-njN^$n6GuUfXI z*=sLWWkjsHQWINF#`a@a`PH4wa0t?SAW2KOHH=7SMNRcxwb*f=K75J#>z616Le%)K zAD_K-=+^6>jC|Uj-*c+4=adq9R@r_U+ua(y%jpbX^t3KVGM3_Aay;$dUg+Pg2tA0T zZDw1GZolI8=UQ{EKWuxyE$`k^aBorETZ+9~SDz^Kj%#eJqxbqZV9amqfOBfY)?y%Z zv++*g;O)S{TbEI3;8Y=S3PM8jRt6OBFig+cBT8p5?;R_6#}sy!8?ZZ$)md)RNAd3l z1FL;Mo%+=D7q9%}6=m>be(+>r@FXlA?PT$2CyPfrJY8UzZt8;7K^^bM@ZJV~QxPy8 zR{72S_ld%JxrT$lN9w-918=0lB`b5Hu;z%bZ8(hFX9LCBBHWT4HCK4cl7M9g()-x~ zPGkcYc~sv=0bU}comE>U!j817x?qTVyr+5?TWJg}xedEfU1_&5J#9}r3Hz51rfG+= zdGUXrW*%2eKZQ+Fw_W{1MT@HJOE|AOOTyDclR(s^`ecnrqUETmcGER}wXsi6&(nUc zIu@vsjjHE?L8j=_4dgv=n$h4kKa&SGH^)?1;uyL{Gln)*Sz^^*wdN)UIctV-v$^Wz z!kEop<52@+R85%!8a1mzPz@if_`bYBbo~gPCO*h_fe-3HN0V>ku4JWU^`!h$iv4#4nByB`dqW87e2@uNL|+w2jqT9I$1E6T zgjKg$IZq}04Q12Z9GQDvweX5mCjShX?!)fn5u{ZV9JPWty+0L<_xEzX{z69}gB@u7 zH#~~(;ngiSL)c)`)_JFG>~`DO>VaFm`L^SQw&P$BX1x>E2e;iB+#FE7PiYmlL|fi-6-J{!L07`o`v^6bbRD}h zG78!_4<(x>Om+|}tQBGKG{)^C{MBP415D}u{Kx=SXwB6uJ-tOgNsj4E% zU7-1!9Y)5#)WjIMXQ?^ed=%U9-yly*^Y6loB;BN$U>mV#f&Gj<3|$bW+54C%kOChY zgWN{L&Ez(c%QYs&FPY{zFe7WNyaodU$!jH3xYoR&vZIQCR=2x;Gsg6XM3_F51b@4U zlj?cPwANAysC>tx>Uxa%Fy=xs6(e+&>o6q{uF~;2Nv8R)WV<+xFA*f=Y0CF!1o|kN zCk7pCsnPa`DOJ@Cxk$M*j{;Tk!7zAx>jwT1aDOFH_ln zOC<_ePGH5AoLUyxGMVyY5Z73MsgG&f4vUb_KM**d6dj?IpKYF-4arZR|70(dqb5$~Cr%b7PG+9^4By^3UL4qZXJF^;ft~q*-Gu?{ z(6=^>Fz`+TL~Cnt?}2>NuBs<*C&HY)kCTZ$Fs#K34EP_DLHU z-XJ^!03e<>qX>X^zLq__;)Mf9n~z*bR#JKIaKSqa5fEqDjvQEX^7UU&zw_qxHz7gx z!8B!Vz}o|4oyG1ErD>D1*xr|g!wLPc?Gf4g^&Vs0c9;6@3j!?oV8C?S2W4f$`}W~& zM|jIGc>aiB|Aos0$ks_fJ~SK40|46nWH7MlM((duzSjtlflekCA(NR?ehHvt!QKme zbp!hm)K4<>P|BN>BFxK)d3=}SiaI3|OHx$`M@7Jqf0rUN1eOUfcL(CA>T={qbhk#} zV*>w%z%2rQN#N%IC6q|6~ko=W69w<{egnwsZ;Q zcCK@H^-ZPeAkM2_gS0+@iMQ3-i@W}zV&7n~r?=SFUi9^pn<s#aG+2NY~h@qax2AEidOH&ckKnLsCdo1Kaif^LOvZHLJXdBn+L)_3xL!o6<%`Q-vShuxnWv03*&=}0^r zhKCumwA;>0)A&-)=OhJyE1e`FeG;I=Q$EBbDTbmyCpoiZn@uF(D}n^d#S-W%K3H5d zX@PSI@yh2UU+TqC3G53^w1ur?PVOvOuwo`3X2qRLq*94k$r_brQ#;fP(oxA|@NxLP zotu%VW$arPB?lA_IR(C#R406anB8?+JnkhJ#uKo2&dWbRYMcw@r>KExquiw-bBVE zQ@7XmOW}a}sl0=-19AvXE?ML`4y!~aQ;{1|Ham-4k77KFT)$#Gi(I#2Jj-UM$qb*j z|4+cjnFbYZp!O_sKE-$zxhIw1bQZaQVmvo1r%T}sXVDl$>TlDV_5HhUX@cp@w6(~O zDaNyG<4u@EHiGOvsI?|P)LK2=12>cDeNj!=*J8rgVK#zH@-D@GQB4|a zHsR9{8$mVzvClLJu}@DAG@FJfXFbTiNI8cnr6OzyE(ke;=f=J^QYN$ zty6p8yuk79%;IfJXWr6T9}0Ur$+DF`EK%(E+JvEwW+3>So9HRg$x7ZqVNFN_w1(YtouYQxA{Z8Y86 zApKZfnZ4I0@9;gh`JR=tD`!{RmEMVb??j<@Vr_J7^w#XBhm@U@`JIymK>nEm|BS*v zgI3f%)p=_`={=C|Jy7U9aBCJ%4J!wq$sc^C0LY&z@TV016g{>3+EaJ<-rIby+P0&L z(3Kau3PRV)v6W-1g3_}i-?O98vtw=V+TL52m0c(DyG|5#(E=8=8-V6!8-yXf-Tk-u z{+tcJi|@a2t3&Z0%KHx${D(f-`^nx80LZ^s;9peu7pV=86!i6Oyjc5VD`N4ViR}`*1G$^|e@@toHaXxw zz}jKJKfuaV9X=Qt^baz(SF1a7*Mx^6UH&fSt_>fG9QGe(?tS4Sk)!^j%v~2g7CG)e z&fN9k;mC-8gz6&h{V~e(6Rn7V{wjnW7aD{{fq&RkP`_h{8xfj?7GZxu%&<7TenKab z=MY+jHlf{!jWTqA(qX~(V-xbmzxD{7;;_&qbPGK~?^|Y}Po(^g3jIc`Ij8?5!u!RO z#&G{LbDVJChbI3hV!OnuhXcm=AvlIdPC()QjslSLE`8L6z^qvvo(SMoVz;sW%M=u z`!D-v{Lk+;f5gk;3|g;Ud|o*D&#ZvYWX6SA7>$~QXCICk$4%i(yEi00yZ%D96!~9J z9lY_SY=~IUI)(LGHQkHj|GQ4CTJ&ek6(h}jnQP$=aI*Eb`Htl!?lyLSmpBvtD2D!h zycaQ5cR z;=Jf{s^+N+2z=?{L}2Xn#Ms%X=}FZx8eLQ!W5IAZ_)1t*t>;2=Ty3UN zNM$7os&zIf$3LO7h3RYs5HuvKRuFdGiaav&g6LZ0XEetxmL+5%dda(Dvfj&7D7klP08-jD9+&3SZ?+XA;h)I1?X!bg= zZ;8G0i&8g8FI5}6wKrQT+PY-gs6V^Qr99ph>pf?xd2q$5I2u3p)Vw~qHc3GrJ4(M* zbgyXB;oWd}*R2VMH|c0q9Ic7$`za`JvwDBPLmL4C&hM6fyYyS- z_sUn;pVW^SLxJrGUbJkjaoC>FRr`|PuV5Y21hDyyGTP*&OkAX5|m z?BHmx<^5jk=s?l?LngrNa?^rHtw~$S)kdHl;2m?$?Q_ub6AebhKtL@H1R^nEAxv&p zAnqy#awY8NqD>eQ_Pu5`P9?uxI3(0#pDYp%3rB>;*KB@= za8%$C;uMYv&G;4z#|0n0B?#}t*M)BvzNMgeNa)^1u?+e5yk!!Gh2Gcf{&HaV0oyH% z2m|<5F!tyKF)z2o;D5);p|J-tAB^(Bg?OxIVO{{c6rJN~k>`bwJRc4&^08|`Smfsr z7R9!lWmkHOi?OxvqtcvwjJe2{i{?8t>crU)8`I6lGTf5y7(a7e%twvK3_14lP?*?lE-cF9gN#D)O~s(@`@B2qF%}lV9uld%K^Kei;++uCuLore7hb$}O`MJMx36R9 zYTYnGwelHrEa(SG6hab`1+*^TA@58VXAvO;P?a_GZeEV@FTXr5VN|{RG9SSVdPU?H zWKl3?O6ADaG)s!|6ea0*$rI>LqYRdx@&18WhWY0^b`}Q=9eFx-n|kbeFe+dy=e00v zO0;l@CTEO~(+InUVMQI0nU2QNG-I6)&C4OVIagbfiSlT6WCg1$SFU#R#&rV$c?*X= zr)gxfX@)|AT3!i_xswE-4ALk-8+*gx0USeszFNnxB^dDBKUO1cG&@+ox91&&?BjYJ*>@$dD46&TiT~3 zYT%`Y9hULPf*hwM>IC0^3KA$AIKFDNByWaFR8}@5)uKRVrj!J*!(}~gAR87<)fhrk zqZ~L8p(HW0t{MY?AyLmtB-yFOq4~wY?T~<}!-hFHPVC)MTofc4<}4}O0Rx&EL7N6N z&4w zn~|T7Kvs68s_WTjAJ0&>_&)m9r?TIHL*%bZWxjt`Rr~sv*1m)!#VKD8KIN&p4#KEO zHMGE6nrdoK)Ev6+x$k-K68vRbN0AK?$cX7%O#|d_NHrog!auHSOS#;euEq^lW75^6 zxSA3}r_vU4eKBO1`eMj1^~H>S+Rk}dQCD0muI=(L$$)Gjp_yTnhcQe|OYLLV#o3#D z=$e5+z&<2nh|(smje=f`(=UUTcA71$oHQzo<@~w_lN6!bALAsAVsW@Z^<~eiSQO_?f(f-WPpbgZR}e1E0KnZt zZpuogjKN2f8iEblrAk%{-&cxwZ*8AA+^go?UCCa<8WZ=nOrOAyH0+x!d5^UlXTQcIq3URK7L^i(Uul2 z?#*HB=cK)?eEQCni!0m-P24xQ+nlCUM=R*NnshKuO0UebjI!L&cQs?r8+JJEhQ8aa z>pNYR3VjR9zWZ3(S+&Hbl67hMGR<~vwa^$Vk`yySV@5`$_1P$=Qb<-B*)GA2hQY#T zqK)iifut}!bIMoAb}Vf*I)!?v4rrg)MkBopuk<{Hl~Gu3zm({xL@kl8$8HB^7bH0* zsg(hd$&I;8Pq-TOD)og41Xq`O;jcPHH4>7g&!6g#vyQxY1I=k*5R%cO)`aZXq*f8qmp z-!s~e&j&WoSgrYk8WXu|`LScR4~~t%{h`%5;VAmB!~|&A8fjHzdxY2i+x7_gA9Rl> zTrsc`>HC8;2%o+S$X{R=0KUHJ7p~~PWw+7y1*siW^tJ!%e7| zuCMfyyMjcA4|@5(*dAd>ktfsT$|6_``x0sNvPiWC3Oh<#h1>z#xAl=F9m%IBA286< zC9qt1h_kt&%VO)*`7v3yv0rv5zrLfh5tb_pwV)oip0gLp62{j^+XSW%;|Ed9B?J@pi^0{_826nQf`=GR{kPW6Y*csYSO! za)?d`e6@uvRPih+ck`Gi62Vm))2V85I%9c=(a|`dbL3)76$yYhG*bwTS@Hxj3UUKy zRX!h^&u6UE5~PE|J`y5(4p;bB~gp13CZX}B2xjiEUU-RSU2ek1=?oAF zM_K8XoJ@qHnsBue+XiOI0#*y>lV1hxiX(I;d2Z9ww&7`8kH7u3r01~WIh^nu zCN8Yv3+Cy`aW>s_I(jtGI+0~&d>d|G(%q%FyAtlMRC^cWbhcW1SH>ZZ(z$6}nkz3w zjR}~`D*99V8kK!rC|gzgqw#moDT8O3JLRqW7q0KS{t?nl;lT}uCHqSOsaZ@D(Tz74N0>FrXyT?ubjCVBUU zr~AQ7jzIN3rMjIG9nT~>xZyqcXd>x7rg)DfyvMT5SoNIgfuQuBAk^nf8Qks-FNi5U zCpLS|Z}gl`_FPbUE+oAd74OA__aY_zTB3U3QT*Mn;zMc5H@!U@-kzklPx1C8ynX-U zvvd`>$^QpxipoM&;XR0kAfB~e9}qMu9us(y8zj5A7`JOksST>eFF1;Km`#kNA$i_R zBYc@=`ik@HNz0#%mI1zhbQtg#L#DIswqG1>pRBch&@eU(&quXmC(e3{e(klu^Xq*s zVEww?dbZ2?>n;nqdrjo-WA2mIbC#mt*iC>E3EBo;oA_JCYd-@A>0{RM-Tq)V(DgC` zw_ti`+RjBV#S?5@NEC!v7{-Tbp9+^OvLC{U8;q&~OJx}~X2$=okw$I-V8$=sE&g`# z{Xxv$M}vudhgXV|jw6cWNWyUh3(rakQ!wGI<<4v%j^p3Y>-F;oIt{+^Y)}?;Dfa4B zwTKX5=Jk2Cj%P$s?Tpkbc?dK4c6(Q6by)xfB)*chTQ3~Dw_721L}n(^0FpqxNWzlO zs%hqy;g-Hi;4XknIWY|aY3axqg3cV#Tv@HJ=KV`TC6{4R752AX zHA>P5EA!{*OQY^B*SoR{eGNqI$??z9-y$5TwMUxEw@QoWNg_AwS)6#Dj9}E`$ftKs z0ZB!deDY6J1XDauj>s?H&UB2q8GZRFa%VfBsn}L|o6gVShMod-)1`#} zjk@V{jI}ZP@^cR8DYAyE*{{#C)K+-D42_n4zRdU0K{FltO4NhXzEbHFzEYgP?-3wt zTb!WCS$hXqxh={#;baC35{U`YO9V)ilU^ibilYM^Vp(a&CP^MF2}=2XQieQd`lHOnvw5}-8%z)A2E@9s-*mjpe0;9 zUYOfC$wbfD@sw`-b7XJq#@upCr#4apl-@Yz$jR3WoaD(j4i?O>0b{&C*#0B#RdbY- zG5WHMjP%F2^}LGXlDy6?kL$|=6bJ>!6*zV#J9o>{?MWCu6d1rTb86UTydvhQ!9_u{ z)uKJ?5;Kj?GuhGtvsPWSIUnOOCdl*)MnpMVg`D*UJ4)Whra&EI`t%U$_a--op?h^N zwcWa2-+YI$?ysBgRl_Kk_FOtuh3&ezx1ZTF=WDD#FCGrV=zca9nLn}A!Uj}c*@j{I z31g}gy*VVZf$y;0Mh ztm##1dRNY*T763EP@;U|JGWMEB+HwW@}@+2(|gAfjtN#bX$hI?M}5RB+VRhpvA>1m zO)jo8kQi~MxUQIk3JLDqjiCY++Kyv;xq$t|NXQ%A>>!cUp8DdnY?f%AP>HrZ#<4<& zi}YtKlXm3z6lH{Y=|4VCwvFQNJY9A=Hp-#*bQ(C2dLxOm9ujkyK6nTXmZ?{Tns?k7|=O!%EFC z#-XOwusE@j1Ed;#v})I}a}`r*BlHAsy54ZTUba@YT9z)#qA}dZl;8;g=6yO~vf9&7 znVs`rHjFk~-fy;!wiUhaGXWY_EuG>1pBTl)9iZ^Adp&PHpg}SZMzucvw+mc(>-h;_ z>Z3i!f=l~%4$t3f)~S@+p2Asy1B+enOBwRe8F=a6vO^9F-HCnG#O9SXjC--Knwi2| zKTf#YXr>(qCHRS63d~(S9!FKPJ zom*))#b;E-aXPP8o5OKB-Sjo#Ms3BbmSxM%hZaInVd-DuqJNQ9y&8H$Kf;hM8Nxl; zJmpjQ;hFaPEiDo6%BC(<{}-0)cWjNzD2slSA)kX!KhBUR{_&J^=UNfVyUPwi+>~Rf zEpLa&tiH^S8FsC-CT7f1dl~aHjf+}E86>*1bzvbszYr(mxx;Atr4A-}!7#QNW^9@j zo7~K-WHXoac--Qek4bT#S6ihuwKCZV7OEs+0A7#l-?vU0>aqLk7+A(l)p9|`y7=Mvqgc%?m`T*(B^TM=PI;p?6tdwI{t1cZNt@M;B#kAs3jO%a8b0A@SVJG3O zBdu<4sE z3{zG`L-O3%W-j?1%&e7B@8p2x{T>&=W3KTM^Dpc@aR1`qC^vS}_Q64l_~4{<+~WMD z#RB&)?Iv;;S;<|}GJe4J%U(0N`%UCN&d(#fA!(|zhI85{RY z`W2(Ay1;^}HgdX#PLBE?8wwGkNVa6L-CYtoa;2FU95%E%#2tNSd9oQtN7> zMj7@8c5x~=8^`{rZDcP{H0=|rl`b5sIA+CtV%(3(n7QR`9~pUMosezFM2s6Hl1gMw z#m(Ci<%}9~hZy{73nUr<2-Xg+@1W8<&diY&M;A0kq?W|;?s5*p9(IikxJoBU??({! z%5`+^XE9fed~b3sWA24DTdC>XtU0z(b4-(MU_)E67dEtfYog)Q`tJig8dnA<@Ler| zA~8phk$ueIll+XH>Soiskcd{o&(dxVr7lfdEY9InTj$$R=0d^u4c|YTs6GC`qxg>D zyK;7`yf)#emG_`ce>BRC91fC;sT6gUy zS1SS9?zPx6y6dd&V&g);Xd+#rh&BT4061x4Zlaxa6A$S#odN^F*cq0sox7G5K8 zJ8Yz2-v&KJbTiio_ON1?+D;)s4(cUmK@Hr5=?vmsHZWJafjZs>p2G;nO_jENX>J#w z^%Qjyo$N(|p(x!_hJD8(xM=*0h;=+P8<$)ZZ<|?|M;IbU!=X9+iiSi29X^zrf-eT6 zBK=Z_^%8DK<7>aX7>x(-P}B_FUJHH|y)THk>=1)F3VyU9-hngF1yMf6PvHcXP_E2e z_3=F?^8A$N746pP%+;&f-P`8oW|jaNE?U3mM3}FTx+}=X30=GC8Dw`nnH)k{@hq!e zBxRR8@v{#Soxmb@euO7qrYt@d9hVk!*L>$C@m46dAZz$QkK)HeI`SxJX>ei-Gi9Fa zfV9$KBghfaex!pDrwfEEYh1-;S!W88LtYGtVS#7n*WK8b^0U{ks2YP&Dn^n;Ysu-# zWnpU7uKo4}{q}~7%zgqI4ydL9)pT&_>o4J&?JTYhM}jvs zg(BLD*$we9=*Ar-iS+^9jD!;^Kv~q#NL`Ezljv0bdPorI2UoJ!Lz!h0)a|#g<0oC1 z0x-Mv@+bgqXiM2km=M!?mpZ1R{59;m-Tal%Rb0-#(igg#x2X zxIJ?vg5UGN;JeBSAYbXb+S}W^RCf`*5MM-#(pE0uWKmj}#c!vGGGggaJ{ZC9St>K4 zK}Bz+Lw!KhVachDYNA&*Np-~aPz*e2vB_7dS}sqHtCsUGT~aL*&jUPv8Q#(70nS`} zNwthkpH?lW&%!%43NSSdl<~7?Rm2Lll|S?6%|3zGu&V6*X01SFgL{vXrx zpHF^5Jk%$D0}y%!GjgeHB9nl>gak6p*LWz7hA6)rTaac&er!Pk7d5-MN#WW8H9dYZ!2(R_4*_ub zl>JN&dY%0WjCMuNPBAv>0a+>{w;gUmAx2ap?ogr%NhJhmrILuJWyi%5oz!b5ztjS` zi+ybAl1TBS9eJ=#l=M5&Edq?EE53%&8NkTAv&fE-)uODWT`h3b5*pwcc1^o=$GCz? zN>Aq|($5Jr5Nd^1U>HusMcnYlHGXFMqW$&*t)6U8#t->mHH$?s&TyMtb=4{J8Xx$k~Fl{z^ZkfMymjPb;tVugGncu=q+pBd1+v>#y{P;joz?{TaE7f`Sl` zVz*UKcHZT)on*$sCW5RwvqMSF9RFxU5=5jt5Xk$s>Y!`d%+oRDB+PA@KkK*b1A z++<2|&53RA7FT?i{iV3h#O`m3YfKp56!)dX|Jl36)g+8>io2BfVsDD8OBml2*OV~6 zJB1uia67yyt~OzOQ{3K!@!hhx!5Ep^x2$am5YsKC3^p~=h-#trzDQjcG_@=BKiQV5VYhA+l zrmTFz_@=DQ3FDhGCIN+%wKidVQ`Uxr@!g(ktE_5e?pvXIp}Uh?rIjl$q|L?7=Ja09 zSpl_DdS6+Y{V@mdguvZXX`U4eR_7AVhNQDW zaWht#xzV2URroo3vMRa&&BGu6T!1l<3zo|bf zd$%mvaYAW0xpHBvt~Jf=D+Lz7sv}jo@BY^|Dti-^y(v#!%3X{5RmC7yzE-|ko~mqG zJ+yXWy=nbYva&_y-O!l1Is63gdJel&eZF)L4JkV`E7)4axG<*mPOqfYP+CA~w6cWBkN<*wRv^BZnH(KL{BA5`226YhhlT;SoP`-tK` zl5ii<1J@gq?gNVZK*D`sYiM$F=={de`Q*?AWeBQC2PAp|&_BLDz52ranf3Fy!$o?| zl(zxOSiJYGsmAU^-2mQH*OB)QZgibUbe&jlU2pyC$+XQo=`xv*VbOoi}N)C*<~)6Y^PlbG^h#i{0VCd+S3)^oO^-#AQw{|keyPz3-0 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc deleted file mode 100755 index 63d6ac89b094ac1c7d19112156d0587d1d789b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4973 zcmbVQYit|G5#A$td_RuXi;^XolBL@8gN$Ek7HUy0B2jQ6SjQXn5F1@pmDC?6_?^I=xctC3PPA7#8>jg{j0cqx%jFgc(K zrDQ(I_@KI{)RXVwi0qX@gUxx6e6NR`BU1Q%B1P_c2)PG8x8(bz=p~YgJwh?#wSyNc zhN6`Vs?A?suBfsdxS$v^EvSz;RN(B8s%aHbE$BwZX9vz`WnBZUc!P1Rbvr&MmnAT} zrplLBE3zGR_FD0NZAqByWNjrQ& zS&`kBU9-+mxnRh8x{#(VcchKQf{`v2R@2wy^m0W41t}X2r=d*K1^qPRP--(d=yurj zX6AHyy1d%1pj}&%i$=C(tE21E2U{LIlGYl_%4}Ow+Ep~PbfHpFSJS{4i*j4f+4Na? zz5r{cW83(+JA_T>9&oK4-kqb(v##vqicAfqSWra`xOr83*Y;D{Sf=IKVsks-@*n`c z@Ov@^H?`qa@D(K{|f1X>^N^-7LphYeBy0)O5$blDK3KciY&Sg$yQeFpeQP3#Sq1{o?S>}o0a`AzCH=$ zJ>o>k-pQKpR>JBVf=AdIJ6`jd!BOkjDG(zy_&fncQf#>ZgqHhyLFjg$#DP;hYt>7# z0njVU@3t?f3pITAPPk#s?sBG|6LLq=O1Y>mOG^&odr60#jtXjev#S#%>NJS7Mzup3LT!_viNs%sR*Yx06pF5^OI^JxTQ zV>uha1=n|uZN#=1gO!c&3o)fNgi_XxLb)h+#HtEa$}Co)5ti9UxSkZ9p7GOR1yAvP!4 z{zX|?STuC>J`CUjB~j5}=fRmIy6?I+)P|I+s>;_*Y>vG-(cI?{oFk@twg5bMW~6>3Zr#hxhjN zJ3*2f-Q+%4dmQrh?RP?;?~pbUi+|Nmgn^r@w^r-H)VIKL3ue{@%c=hlmJ3`5_&Olg z(b54+1mE|7-Cv#xyP_%=0C25iB3&p;05#pvC<3M(k_sFf6)LYN+A=VWW&9p^Y(NuY z%yZ$9L6J^?lfQvSim{d+K=K152Z40LEZ%s9Cd%65QD+mLSb7o2cY)0DdVAwv^o*K4 z2e-!Rdyf41hM9Zq^RasNLOuCL{mrY}$*X`b1XCLUFa^87WCvjHvotH<9^-nk6`x=l z0r>5Q-;?{WAAd%;E{LsrtK4RLlmu0`0Q7JNvvL#y^7Vy@2qnUPr?otbORlcidf7Q>TZ(u!G4OTr%7(Q58!uMe1I_s7G73LRg)=A#$ zY_2p@r&yGHA2&Xf?zFL^PoltQ0{?}8`p zwY;$&s`8uczObw9at7uvjRL;MK>CeR4R!kR+a!)W|9U_|g)y6z4y$;xw)0F{4;%ZM zErfKh@LBSU9=5`f^=LIZ1Gkc(!GmHvmZRf~`z5u(Yfj%KWPBg}jXQnGsm# zVTTqV+h7^0J5K(L3_FKafR%*x^$~Y1K*q+A($d^bqVosbS`|m`5AN|wi%>$ogKg!-8*&ctz z9Dikd(D+% zZoXbSyD?!6?5$mF|5!Z(4&h?^tp3rBIDY=?1ezu+I{?5Vlo`x30$vr$g_10ac32ck znzXDU9~H%SmJ4d5B_N8DR)iJB=s__Xw)?L(u38rxH?22hxT{DM_a+@j!qTzB$Q?z3 z!IWZ@rV%7(fP6~WgczD=AJ!tl{h&Vr@?PuXcz8bO5G1{1c+@&M<%B}~iw*(uuy@?y zQScLC&AR%g&rfcRIs_hnJIfy3MCjoMH^G(g=q87v&=hb8 zJi5v7D8J7d70l&ABOrI9%P3+gScM6cc0Dl+kRuU0*N%m6OiIzL@|QfyompO zuzgP12H$lkTNU&wJFD@Z4d#41pu7KPu%wv98TXFL7SMuYtIfVo97^{0KGrrBR7 i9p8t8>H64|Irs|HJN~yh4%Xo5^f9ad@)@nnCI16t;hl;A diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc deleted file mode 100755 index 53f27e2760c58aa8d0583e76be15e12c55f05718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15018 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 f=q_+Xt=S@XLg7xxMkwWM1W3f8AL;%#m;P5Q diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc deleted file mode 100755 index 8d9cf2512d846c3bf86b8f0917bcb9c0d3be118b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10762 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 uZOP8U^l# diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc deleted file mode 100755 index 8f0929099a2ee73e6e6818deac75c4cfa9fcb3e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7271 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc deleted file mode 100755 index d52c300fcbb6543f7eb0ad8afbc4ede2cd805f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7240 zcmbU`TWlLwc6T^4e2b(+i4-M2Mh{z}Es62UiDN5vuq(?>{mMg@<1ls!nlq9q^P$|K zyf#AtX<;nb!XIj3z-r?FY!Red*dN-3fz`);s6YzjqaQA-9hx^lW z?hId&ceA^9hG*_Q_nvcK=XEdtrK7`1ApOUKe_R~%6Y`%}s3(V+dAWxpo!pSSG9Fs#tT&bQ>F-4=3|$o6|g zb|~&|ctRe-&q&c8B_KO*S+GR+!@OLnV7fQj%MlAvdg0e2yX6kq^TgXu_YJJWWB3^f zM(vwrzi{Udhzg5($K_8xn2AllH#2?yFD{+cg$qeFr`z9O$|bXzcuE&9FE6DOU7X86 z`3K|_7IfQmHlt<%?J+Y(b5-|zq-11;#&4vQ%XgO)-EEXVQq<*CF3jofbIVJ2a|*qf zypzm8*>zEgtIJeLD;cb|%_<9KR-Db=39?JE&D&-7JzLbSI9SUL#VLDaGH;c=_k?eN^JAko zfKiv?W}G|`}ydi`;onhZf!;ZStXwJ(Nb< z_cMG#n$1BE3sRO!+1yQqO3lU-je#u1WoeWN%%?D#F^P!~X0Kld4(8ybdEk-DE{#bv zxo{I&-N@#0+4Ptchnc37`5Yi9$dcORi<7(%uO4de6fRe3Vk_jjXcPVVAK|tx&sx>=`U-zZhmtJ%oSY+8w=<1~?toXaj`CnNEtrO0h1b32ks-iUzNx|z*PP8>NB zQIk1k9J`M%C~9OWxfF>(GdW8mG?};=G52_4>8@^%#gdt1E*8uC%+;T$V+NpS^<4m8 zkeZM5A1Dg}GhmQFehnc5Z3V2{v`V;`?dAkAO^N(7O$st$bCgCw!9hnaEvIjQ z`N__==q3(p*I+(kOVVQAkd?U`C#0X&vyHhmm6_?=nXttW8q||8N4xOD>wF@m8WJ@O z2o)C?*izh8-D->>@2T&(IVNm42;d9yKfS~kT+Od@>qpk(8$H^{u`N;ao+*3JRJ><2 z`x!a}%@Qp;MNlo+F1`iW9lJW0s}FiUa`RYT=$S6G=dg9}dq z!k=bHFljr07L3D+up+KlS8N5LAQr3z z8>4R+143l+56$IEB3r-W+voS!T-cUBILFLJL!O&nB$<&K?qY)4VYS)r|9~s`0}P1d z!{}pnxEQK@ww$EkgwU6nN-`zot7D>fgM5|LxV!{`O??WYr&7{p`V8 z#naX9-nHS9P?9zOVaUh%|E5Nr*^g*IaGEJ7pGTy z)~qD~yY4Aj*9FZ#uDQpbdwR9d+`r9!=l|EM-(H2R@s>STDxNEv{mO22K)1%!;VNVx z&Icd02stBtX^|~ZZm18419+CjhEkYiq-V)2<1W|B!dEUZf8wRQ{R1Nc7|rt#MZMz2 z@|JKoEE=l+nymo~ApsK=J2%Y%I033G(RL?bU@l-&!wFQqiM8QJ5zU)`cSCq;H*%Xt ze|y5neJA|8%gAY0qLnK#GY{?U3ARAG4dO$L$|;_Lbej>-s1(Cy>ISgOEufWo`4raS zJmHw9F9BkAYF*2Ar2++SSyyT=SQZ>@fv~UG}ZCs(eW42;JT*QTB>8}nK z#8OAS)cS301spx~y1dbYx3&C)+tmkG^3_|ket}bCmB1+S%wdDfK5oeEiZwUbqyXdD zGCK-q%YsdApE0MchMGXCG?KFQv0E5!IJ6zBU^GS z4j7HIbq(o|IT|6)#vqGdfqQA6!vY61ZB*EH25tjB=dX~5mR|@QDcEUW!Frlp53INf zcEECgbM0v3XfNLnW_lP+7ts7zTR)7tvD0*<;9TnZ6Gq;k+&yxPgjqCfy#yy_>rDku zPjCt_qFQt&uQ=%y=M4LG$AXfJv9m!leEnV~42Iu9+4$l390MTImxp#hB;%m+png7KJX62bWP znwA_Q@b;Sbk;^}Wcld93AR4!l&ff2R1J8T|rQxp+m3`wC-*{21y1e(NYQ*mFfTOE) zA1KZgXa1`@_}th3z+1Ad2RDYFM#{dQRq#Dm?Fu{yzu>vfJ=>5w^g^_B?qz%{zJV7G zvB&c}0-!ikbCbS-??dCyLgVYohWs>Ho_Kd__}fF}i3{b>#Y*U6(NlGWDlSQLjaBy^ z{(kTAXM2xVg9j?XvGv@OJLTZ9&Eel3E(d37JlS{R1+nY{&H##+%vlUS^9@(szWeX5 z{pH4+n=&-(JOIr)ozSe)Srj2I=3fT6GZe!j+AI);i@i&r6Z$UVxJLt!m&czv$iF%YGKtJu?+=AMCf zyQ}Zv_}`EJUF1PT>m01vh{IEJlE`GyiL3c`jaVGx)xN>C(Nbc4=AUk9LvI@I#&Wsu zWTo$<7CKctR}Bu7PJjJgIXI@dU-JSd+?9c9@7@~WI|dk76{>;0RVO~x{{5@o)~DJp zX};ILH5)Q;lF&XF8nOZato{TJrj%G5Z&X7=TIj;Meciq>y?NkQ=d~l##=A9F9z9^)^uLgS6T4**zD8mmx)BM1O=?6z z=rzGN@&y6?5`_PZfckO`FN5A;r)`BpL`(f*!}q`u0sT0Rgr#;r&W-~R(6`cp4-=T@ zwi@4d8xG#fR%%2Eb*}h@5y5<#cbeD|Vl~Sp7PW_M^dvND8Vt5t6k{yIzPa(fC}tWt zh`uGPX<8*D)?Lb-9F3bs(v>!@C}UtO^=2V{r%}Kg%iSTlUN=E?`rRg|QL_TQs=olh z%umlAv@Z@2;Ri`(f&ybjSJl!9X3_}ss5?e2QG>_1xZAJyDPpASuZ z{qDxG&9hsVzm1iL<|;#TWxG^#t$zAEFi<+Y;VKVKZGQUQRQcqUa^T}i;A3DJ82COg z@hmX0ezzPrUI`orl($c__c1X8??U}Bq_EXk9t^(>%Z*_GJ%9jh?;om1-xBV^YmiJl zt;AxwGZsr{<>eIS-Lcqb%kh+1V~fS)YyxaEikHsA)f~kzNEh%bjbdD*yAr9ms-_jV zh>__yVCX2K-Eb$7OD0S_$_zUV(Kj)74#9^2en|}F89)SvDGcBQ)!QIXUo@VY#UBJK;$E-`!-uND{#pkXpw0l>-NQ8z3s&M8s5kWWtj?|-SdCV^Qq6^xZqnJa zgV12nN35OL+gVPNK)*4w={LSxA>-Q$U+~cW-lqmd4T!sHmJab_PU{}25zMU5Yz%Fv zo6}o1S}6(WnSd)ExQ+CEN{xwRoU48r#{&^ji*Q4LBp9>0gD*mv6ztcg&r zk#=y6bBg_}F@CWze77Benh4(-`8~kc65I`xk#szniNzqO5!o$v-py{W$E1(5G$liT za|n0sFo3+xyubz##W3PhIHX&1cbDL%mg4z?qFJJ7izpKZ6sZ;=X7Y%s=Bp8Xu|(2etNhTX1|aQyeLdtWJ~;Za6gO ZiL&!V1)wlh5vH{I3lWIW2MpMD{6B7EzB>Q_ diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc deleted file mode 100755 index afa794e9cdb4c7e236fbe77ed99c3a3ee928ac74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2245 zcmZ`(%}*Og6rcU{`U9NigET2bOHczo)UFft5=E5)Rgro?t!NMNA*;nR0XO^AnI)-F z4jeeps8Tpo0`q2zc@K=W_NH{RtVW7lu*SZzEV?swWcaKS3S+wYq~;IGE1noMySq| z9k8Mal`1uj=~QI~)u{eRr^cE-c;uQ%b#Q1V#@Fs5<11IEUBT?S=L%sz3c2mt z5z5O+rXB_{3*yA&EMDfpT)h_(xWt5E(GIcdP;3Qksw)fgOW{+yyU}h0U0b=F-EH^z zqPW|eq3~FF3L-AuwP#YNb{yIZ%%%+yd2W-@a&OPvOY%}pbiuqw+ydVMPi5Qhzo{&R zKCAdHuZNYd!o~1T#f_rM6BazFc#VZh)Pz(9cgodjMKogeN#xcaL!hD(HKK|GYBb~( z-l#8C()gn$IDu$Zaxzb497}%~@T&YB!ibbIiRCzf>odnma*pGNblJmk!Et_AcD?RO z#&Kv^cO0(6oBA)h3tFz!tf_bw#?ehpr=?Y=co z?zU&Aw2+f?i4ip+^>DYKIt@Pxc?{JtWR*F-3S9=t0wks*7gjFz#Z^vamr?fyz$*Et zcx`KPuXuC6c=PY#)a&BZ?^pMV)%{|%WmRRW2QN!6uuoz4CV57-p+DPBA0OU_^jeKW zUeo*m&APc=7LeA3rY(aj&y^HD3Kq`S3k*8x_^8>{dl|2)4jyJwB= zTcfSxPsUNQ_y=hABElsE%mTlHfD}!gp2uYLz!7l2cnE+TPJeB^+S02XT`_KN)jI^b z?X;8QJ}^~d42cdM5*@n#g_Pmw5bvY!HUh_ai!6cHbJ%wuGbd&ucIqz2_cR0Vj0ipU zEsRYOH$5iiO2difF4Q?zE4`*>+>9E*Vj8KunldVx5hMb)0pvr8w)i-TK0=WZ@kS7z zy4>%rd+FowIiCb2Jezm`*wGY4X_JZ8d0(51vWRJJvvz$A$nnb<+XOLrCn?5Q?0?Tt=p}^@6GU)^~IkWKQ~rq+t~{*#-5LD(e<&t z?8JU{0_!&=p=}jk3_Ty(2sVPfkz4yCxAv^beQUC1O+w6F9jSPLTaJ4BPAr@^diU<# fdE!1E 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc deleted file mode 100755 index 1fd2f94874440ff66a658417e3cca2cd2dbdb764..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44965 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc deleted file mode 100755 index f919b6daa54323f48e96119f8961803fbfd89948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11012 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

    {code}
    - - -""" - -CONSOLE_SVG_FORMAT = """\ - - - - - - - - - {lines} - - - {chrome} - - {backgrounds} - - {matrix} - - - -""" - -_SVG_FONT_FAMILY = "Rich Fira Code" -_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py deleted file mode 100755 index cbd6da9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_extension.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Any - - -def load_ipython_extension(ip: Any) -> None: # pragma: no cover - # prevent circular import - from pip._vendor.rich.pretty import install - from pip._vendor.rich.traceback import install as tr_install - - install() - tr_install() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py deleted file mode 100755 index b17ee65..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_fileno.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from typing import IO, Callable - - -def get_fileno(file_like: IO[str]) -> int | None: - """Get fileno() from a file, accounting for poorly implemented file-like objects. - - Args: - file_like (IO): A file-like object. - - Returns: - int | None: The result of fileno if available, or None if operation failed. - """ - fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) - if fileno is not None: - try: - return fileno() - except Exception: - # `fileno` is documented as potentially raising a OSError - # Alas, from the issues, there are so many poorly implemented file-like objects, - # that `fileno()` can raise just about anything. - return None - return None diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py deleted file mode 100755 index 27d65ce..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_inspect.py +++ /dev/null @@ -1,268 +0,0 @@ -import inspect -from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature -from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union - -from .console import Group, RenderableType -from .control import escape_control_codes -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - - -def _first_paragraph(doc: str) -> str: - """Get the first paragraph from a docstring.""" - paragraph, _, _ = doc.partition("\n\n") - return paragraph - - -class Inspect(JupyterMixin): - """A renderable to inspect any Python Object. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value of object. Defaults to True. - """ - - def __init__( - self, - obj: Any, - *, - title: Optional[TextType] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = True, - value: bool = True, - ) -> None: - self.highlighter = ReprHighlighter() - self.obj = obj - self.title = title or self._make_title(obj) - if all: - methods = private = dunder = True - self.help = help - self.methods = methods - self.docs = docs or help - self.private = private or dunder - self.dunder = dunder - self.sort = sort - self.value = value - - def _make_title(self, obj: Any) -> Text: - """Make a default title.""" - title_str = ( - str(obj) - if (isclass(obj) or callable(obj) or ismodule(obj)) - else str(type(obj)) - ) - title_text = self.highlighter(title_str) - return title_text - - def __rich__(self) -> Panel: - return Panel.fit( - Group(*self._render()), - title=self.title, - border_style="scope.border", - padding=(0, 1), - ) - - def _get_signature(self, name: str, obj: Any) -> Optional[Text]: - """Get a signature for a callable.""" - try: - _signature = str(signature(obj)) + ":" - except ValueError: - _signature = "(...)" - except TypeError: - return None - - source_filename: Optional[str] = None - try: - source_filename = getfile(obj) - except (OSError, TypeError): - # OSError is raised if obj has no source file, e.g. when defined in REPL. - pass - - callable_name = Text(name, style="inspect.callable") - if source_filename: - callable_name.stylize(f"link file://{source_filename}") - signature_text = self.highlighter(_signature) - - qualname = name or getattr(obj, "__qualname__", name) - - # If obj is a module, there may be classes (which are callable) to display - if inspect.isclass(obj): - prefix = "class" - elif inspect.iscoroutinefunction(obj): - prefix = "async def" - else: - prefix = "def" - - qual_signature = Text.assemble( - (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), - (qualname, "inspect.callable"), - signature_text, - ) - - return qual_signature - - def _render(self) -> Iterable[RenderableType]: - """Render object.""" - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - key, (_error, value) = item - return (callable(value), key.strip("_").lower()) - - def safe_getattr(attr_name: str) -> Tuple[Any, Any]: - """Get attribute or any exception.""" - try: - return (None, getattr(obj, attr_name)) - except Exception as error: - return (error, None) - - obj = self.obj - keys = dir(obj) - total_items = len(keys) - if not self.dunder: - keys = [key for key in keys if not key.startswith("__")] - if not self.private: - keys = [key for key in keys if not key.startswith("_")] - not_shown_count = total_items - len(keys) - items = [(key, safe_getattr(key)) for key in keys] - if self.sort: - items.sort(key=sort_items) - - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - add_row = items_table.add_row - highlighter = self.highlighter - - if callable(obj): - signature = self._get_signature("", obj) - if signature is not None: - yield signature - yield "" - - if self.docs: - _doc = self._get_formatted_doc(obj) - if _doc is not None: - doc_text = Text(_doc, style="inspect.help") - doc_text = highlighter(doc_text) - yield doc_text - yield "" - - if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): - yield Panel( - Pretty(obj, indent_guides=True, max_length=10, max_string=60), - border_style="inspect.value.border", - ) - yield "" - - for key, (error, value) in items: - key_text = Text.assemble( - ( - key, - "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", - ), - (" =", "inspect.equals"), - ) - if error is not None: - warning = key_text.copy() - warning.stylize("inspect.error") - add_row(warning, highlighter(repr(error))) - continue - - if callable(value): - if not self.methods: - continue - - _signature_text = self._get_signature(key, value) - if _signature_text is None: - add_row(key_text, Pretty(value, highlighter=highlighter)) - else: - if self.docs: - docs = self._get_formatted_doc(value) - if docs is not None: - _signature_text.append("\n" if "\n" in docs else " ") - doc = highlighter(docs) - doc.stylize("inspect.doc") - _signature_text.append(doc) - - add_row(key_text, _signature_text) - else: - add_row(key_text, Pretty(value, highlighter=highlighter)) - if items_table.row_count: - yield items_table - elif not_shown_count: - yield Text.from_markup( - f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " - f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." - ) - - def _get_formatted_doc(self, object_: Any) -> Optional[str]: - """ - Extract the docstring of an object, process it and returns it. - The processing consists in cleaning up the docstring's indentation, - taking only its 1st paragraph if `self.help` is not True, - and escape its control codes. - - Args: - object_ (Any): the object to get the docstring from. - - Returns: - Optional[str]: the processed docstring, or None if no docstring was found. - """ - docs = getdoc(object_) - if docs is None: - return None - docs = cleandoc(docs).strip() - if not self.help: - docs = _first_paragraph(docs) - return escape_control_codes(docs) - - -def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: - """Returns the MRO of an object's class, or of the object itself if it's a class.""" - if not hasattr(obj, "__mro__"): - # N.B. we cannot use `if type(obj) is type` here because it doesn't work with - # some types of classes, such as the ones that use abc.ABCMeta. - obj = type(obj) - return getattr(obj, "__mro__", ()) - - -def get_object_types_mro_as_strings(obj: object) -> Collection[str]: - """ - Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. - - Examples: - `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` - """ - return [ - f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' - for type_ in get_object_types_mro(obj) - ] - - -def is_object_one_of_types( - obj: object, fully_qualified_types_names: Collection[str] -) -> bool: - """ - Returns `True` if the given object's class (or the object itself, if it's a class) has one of the - fully qualified names in its MRO. - """ - for type_name in get_object_types_mro_as_strings(obj): - if type_name in fully_qualified_types_names: - return True - return False diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py deleted file mode 100755 index fc16c84..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_log_render.py +++ /dev/null @@ -1,94 +0,0 @@ -from datetime import datetime -from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable - - -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleRenderable, RenderableType - from .table import Table - -FormatTimeCallable = Callable[[datetime], Text] - - -class LogRender: - def __init__( - self, - show_time: bool = True, - show_level: bool = False, - show_path: bool = True, - time_format: Union[str, FormatTimeCallable] = "[%x %X]", - omit_repeated_times: bool = True, - level_width: Optional[int] = 8, - ) -> None: - self.show_time = show_time - self.show_level = show_level - self.show_path = show_path - self.time_format = time_format - self.omit_repeated_times = omit_repeated_times - self.level_width = level_width - self._last_time: Optional[Text] = None - - def __call__( - self, - console: "Console", - renderables: Iterable["ConsoleRenderable"], - log_time: Optional[datetime] = None, - time_format: Optional[Union[str, FormatTimeCallable]] = None, - level: TextType = "", - path: Optional[str] = None, - line_no: Optional[int] = None, - link_path: Optional[str] = None, - ) -> "Table": - from .containers import Renderables - from .table import Table - - output = Table.grid(padding=(0, 1)) - output.expand = True - if self.show_time: - output.add_column(style="log.time") - if self.show_level: - output.add_column(style="log.level", width=self.level_width) - output.add_column(ratio=1, style="log.message", overflow="fold") - if self.show_path and path: - output.add_column(style="log.path") - row: List["RenderableType"] = [] - if self.show_time: - log_time = log_time or console.get_datetime() - time_format = time_format or self.time_format - if callable(time_format): - log_time_display = time_format(log_time) - else: - log_time_display = Text(log_time.strftime(time_format)) - if log_time_display == self._last_time and self.omit_repeated_times: - row.append(Text(" " * len(log_time_display))) - else: - row.append(log_time_display) - self._last_time = log_time_display - if self.show_level: - row.append(level) - - row.append(Renderables(renderables)) - if self.show_path and path: - path_text = Text() - path_text.append( - path, style=f"link file://{link_path}" if link_path else "" - ) - if line_no: - path_text.append(":") - path_text.append( - f"{line_no}", - style=f"link file://{link_path}#{line_no}" if link_path else "", - ) - row.append(path_text) - - output.add_row(*row) - return output - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - c = Console() - c.print("[on blue]Hello", justify="right") - c.log("[on blue]hello", justify="right") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py deleted file mode 100755 index 01c6caf..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_loop.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Iterable, Tuple, TypeVar - -T = TypeVar("T") - - -def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for first value.""" - iter_values = iter(values) - try: - value = next(iter_values) - except StopIteration: - return - yield True, value - for value in iter_values: - yield False, value - - -def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value - - -def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: - """Iterate and generate a tuple with a flag for first and last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - first = True - for value in iter_values: - yield first, False, previous_value - first = False - previous_value = value - yield first, True, previous_value diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py deleted file mode 100755 index 6ae05d3..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_null_file.py +++ /dev/null @@ -1,69 +0,0 @@ -from types import TracebackType -from typing import IO, Iterable, Iterator, List, Optional, Type - - -class NullFile(IO[str]): - def close(self) -> None: - pass - - def isatty(self) -> bool: - return False - - def read(self, __n: int = 1) -> str: - return "" - - def readable(self) -> bool: - return False - - def readline(self, __limit: int = 1) -> str: - return "" - - def readlines(self, __hint: int = 1) -> List[str]: - return [] - - def seek(self, __offset: int, __whence: int = 1) -> int: - return 0 - - def seekable(self) -> bool: - return False - - def tell(self) -> int: - return 0 - - def truncate(self, __size: Optional[int] = 1) -> int: - return 0 - - def writable(self) -> bool: - return False - - def writelines(self, __lines: Iterable[str]) -> None: - pass - - def __next__(self) -> str: - return "" - - def __iter__(self) -> Iterator[str]: - return iter([""]) - - def __enter__(self) -> IO[str]: - return self - - def __exit__( - self, - __t: Optional[Type[BaseException]], - __value: Optional[BaseException], - __traceback: Optional[TracebackType], - ) -> None: - pass - - def write(self, text: str) -> int: - return 0 - - def flush(self) -> None: - pass - - def fileno(self) -> int: - return -1 - - -NULL_FILE = NullFile() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py deleted file mode 100755 index 3c748d3..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py +++ /dev/null @@ -1,309 +0,0 @@ -from .palette import Palette - - -# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) -WINDOWS_PALETTE = Palette( - [ - (12, 12, 12), - (197, 15, 31), - (19, 161, 14), - (193, 156, 0), - (0, 55, 218), - (136, 23, 152), - (58, 150, 221), - (204, 204, 204), - (118, 118, 118), - (231, 72, 86), - (22, 198, 12), - (249, 241, 165), - (59, 120, 255), - (180, 0, 158), - (97, 214, 214), - (242, 242, 242), - ] -) - -# # The standard ansi colors (including bright variants) -STANDARD_PALETTE = Palette( - [ - (0, 0, 0), - (170, 0, 0), - (0, 170, 0), - (170, 85, 0), - (0, 0, 170), - (170, 0, 170), - (0, 170, 170), - (170, 170, 170), - (85, 85, 85), - (255, 85, 85), - (85, 255, 85), - (255, 255, 85), - (85, 85, 255), - (255, 85, 255), - (85, 255, 255), - (255, 255, 255), - ] -) - - -# The 256 color palette -EIGHT_BIT_PALETTE = Palette( - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - (0, 0, 0), - (0, 0, 95), - (0, 0, 135), - (0, 0, 175), - (0, 0, 215), - (0, 0, 255), - (0, 95, 0), - (0, 95, 95), - (0, 95, 135), - (0, 95, 175), - (0, 95, 215), - (0, 95, 255), - (0, 135, 0), - (0, 135, 95), - (0, 135, 135), - (0, 135, 175), - (0, 135, 215), - (0, 135, 255), - (0, 175, 0), - (0, 175, 95), - (0, 175, 135), - (0, 175, 175), - (0, 175, 215), - (0, 175, 255), - (0, 215, 0), - (0, 215, 95), - (0, 215, 135), - (0, 215, 175), - (0, 215, 215), - (0, 215, 255), - (0, 255, 0), - (0, 255, 95), - (0, 255, 135), - (0, 255, 175), - (0, 255, 215), - (0, 255, 255), - (95, 0, 0), - (95, 0, 95), - (95, 0, 135), - (95, 0, 175), - (95, 0, 215), - (95, 0, 255), - (95, 95, 0), - (95, 95, 95), - (95, 95, 135), - (95, 95, 175), - (95, 95, 215), - (95, 95, 255), - (95, 135, 0), - (95, 135, 95), - (95, 135, 135), - (95, 135, 175), - (95, 135, 215), - (95, 135, 255), - (95, 175, 0), - (95, 175, 95), - (95, 175, 135), - (95, 175, 175), - (95, 175, 215), - (95, 175, 255), - (95, 215, 0), - (95, 215, 95), - (95, 215, 135), - (95, 215, 175), - (95, 215, 215), - (95, 215, 255), - (95, 255, 0), - (95, 255, 95), - (95, 255, 135), - (95, 255, 175), - (95, 255, 215), - (95, 255, 255), - (135, 0, 0), - (135, 0, 95), - (135, 0, 135), - (135, 0, 175), - (135, 0, 215), - (135, 0, 255), - (135, 95, 0), - (135, 95, 95), - (135, 95, 135), - (135, 95, 175), - (135, 95, 215), - (135, 95, 255), - (135, 135, 0), - (135, 135, 95), - (135, 135, 135), - (135, 135, 175), - (135, 135, 215), - (135, 135, 255), - (135, 175, 0), - (135, 175, 95), - (135, 175, 135), - (135, 175, 175), - (135, 175, 215), - (135, 175, 255), - (135, 215, 0), - (135, 215, 95), - (135, 215, 135), - (135, 215, 175), - (135, 215, 215), - (135, 215, 255), - (135, 255, 0), - (135, 255, 95), - (135, 255, 135), - (135, 255, 175), - (135, 255, 215), - (135, 255, 255), - (175, 0, 0), - (175, 0, 95), - (175, 0, 135), - (175, 0, 175), - (175, 0, 215), - (175, 0, 255), - (175, 95, 0), - (175, 95, 95), - (175, 95, 135), - (175, 95, 175), - (175, 95, 215), - (175, 95, 255), - (175, 135, 0), - (175, 135, 95), - (175, 135, 135), - (175, 135, 175), - (175, 135, 215), - (175, 135, 255), - (175, 175, 0), - (175, 175, 95), - (175, 175, 135), - (175, 175, 175), - (175, 175, 215), - (175, 175, 255), - (175, 215, 0), - (175, 215, 95), - (175, 215, 135), - (175, 215, 175), - (175, 215, 215), - (175, 215, 255), - (175, 255, 0), - (175, 255, 95), - (175, 255, 135), - (175, 255, 175), - (175, 255, 215), - (175, 255, 255), - (215, 0, 0), - (215, 0, 95), - (215, 0, 135), - (215, 0, 175), - (215, 0, 215), - (215, 0, 255), - (215, 95, 0), - (215, 95, 95), - (215, 95, 135), - (215, 95, 175), - (215, 95, 215), - (215, 95, 255), - (215, 135, 0), - (215, 135, 95), - (215, 135, 135), - (215, 135, 175), - (215, 135, 215), - (215, 135, 255), - (215, 175, 0), - (215, 175, 95), - (215, 175, 135), - (215, 175, 175), - (215, 175, 215), - (215, 175, 255), - (215, 215, 0), - (215, 215, 95), - (215, 215, 135), - (215, 215, 175), - (215, 215, 215), - (215, 215, 255), - (215, 255, 0), - (215, 255, 95), - (215, 255, 135), - (215, 255, 175), - (215, 255, 215), - (215, 255, 255), - (255, 0, 0), - (255, 0, 95), - (255, 0, 135), - (255, 0, 175), - (255, 0, 215), - (255, 0, 255), - (255, 95, 0), - (255, 95, 95), - (255, 95, 135), - (255, 95, 175), - (255, 95, 215), - (255, 95, 255), - (255, 135, 0), - (255, 135, 95), - (255, 135, 135), - (255, 135, 175), - (255, 135, 215), - (255, 135, 255), - (255, 175, 0), - (255, 175, 95), - (255, 175, 135), - (255, 175, 175), - (255, 175, 215), - (255, 175, 255), - (255, 215, 0), - (255, 215, 95), - (255, 215, 135), - (255, 215, 175), - (255, 215, 215), - (255, 215, 255), - (255, 255, 0), - (255, 255, 95), - (255, 255, 135), - (255, 255, 175), - (255, 255, 215), - (255, 255, 255), - (8, 8, 8), - (18, 18, 18), - (28, 28, 28), - (38, 38, 38), - (48, 48, 48), - (58, 58, 58), - (68, 68, 68), - (78, 78, 78), - (88, 88, 88), - (98, 98, 98), - (108, 108, 108), - (118, 118, 118), - (128, 128, 128), - (138, 138, 138), - (148, 148, 148), - (158, 158, 158), - (168, 168, 168), - (178, 178, 178), - (188, 188, 188), - (198, 198, 198), - (208, 208, 208), - (218, 218, 218), - (228, 228, 228), - (238, 238, 238), - ] -) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py deleted file mode 100755 index 4f6d8b2..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_pick.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Optional - - -def pick_bool(*values: Optional[bool]) -> bool: - """Pick the first non-none bool or return the last value. - - Args: - *values (bool): Any number of boolean or None values. - - Returns: - bool: First non-none boolean. - """ - assert values, "1 or more values required" - for value in values: - if value is not None: - return value - return bool(value) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py deleted file mode 100755 index 5fd5a38..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py +++ /dev/null @@ -1,153 +0,0 @@ -from fractions import Fraction -from math import ceil -from typing import cast, List, Optional, Sequence, Protocol - - -class Edge(Protocol): - """Any object that defines an edge (such as Layout).""" - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - -def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: - """Divide total space to satisfy size, ratio, and minimum_size, constraints. - - The returned list of integers should add up to total in most cases, unless it is - impossible to satisfy all the constraints. For instance, if there are two edges - with a minimum size of 20 each and `total` is 30 then the returned list will be - greater than total. In practice, this would mean that a Layout object would - clip the rows that would overflow the screen height. - - Args: - total (int): Total number of characters. - edges (List[Edge]): Edges within total space. - - Returns: - List[int]: Number of characters for each edge. - """ - # Size of edge or None for yet to be determined - sizes = [(edge.size or None) for edge in edges] - - _Fraction = Fraction - - # While any edges haven't been calculated - while None in sizes: - # Get flexible edges and index to map these back on to sizes list - flexible_edges = [ - (index, edge) - for index, (size, edge) in enumerate(zip(sizes, edges)) - if size is None - ] - # Remaining space in total - remaining = total - sum(size or 0 for size in sizes) - if remaining <= 0: - # No room for flexible edges - return [ - ((edge.minimum_size or 1) if size is None else size) - for size, edge in zip(sizes, edges) - ] - # Calculate number of characters in a ratio portion - portion = _Fraction( - remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) - ) - - # If any edges will be less than their minimum, replace size with the minimum - for index, edge in flexible_edges: - if portion * edge.ratio <= edge.minimum_size: - sizes[index] = edge.minimum_size - # New fixed size will invalidate calculations, so we need to repeat the process - break - else: - # Distribute flexible space and compensate for rounding error - # Since edge sizes can only be integers we need to add the remainder - # to the following line - remainder = _Fraction(0) - for index, edge in flexible_edges: - size, remainder = divmod(portion * edge.ratio + remainder, 1) - sizes[index] = size - break - # Sizes now contains integers only - return cast(List[int], sizes) - - -def ratio_reduce( - total: int, ratios: List[int], maximums: List[int], values: List[int] -) -> List[int]: - """Divide an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - maximums (List[int]): List of maximums values for each slot. - values (List[int]): List of values - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] - total_ratio = sum(ratios) - if not total_ratio: - return values[:] - total_remaining = total - result: List[int] = [] - append = result.append - for ratio, maximum, value in zip(ratios, maximums, values): - if ratio and total_ratio > 0: - distributed = min(maximum, round(ratio * total_remaining / total_ratio)) - append(value - distributed) - total_remaining -= distributed - total_ratio -= ratio - else: - append(value) - return result - - -def ratio_distribute( - total: int, ratios: List[int], minimums: Optional[List[int]] = None -) -> List[int]: - """Distribute an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - minimums (List[int]): List of minimum values for each slot. - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - if minimums: - ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] - total_ratio = sum(ratios) - assert total_ratio > 0, "Sum of ratios must be > 0" - - total_remaining = total - distributed_total: List[int] = [] - append = distributed_total.append - if minimums is None: - _minimums = [0] * len(ratios) - else: - _minimums = minimums - for ratio, minimum in zip(ratios, _minimums): - if total_ratio > 0: - distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) - else: - distributed = total_remaining - append(distributed) - total_ratio -= ratio - total_remaining -= distributed - return distributed_total - - -if __name__ == "__main__": - from dataclasses import dataclass - - @dataclass - class E: - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) - print(sum(resolved)) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py deleted file mode 100755 index d0bb1fe..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py +++ /dev/null @@ -1,482 +0,0 @@ -""" -Spinners are from: -* cli-spinners: - MIT License - Copyright (c) Sindre Sorhus (sindresorhus.com) - 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. -""" - -SPINNERS = { - "dots": { - "interval": 80, - "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏", - }, - "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, - "dots3": { - "interval": 80, - "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", - }, - "dots4": { - "interval": 80, - "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", - }, - "dots5": { - "interval": 80, - "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋", - }, - "dots6": { - "interval": 80, - "frames": "⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁", - }, - "dots7": { - "interval": 80, - "frames": "⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈", - }, - "dots8": { - "interval": 80, - "frames": "⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈", - }, - "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗⡏"}, - "dots10": {"interval": 80, "frames": "⢄⢂⢁⡁⡈⡐⡠"}, - "dots11": {"interval": 100, "frames": "⠁⠂⠄⡀⢀⠠⠐⠈"}, - "dots12": { - "interval": 80, - "frames": [ - "⢀⠀", - "⡀⠀", - "⠄⠀", - "⢂⠀", - "⡂⠀", - "⠅⠀", - "⢃⠀", - "⡃⠀", - "⠍⠀", - "⢋⠀", - "⡋⠀", - "⠍⠁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⢈⠩", - "⡀⢙", - "⠄⡙", - "⢂⠩", - "⡂⢘", - "⠅⡘", - "⢃⠨", - "⡃⢐", - "⠍⡐", - "⢋⠠", - "⡋⢀", - "⠍⡁", - "⢋⠁", - "⡋⠁", - "⠍⠉", - "⠋⠉", - "⠋⠉", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⠈⠩", - "⠀⢙", - "⠀⡙", - "⠀⠩", - "⠀⢘", - "⠀⡘", - "⠀⠨", - "⠀⢐", - "⠀⡐", - "⠀⠠", - "⠀⢀", - "⠀⡀", - ], - }, - "dots8Bit": { - "interval": 80, - "frames": "⠀⠁⠂⠃⠄⠅⠆⠇⡀⡁⡂⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌⠍⠎⠏⡈⡉⡊⡋⡌⡍⡎⡏⠐⠑⠒⠓⠔⠕⠖⠗⡐⡑⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜⠝⠞⠟⡘⡙" - "⡚⡛⡜⡝⡞⡟⠠⠡⠢⠣⠤⠥⠦⠧⡠⡡⡢⡣⡤⡥⡦⡧⠨⠩⠪⠫⠬⠭⠮⠯⡨⡩⡪⡫⡬⡭⡮⡯⠰⠱⠲⠳⠴⠵⠶⠷⡰⡱⡲⡳⡴⡵⡶⡷⠸⠹⠺⠻" - "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⣀⣁⣂⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌⢍⢎⢏⣈⣉⣊⣋⣌⣍⣎⣏⢐⢑⢒⢓⢔⢕⢖⢗⣐⣑⣒⣓⣔⣕" - "⣖⣗⢘⢙⢚⢛⢜⢝⢞⢟⣘⣙⣚⣛⣜⣝⣞⣟⢠⢡⢢⢣⢤⢥⢦⢧⣠⣡⣢⣣⣤⣥⣦⣧⢨⢩⢪⢫⢬⢭⢮⢯⣨⣩⣪⣫⣬⣭⣮⣯⢰⢱⢲⢳⢴⢵⢶⢷" - "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", - }, - "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, - "line2": {"interval": 100, "frames": "⠂-–—–-"}, - "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬┐"}, - "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, - "simpleDotsScrolling": { - "interval": 200, - "frames": [". ", ".. ", "...", " ..", " .", " "], - }, - "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, - "star2": {"interval": 80, "frames": "+x*"}, - "flip": { - "interval": 70, - "frames": "___-``'´-___", - }, - "hamburger": {"interval": 100, "frames": "☱☲☴"}, - "growVertical": { - "interval": 120, - "frames": "▁▃▄▅▆▇▆▅▄▃", - }, - "growHorizontal": { - "interval": 120, - "frames": "▏▎▍▌▋▊▉▊▋▌▍▎", - }, - "balloon": {"interval": 140, "frames": " .oO@* "}, - "balloon2": {"interval": 120, "frames": ".oO°Oo."}, - "noise": {"interval": 100, "frames": "▓▒░"}, - "bounce": {"interval": 120, "frames": "⠁⠂⠄⠂"}, - "boxBounce": {"interval": 120, "frames": "▖▘▝▗"}, - "boxBounce2": {"interval": 100, "frames": "▌▀▐▄"}, - "triangle": {"interval": 50, "frames": "◢◣◤◥"}, - "arc": {"interval": 100, "frames": "◜◠◝◞◡◟"}, - "circle": {"interval": 120, "frames": "◡⊙◠"}, - "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, - "circleQuarters": {"interval": 120, "frames": "◴◷◶◵"}, - "circleHalves": {"interval": 50, "frames": "◐◓◑◒"}, - "squish": {"interval": 100, "frames": "╫╪"}, - "toggle": {"interval": 250, "frames": "⊶⊷"}, - "toggle2": {"interval": 80, "frames": "▫▪"}, - "toggle3": {"interval": 120, "frames": "□■"}, - "toggle4": {"interval": 100, "frames": "■□▪▫"}, - "toggle5": {"interval": 100, "frames": "▮▯"}, - "toggle6": {"interval": 300, "frames": "ဝ၀"}, - "toggle7": {"interval": 80, "frames": "⦾⦿"}, - "toggle8": {"interval": 100, "frames": "◍◌"}, - "toggle9": {"interval": 100, "frames": "◉◎"}, - "toggle10": {"interval": 100, "frames": "㊂㊀㊁"}, - "toggle11": {"interval": 50, "frames": "⧇⧆"}, - "toggle12": {"interval": 120, "frames": "☗☖"}, - "toggle13": {"interval": 80, "frames": "=*-"}, - "arrow": {"interval": 100, "frames": "←↖↑↗→↘↓↙"}, - "arrow2": { - "interval": 80, - "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "], - }, - "arrow3": { - "interval": 120, - "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], - }, - "bouncingBar": { - "interval": 80, - "frames": [ - "[ ]", - "[= ]", - "[== ]", - "[=== ]", - "[ ===]", - "[ ==]", - "[ =]", - "[ ]", - "[ =]", - "[ ==]", - "[ ===]", - "[====]", - "[=== ]", - "[== ]", - "[= ]", - ], - }, - "bouncingBall": { - "interval": 80, - "frames": [ - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "( ●)", - "( ● )", - "( ● )", - "( ● )", - "( ● )", - "(● )", - ], - }, - "smiley": {"interval": 200, "frames": ["😄 ", "😝 "]}, - "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, - "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]}, - "clock": { - "interval": 100, - "frames": [ - "🕛 ", - "🕐 ", - "🕑 ", - "🕒 ", - "🕓 ", - "🕔 ", - "🕕 ", - "🕖 ", - "🕗 ", - "🕘 ", - "🕙 ", - "🕚 ", - ], - }, - "earth": {"interval": 180, "frames": ["🌍 ", "🌎 ", "🌏 "]}, - "material": { - "interval": 17, - "frames": [ - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "██████████▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "█████████████▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁██████████████▁▁▁▁", - "▁▁▁██████████████▁▁▁", - "▁▁▁▁█████████████▁▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁██████████████▁▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁██████████████▁", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁██████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁█████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁████████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁███████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁██████████", - "▁▁▁▁▁▁▁▁▁▁▁▁████████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "████████▁▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "█████████▁▁▁▁▁▁▁▁▁▁▁", - "███████████▁▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "████████████▁▁▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "██████████████▁▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁██████████████▁▁▁▁▁", - "▁▁▁█████████████▁▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁████████████▁▁▁", - "▁▁▁▁▁▁███████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁█████████▁▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁█████████▁▁", - "▁▁▁▁▁▁▁▁▁▁█████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁████████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", - ], - }, - "moon": { - "interval": 80, - "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], - }, - "runner": {"interval": 140, "frames": ["🚶 ", "🏃 "]}, - "pong": { - "interval": 80, - "frames": [ - "▐⠂ ▌", - "▐⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂▌", - "▐ ⠠▌", - "▐ ⡀▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐ ⠠ ▌", - "▐ ⠂ ▌", - "▐ ⠈ ▌", - "▐ ⠂ ▌", - "▐ ⠠ ▌", - "▐ ⡀ ▌", - "▐⠠ ▌", - ], - }, - "shark": { - "interval": 120, - "frames": [ - "▐|\\____________▌", - "▐_|\\___________▌", - "▐__|\\__________▌", - "▐___|\\_________▌", - "▐____|\\________▌", - "▐_____|\\_______▌", - "▐______|\\______▌", - "▐_______|\\_____▌", - "▐________|\\____▌", - "▐_________|\\___▌", - "▐__________|\\__▌", - "▐___________|\\_▌", - "▐____________|\\▌", - "▐____________/|▌", - "▐___________/|_▌", - "▐__________/|__▌", - "▐_________/|___▌", - "▐________/|____▌", - "▐_______/|_____▌", - "▐______/|______▌", - "▐_____/|_______▌", - "▐____/|________▌", - "▐___/|_________▌", - "▐__/|__________▌", - "▐_/|___________▌", - "▐/|____________▌", - ], - }, - "dqpb": {"interval": 100, "frames": "dqpb"}, - "weather": { - "interval": 100, - "frames": [ - "☀️ ", - "☀️ ", - "☀️ ", - "🌤 ", - "⛅️ ", - "🌥 ", - "☁️ ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "⛈ ", - "🌨 ", - "🌧 ", - "🌨 ", - "☁️ ", - "🌥 ", - "⛅️ ", - "🌤 ", - "☀️ ", - "☀️ ", - ], - }, - "christmas": {"interval": 400, "frames": "🌲🎄"}, - "grenade": { - "interval": 80, - "frames": [ - "، ", - "′ ", - " ´ ", - " ‾ ", - " ⸌", - " ⸊", - " |", - " ⁎", - " ⁕", - " ෴ ", - " ⁓", - " ", - " ", - " ", - ], - }, - "point": {"interval": 125, "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]}, - "layer": {"interval": 150, "frames": "-=≡"}, - "betaWave": { - "interval": 80, - "frames": [ - "ρββββββ", - "βρβββββ", - "ββρββββ", - "βββρβββ", - "ββββρββ", - "βββββρβ", - "ββββββρ", - ], - }, - "aesthetic": { - "interval": 80, - "frames": [ - "▰▱▱▱▱▱▱", - "▰▰▱▱▱▱▱", - "▰▰▰▱▱▱▱", - "▰▰▰▰▱▱▱", - "▰▰▰▰▰▱▱", - "▰▰▰▰▰▰▱", - "▰▰▰▰▰▰▰", - "▰▱▱▱▱▱▱", - ], - }, -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py deleted file mode 100755 index 194564e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import List, TypeVar - -T = TypeVar("T") - - -class Stack(List[T]): - """A small shim over builtin list.""" - - @property - def top(self) -> T: - """Get top of stack.""" - return self[-1] - - def push(self, item: T) -> None: - """Push an item on to the stack (append in stack nomenclature).""" - self.append(item) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py deleted file mode 100755 index a2ca6be..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_timer.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Timer context manager, only used in debug. - -""" - -from time import time - -import contextlib -from typing import Generator - - -@contextlib.contextmanager -def timer(subject: str = "time") -> Generator[None, None, None]: - """print the elapsed time. (only used in debugging)""" - start = time() - yield - elapsed = time() - start - elapsed_ms = elapsed * 1000 - print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py deleted file mode 100755 index 2eba1b9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_win32_console.py +++ /dev/null @@ -1,661 +0,0 @@ -"""Light wrapper around the Win32 Console API - this module should only be imported on Windows - -The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions -""" - -import ctypes -import sys -from typing import Any - -windll: Any = None -if sys.platform == "win32": - windll = ctypes.LibraryLoader(ctypes.WinDLL) -else: - raise ImportError(f"{__name__} can only be imported on Windows") - -import time -from ctypes import Structure, byref, wintypes -from typing import IO, NamedTuple, Type, cast - -from pip._vendor.rich.color import ColorSystem -from pip._vendor.rich.style import Style - -STDOUT = -11 -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - -COORD = wintypes._COORD - - -class LegacyWindowsError(Exception): - pass - - -class WindowsCoordinates(NamedTuple): - """Coordinates in the Windows Console API are (y, x), not (x, y). - This class is intended to prevent that confusion. - Rows and columns are indexed from 0. - This class can be used in place of wintypes._COORD in arguments and argtypes. - """ - - row: int - col: int - - @classmethod - def from_param(cls, value: "WindowsCoordinates") -> COORD: - """Converts a WindowsCoordinates into a wintypes _COORD structure. - This classmethod is internally called by ctypes to perform the conversion. - - Args: - value (WindowsCoordinates): The input coordinates to convert. - - Returns: - wintypes._COORD: The converted coordinates struct. - """ - return COORD(value.col, value.row) - - -class CONSOLE_SCREEN_BUFFER_INFO(Structure): - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - - -class CONSOLE_CURSOR_INFO(ctypes.Structure): - _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] - - -_GetStdHandle = windll.kernel32.GetStdHandle -_GetStdHandle.argtypes = [ - wintypes.DWORD, -] -_GetStdHandle.restype = wintypes.HANDLE - - -def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: - """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). - - Args: - handle (int): Integer identifier for the handle. Defaults to -11 (stdout). - - Returns: - wintypes.HANDLE: The handle - """ - return cast(wintypes.HANDLE, _GetStdHandle(handle)) - - -_GetConsoleMode = windll.kernel32.GetConsoleMode -_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] -_GetConsoleMode.restype = wintypes.BOOL - - -def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: - """Retrieves the current input mode of a console's input buffer - or the current output mode of a console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Raises: - LegacyWindowsError: If any error occurs while calling the Windows console API. - - Returns: - int: Value representing the current console mode as documented at - https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters - """ - - console_mode = wintypes.DWORD() - success = bool(_GetConsoleMode(std_handle, console_mode)) - if not success: - raise LegacyWindowsError("Unable to get legacy Windows Console Mode") - return console_mode.value - - -_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW -_FillConsoleOutputCharacterW.argtypes = [ - wintypes.HANDLE, - ctypes.c_char, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputCharacterW.restype = wintypes.BOOL - - -def FillConsoleOutputCharacter( - std_handle: wintypes.HANDLE, - char: str, - length: int, - start: WindowsCoordinates, -) -> int: - """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - char (str): The character to write. Must be a string of length 1. - length (int): The number of times to write the character. - start (WindowsCoordinates): The coordinates to start writing at. - - Returns: - int: The number of characters written. - """ - character = ctypes.c_char(char.encode()) - num_characters = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - _FillConsoleOutputCharacterW( - std_handle, - character, - num_characters, - start, - byref(num_written), - ) - return num_written.value - - -_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute -_FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputAttribute.restype = wintypes.BOOL - - -def FillConsoleOutputAttribute( - std_handle: wintypes.HANDLE, - attributes: int, - length: int, - start: WindowsCoordinates, -) -> int: - """Sets the character attributes for a specified number of character cells, - beginning at the specified coordinates in a screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours of the cells. - length (int): The number of cells to set the output attribute of. - start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. - - Returns: - int: The number of cells whose attributes were actually set. - """ - num_cells = wintypes.DWORD(length) - style_attrs = wintypes.WORD(attributes) - num_written = wintypes.DWORD(0) - _FillConsoleOutputAttribute( - std_handle, style_attrs, num_cells, start, byref(num_written) - ) - return num_written.value - - -_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute -_SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, -] -_SetConsoleTextAttribute.restype = wintypes.BOOL - - -def SetConsoleTextAttribute( - std_handle: wintypes.HANDLE, attributes: wintypes.WORD -) -> bool: - """Set the colour attributes for all text written after this function is called. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours. - - - Returns: - bool: True if the attribute was set successfully, otherwise False. - """ - return bool(_SetConsoleTextAttribute(std_handle, attributes)) - - -_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo -_GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), -] -_GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - -def GetConsoleScreenBufferInfo( - std_handle: wintypes.HANDLE, -) -> CONSOLE_SCREEN_BUFFER_INFO: - """Retrieves information about the specified console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Returns: - CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about - screen size, cursor position, colour attributes, and more.""" - console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() - _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) - return console_screen_buffer_info - - -_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition -_SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - cast(Type[COORD], WindowsCoordinates), -] -_SetConsoleCursorPosition.restype = wintypes.BOOL - - -def SetConsoleCursorPosition( - std_handle: wintypes.HANDLE, coords: WindowsCoordinates -) -> bool: - """Set the position of the cursor in the console screen - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - coords (WindowsCoordinates): The coordinates to move the cursor to. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorPosition(std_handle, coords)) - - -_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo -_GetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_GetConsoleCursorInfo.restype = wintypes.BOOL - - -def GetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Get the cursor info - used to get cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information - about the console's cursor. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo -_SetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_SetConsoleCursorInfo.restype = wintypes.BOOL - - -def SetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Set the cursor info - used for adjusting cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleTitle = windll.kernel32.SetConsoleTitleW -_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] -_SetConsoleTitle.restype = wintypes.BOOL - - -def SetConsoleTitle(title: str) -> bool: - """Sets the title of the current console window - - Args: - title (str): The new title of the console window. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleTitle(title)) - - -class LegacyWindowsTerm: - """This class allows interaction with the legacy Windows Console API. It should only be used in the context - of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, - the entire API should work. - - Args: - file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. - """ - - BRIGHT_BIT = 8 - - # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers - ANSI_TO_WINDOWS = [ - 0, # black The Windows colours are defined in wincon.h as follows: - 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 - 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 - 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 - 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 - 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 - 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 - 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 - 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 - 12, # bright red - 10, # bright green - 14, # bright yellow - 9, # bright blue - 13, # bright magenta - 11, # bright cyan - 15, # bright white - ] - - def __init__(self, file: "IO[str]") -> None: - handle = GetStdHandle(STDOUT) - self._handle = handle - default_text = GetConsoleScreenBufferInfo(handle).wAttributes - self._default_text = default_text - - self._default_fore = default_text & 7 - self._default_back = (default_text >> 4) & 7 - self._default_attrs = self._default_fore | (self._default_back << 4) - - self._file = file - self.write = file.write - self.flush = file.flush - - @property - def cursor_position(self) -> WindowsCoordinates: - """Returns the current position of the cursor (0-based) - - Returns: - WindowsCoordinates: The current cursor position. - """ - coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition - return WindowsCoordinates(row=coord.Y, col=coord.X) - - @property - def screen_size(self) -> WindowsCoordinates: - """Returns the current size of the console screen buffer, in character columns and rows - - Returns: - WindowsCoordinates: The width and height of the screen as WindowsCoordinates. - """ - screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize - return WindowsCoordinates(row=screen_size.Y, col=screen_size.X) - - def write_text(self, text: str) -> None: - """Write text directly to the terminal without any modification of styles - - Args: - text (str): The text to write to the console - """ - self.write(text) - self.flush() - - def write_styled(self, text: str, style: Style) -> None: - """Write styled text to the terminal. - - Args: - text (str): The text to write - style (Style): The style of the text - """ - color = style.color - bgcolor = style.bgcolor - if style.reverse: - color, bgcolor = bgcolor, color - - if color: - fore = color.downgrade(ColorSystem.WINDOWS).number - fore = fore if fore is not None else 7 # Default to ANSI 7: White - if style.bold: - fore = fore | self.BRIGHT_BIT - if style.dim: - fore = fore & ~self.BRIGHT_BIT - fore = self.ANSI_TO_WINDOWS[fore] - else: - fore = self._default_fore - - if bgcolor: - back = bgcolor.downgrade(ColorSystem.WINDOWS).number - back = back if back is not None else 0 # Default to ANSI 0: Black - back = self.ANSI_TO_WINDOWS[back] - else: - back = self._default_back - - assert fore is not None - assert back is not None - - SetConsoleTextAttribute( - self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) - ) - self.write_text(text) - SetConsoleTextAttribute(self._handle, attributes=self._default_text) - - def move_cursor_to(self, new_position: WindowsCoordinates) -> None: - """Set the position of the cursor - - Args: - new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. - """ - if new_position.col < 0 or new_position.row < 0: - return - SetConsoleCursorPosition(self._handle, coords=new_position) - - def erase_line(self) -> None: - """Erase all content on the line the cursor is currently located at""" - screen_size = self.screen_size - cursor_position = self.cursor_position - cells_to_erase = screen_size.col - start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=start_coordinates - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=start_coordinates, - ) - - def erase_end_of_line(self) -> None: - """Erase all content from the cursor position to the end of that line""" - cursor_position = self.cursor_position - cells_to_erase = self.screen_size.col - cursor_position.col - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=cursor_position - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=cursor_position, - ) - - def erase_start_of_line(self) -> None: - """Erase all content from the cursor position to the start of that line""" - row, col = self.cursor_position - start = WindowsCoordinates(row, 0) - FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) - FillConsoleOutputAttribute( - self._handle, self._default_attrs, length=col, start=start - ) - - def move_cursor_up(self) -> None: - """Move the cursor up a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row - 1, col=cursor_position.col - ), - ) - - def move_cursor_down(self) -> None: - """Move the cursor down a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row + 1, - col=cursor_position.col, - ), - ) - - def move_cursor_forward(self) -> None: - """Move the cursor forward a single cell. Wrap to the next line if required.""" - row, col = self.cursor_position - if col == self.screen_size.col - 1: - row += 1 - col = 0 - else: - col += 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def move_cursor_to_column(self, column: int) -> None: - """Move cursor to the column specified by the zero-based column index, staying on the same row - - Args: - column (int): The zero-based column index to move the cursor to. - """ - row, _ = self.cursor_position - SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) - - def move_cursor_backward(self) -> None: - """Move the cursor backward a single cell. Wrap to the previous line if required.""" - row, col = self.cursor_position - if col == 0: - row -= 1 - col = self.screen_size.col - 1 - else: - col -= 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def hide_cursor(self) -> None: - """Hide the cursor""" - current_cursor_size = self._get_cursor_size() - invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) - SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) - - def show_cursor(self) -> None: - """Show the cursor""" - current_cursor_size = self._get_cursor_size() - visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) - SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) - - def set_title(self, title: str) -> None: - """Set the title of the terminal window - - Args: - title (str): The new title of the console window - """ - assert len(title) < 255, "Console title must be less than 255 characters" - SetConsoleTitle(title) - - def _get_cursor_size(self) -> int: - """Get the percentage of the character cell that is filled by the cursor""" - cursor_info = CONSOLE_CURSOR_INFO() - GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) - return int(cursor_info.dwSize) - - -if __name__ == "__main__": - handle = GetStdHandle() - - from pip._vendor.rich.console import Console - - console = Console() - - term = LegacyWindowsTerm(sys.stdout) - term.set_title("Win32 Console Examples") - - style = Style(color="black", bgcolor="red") - - heading = Style.parse("black on green") - - # Check colour output - console.rule("Checking colour output") - console.print("[on red]on red!") - console.print("[blue]blue!") - console.print("[yellow]yellow!") - console.print("[bold yellow]bold yellow!") - console.print("[bright_yellow]bright_yellow!") - console.print("[dim bright_yellow]dim bright_yellow!") - console.print("[italic cyan]italic cyan!") - console.print("[bold white on blue]bold white on blue!") - console.print("[reverse bold white on blue]reverse bold white on blue!") - console.print("[bold black on cyan]bold black on cyan!") - console.print("[black on green]black on green!") - console.print("[blue on green]blue on green!") - console.print("[white on black]white on black!") - console.print("[black on white]black on white!") - console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") - - # Check cursor movement - console.rule("Checking cursor movement") - console.print() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("went back and wrapped to prev line") - time.sleep(1) - term.move_cursor_up() - term.write_text("we go up") - time.sleep(1) - term.move_cursor_down() - term.write_text("and down") - time.sleep(1) - term.move_cursor_up() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went up and back 2") - time.sleep(1) - term.move_cursor_down() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went down and back 2") - time.sleep(1) - - # Check erasing of lines - term.hide_cursor() - console.print() - console.rule("Checking line erasing") - console.print("\n...Deleting to the start of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - term.move_cursor_to_column(16) - term.write_styled("<", Style.parse("black on red")) - term.move_cursor_backward() - time.sleep(1) - term.erase_start_of_line() - time.sleep(1) - - console.print("\n\n...And to the end of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - - term.move_cursor_to_column(16) - term.write_styled(">", Style.parse("black on red")) - time.sleep(1) - term.erase_end_of_line() - time.sleep(1) - - console.print("\n\n...Now the whole line will be erased...") - term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) - time.sleep(1) - term.erase_line() - - term.show_cursor() - print("\n") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py deleted file mode 100755 index 7520a9f..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows.py +++ /dev/null @@ -1,71 +0,0 @@ -import sys -from dataclasses import dataclass - - -@dataclass -class WindowsConsoleFeatures: - """Windows features available.""" - - vt: bool = False - """The console supports VT codes.""" - truecolor: bool = False - """The console supports truecolor.""" - - -try: - import ctypes - from ctypes import LibraryLoader - - if sys.platform == "win32": - windll = LibraryLoader(ctypes.WinDLL) - else: - windll = None - raise ImportError("Not windows") - - from pip._vendor.rich._win32_console import ( - ENABLE_VIRTUAL_TERMINAL_PROCESSING, - GetConsoleMode, - GetStdHandle, - LegacyWindowsError, - ) - -except (AttributeError, ImportError, ValueError): - # Fallback if we can't load the Windows DLL - def get_windows_console_features() -> WindowsConsoleFeatures: - features = WindowsConsoleFeatures() - return features - -else: - - def get_windows_console_features() -> WindowsConsoleFeatures: - """Get windows console features. - - Returns: - WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. - """ - handle = GetStdHandle() - try: - console_mode = GetConsoleMode(handle) - success = True - except LegacyWindowsError: - console_mode = 0 - success = False - vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) - truecolor = False - if vt: - win_version = sys.getwindowsversion() - truecolor = win_version.major > 10 or ( - win_version.major == 10 and win_version.build >= 15063 - ) - features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) - return features - - -if __name__ == "__main__": - import platform - - features = get_windows_console_features() - from pip._vendor.rich import print - - print(f'platform="{platform.system()}"') - print(repr(features)) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py deleted file mode 100755 index 5ece056..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Iterable, Sequence, Tuple, cast - -from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates -from pip._vendor.rich.segment import ControlCode, ControlType, Segment - - -def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: - """Makes appropriate Windows Console API calls based on the segments in the buffer. - - Args: - buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. - term (LegacyWindowsTerm): Used to call the Windows Console API. - """ - for text, style, control in buffer: - if not control: - if style: - term.write_styled(text, style) - else: - term.write_text(text) - else: - control_codes: Sequence[ControlCode] = control - for control_code in control_codes: - control_type = control_code[0] - if control_type == ControlType.CURSOR_MOVE_TO: - _, x, y = cast(Tuple[ControlType, int, int], control_code) - term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) - elif control_type == ControlType.CARRIAGE_RETURN: - term.write_text("\r") - elif control_type == ControlType.HOME: - term.move_cursor_to(WindowsCoordinates(0, 0)) - elif control_type == ControlType.CURSOR_UP: - term.move_cursor_up() - elif control_type == ControlType.CURSOR_DOWN: - term.move_cursor_down() - elif control_type == ControlType.CURSOR_FORWARD: - term.move_cursor_forward() - elif control_type == ControlType.CURSOR_BACKWARD: - term.move_cursor_backward() - elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: - _, column = cast(Tuple[ControlType, int], control_code) - term.move_cursor_to_column(column - 1) - elif control_type == ControlType.HIDE_CURSOR: - term.hide_cursor() - elif control_type == ControlType.SHOW_CURSOR: - term.show_cursor() - elif control_type == ControlType.ERASE_IN_LINE: - _, mode = cast(Tuple[ControlType, int], control_code) - if mode == 0: - term.erase_end_of_line() - elif mode == 1: - term.erase_start_of_line() - elif mode == 2: - term.erase_line() - elif control_type == ControlType.SET_WINDOW_TITLE: - _, title = cast(Tuple[ControlType, str], control_code) - term.set_title(title) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py deleted file mode 100755 index 2e94ff6..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import annotations - -import re -from typing import Iterable - -from ._loop import loop_last -from .cells import cell_len, chop_cells - -re_word = re.compile(r"\s*\S+\s*") - - -def words(text: str) -> Iterable[tuple[int, int, str]]: - """Yields each word from the text as a tuple - containing (start_index, end_index, word). A "word" in this context may - include the actual word and any whitespace to the right. - """ - position = 0 - word_match = re_word.match(text, position) - while word_match is not None: - start, end = word_match.span() - word = word_match.group(0) - yield start, end, word - word_match = re_word.match(text, end) - - -def divide_line(text: str, width: int, fold: bool = True) -> list[int]: - """Given a string of text, and a width (measured in cells), return a list - of cell offsets which the string should be split at in order for it to fit - within the given width. - - Args: - text: The text to examine. - width: The available cell width. - fold: If True, words longer than `width` will be folded onto a new line. - - Returns: - A list of indices to break the line at. - """ - break_positions: list[int] = [] # offsets to insert the breaks at - append = break_positions.append - cell_offset = 0 - _cell_len = cell_len - - for start, _end, word in words(text): - word_length = _cell_len(word.rstrip()) - remaining_space = width - cell_offset - word_fits_remaining_space = remaining_space >= word_length - - if word_fits_remaining_space: - # Simplest case - the word fits within the remaining width for this line. - cell_offset += _cell_len(word) - else: - # Not enough space remaining for this word on the current line. - if word_length > width: - # The word doesn't fit on any line, so we can't simply - # place it on the next line... - if fold: - # Fold the word across multiple lines. - folded_word = chop_cells(word, width=width) - for last, line in loop_last(folded_word): - if start: - append(start) - if last: - cell_offset = _cell_len(line) - else: - start += len(line) - else: - # Folding isn't allowed, so crop the word. - if start: - append(start) - cell_offset = _cell_len(word) - elif cell_offset and start: - # The word doesn't fit within the remaining space on the current - # line, but it *can* fit on to the next (empty) line. - append(start) - cell_offset = _cell_len(word) - - return break_positions - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console(width=10) - console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") - print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10)) - - console = Console(width=20) - console.rule() - console.print("TextualはPythonの高速アプリケーション開発フレームワークです") - - console.rule() - console.print("アプリケーションは1670万色を使用でき") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py deleted file mode 100755 index e6e498e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/abc.py +++ /dev/null @@ -1,33 +0,0 @@ -from abc import ABC - - -class RichRenderable(ABC): - """An abstract base class for Rich renderables. - - Note that there is no need to extend this class, the intended use is to check if an - object supports the Rich renderable protocol. For example:: - - if isinstance(my_object, RichRenderable): - console.print(my_object) - - """ - - @classmethod - def __subclasshook__(cls, other: type) -> bool: - """Check if this class supports the rich render protocol.""" - return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.text import Text - - t = Text() - print(isinstance(Text, RichRenderable)) - print(isinstance(t, RichRenderable)) - - class Foo: - pass - - f = Foo() - print(isinstance(f, RichRenderable)) - print(isinstance("", RichRenderable)) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py deleted file mode 100755 index e65dc5b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/align.py +++ /dev/null @@ -1,306 +0,0 @@ -from itertools import chain -from typing import TYPE_CHECKING, Iterable, Optional, Literal - -from .constrain import Constrain -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - -AlignMethod = Literal["left", "center", "right"] -VerticalAlignMethod = Literal["top", "middle", "bottom"] - - -class Align(JupyterMixin): - """Align a renderable by adding spaces if necessary. - - Args: - renderable (RenderableType): A console renderable. - align (AlignMethod): One of "left", "center", or "right"" - style (StyleType, optional): An optional style to apply to the background. - vertical (Optional[VerticalAlignMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. - pad (bool, optional): Pad the right with spaces. Defaults to True. - width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. - height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. - - Raises: - ValueError: if ``align`` is not one of the expected values. - """ - - def __init__( - self, - renderable: "RenderableType", - align: AlignMethod = "left", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> None: - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", or "right" (not {align!r})' - ) - if vertical is not None and vertical not in ("top", "middle", "bottom"): - raise ValueError( - f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' - ) - self.renderable = renderable - self.align = align - self.style = style - self.vertical = vertical - self.pad = pad - self.width = width - self.height = height - - def __repr__(self) -> str: - return f"Align({self.renderable!r}, {self.align!r})" - - @classmethod - def left( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the left.""" - return cls( - renderable, - "left", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def center( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the center.""" - return cls( - renderable, - "center", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def right( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the right.""" - return cls( - renderable, - "right", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - align = self.align - width = console.measure(self.renderable, options=options).maximum - rendered = console.render( - Constrain( - self.renderable, width if self.width is None else min(width, self.width) - ), - options.update(height=None), - ) - lines = list(Segment.split_lines(rendered)) - width, height = Segment.get_shape(lines) - lines = Segment.set_shape(lines, width, height) - new_line = Segment.line() - excess_space = options.max_width - width - style = console.get_style(self.style) if self.style is not None else None - - def generate_segments() -> Iterable[Segment]: - if excess_space <= 0: - # Exact fit - for line in lines: - yield from line - yield new_line - - elif align == "left": - # Pad on the right - pad = Segment(" " * excess_space, style) if self.pad else None - for line in lines: - yield from line - if pad: - yield pad - yield new_line - - elif align == "center": - # Pad left and right - left = excess_space // 2 - pad = Segment(" " * left, style) - pad_right = ( - Segment(" " * (excess_space - left), style) if self.pad else None - ) - for line in lines: - if left: - yield pad - yield from line - if pad_right: - yield pad_right - yield new_line - - elif align == "right": - # Padding on left - pad = Segment(" " * excess_space, style) - for line in lines: - yield pad - yield from line - yield new_line - - blank_line = ( - Segment(f"{' ' * (self.width or options.max_width)}\n", style) - if self.pad - else Segment("\n") - ) - - def blank_lines(count: int) -> Iterable[Segment]: - if count > 0: - for _ in range(count): - yield blank_line - - vertical_height = self.height or options.height - iter_segments: Iterable[Segment] - if self.vertical and vertical_height is not None: - if self.vertical == "top": - bottom_space = vertical_height - height - iter_segments = chain(generate_segments(), blank_lines(bottom_space)) - elif self.vertical == "middle": - top_space = (vertical_height - height) // 2 - bottom_space = vertical_height - top_space - height - iter_segments = chain( - blank_lines(top_space), - generate_segments(), - blank_lines(bottom_space), - ) - else: # self.vertical == "bottom": - top_space = vertical_height - height - iter_segments = chain(blank_lines(top_space), generate_segments()) - else: - iter_segments = generate_segments() - if self.style: - style = console.get_style(self.style) - iter_segments = Segment.apply_style(iter_segments, style) - yield from iter_segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -class VerticalCenter(JupyterMixin): - """Vertically aligns a renderable. - - Warn: - This class is deprecated and may be removed in a future version. Use Align class with - `vertical="middle"`. - - Args: - renderable (RenderableType): A renderable object. - style (StyleType, optional): An optional style to apply to the background. Defaults to None. - """ - - def __init__( - self, - renderable: "RenderableType", - style: Optional[StyleType] = None, - ) -> None: - self.renderable = renderable - self.style = style - - def __repr__(self) -> str: - return f"VerticalCenter({self.renderable!r})" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) if self.style is not None else None - lines = console.render_lines( - self.renderable, options.update(height=None), pad=False - ) - width, _height = Segment.get_shape(lines) - new_line = Segment.line() - height = options.height or options.size.height - top_space = (height - len(lines)) // 2 - bottom_space = height - top_space - len(lines) - blank_line = Segment(f"{' ' * width}", style) - - def blank_lines(count: int) -> Iterable[Segment]: - for _ in range(count): - yield blank_line - yield new_line - - if top_space > 0: - yield from blank_lines(top_space) - for line in lines: - yield from line - yield new_line - if bottom_space > 0: - yield from blank_lines(bottom_space) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console, Group - from pip._vendor.rich.highlighter import ReprHighlighter - from pip._vendor.rich.panel import Panel - - highlighter = ReprHighlighter() - console = Console() - - panel = Panel( - Group( - Align.left(highlighter("align='left'")), - Align.center(highlighter("align='center'")), - Align.right(highlighter("align='right'")), - ), - width=60, - style="on dark_blue", - title="Align", - ) - - console.print( - Align.center(panel, vertical="middle", style="on red", height=console.height) - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py deleted file mode 100755 index 7de86ce..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py +++ /dev/null @@ -1,241 +0,0 @@ -import re -import sys -from contextlib import suppress -from typing import Iterable, NamedTuple, Optional - -from .color import Color -from .style import Style -from .text import Text - -re_ansi = re.compile( - r""" -(?:\x1b[0-?])| -(?:\x1b\](.*?)\x1b\\)| -(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) -""", - re.VERBOSE, -) - - -class _AnsiToken(NamedTuple): - """Result of ansi tokenized string.""" - - plain: str = "" - sgr: Optional[str] = "" - osc: Optional[str] = "" - - -def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: - """Tokenize a string in to plain text and ANSI codes. - - Args: - ansi_text (str): A String containing ANSI codes. - - Yields: - AnsiToken: A named tuple of (plain, sgr, osc) - """ - - position = 0 - sgr: Optional[str] - osc: Optional[str] - for match in re_ansi.finditer(ansi_text): - start, end = match.span(0) - osc, sgr = match.groups() - if start > position: - yield _AnsiToken(ansi_text[position:start]) - if sgr: - if sgr == "(": - position = end + 1 - continue - if sgr.endswith("m"): - yield _AnsiToken("", sgr[1:-1], osc) - else: - yield _AnsiToken("", sgr, osc) - position = end - if position < len(ansi_text): - yield _AnsiToken(ansi_text[position:]) - - -SGR_STYLE_MAP = { - 1: "bold", - 2: "dim", - 3: "italic", - 4: "underline", - 5: "blink", - 6: "blink2", - 7: "reverse", - 8: "conceal", - 9: "strike", - 21: "underline2", - 22: "not dim not bold", - 23: "not italic", - 24: "not underline", - 25: "not blink", - 26: "not blink2", - 27: "not reverse", - 28: "not conceal", - 29: "not strike", - 30: "color(0)", - 31: "color(1)", - 32: "color(2)", - 33: "color(3)", - 34: "color(4)", - 35: "color(5)", - 36: "color(6)", - 37: "color(7)", - 39: "default", - 40: "on color(0)", - 41: "on color(1)", - 42: "on color(2)", - 43: "on color(3)", - 44: "on color(4)", - 45: "on color(5)", - 46: "on color(6)", - 47: "on color(7)", - 49: "on default", - 51: "frame", - 52: "encircle", - 53: "overline", - 54: "not frame not encircle", - 55: "not overline", - 90: "color(8)", - 91: "color(9)", - 92: "color(10)", - 93: "color(11)", - 94: "color(12)", - 95: "color(13)", - 96: "color(14)", - 97: "color(15)", - 100: "on color(8)", - 101: "on color(9)", - 102: "on color(10)", - 103: "on color(11)", - 104: "on color(12)", - 105: "on color(13)", - 106: "on color(14)", - 107: "on color(15)", -} - - -class AnsiDecoder: - """Translate ANSI code in to styled Text.""" - - def __init__(self) -> None: - self.style = Style.null() - - def decode(self, terminal_text: str) -> Iterable[Text]: - """Decode ANSI codes in an iterable of lines. - - Args: - lines (Iterable[str]): An iterable of lines of terminal output. - - Yields: - Text: Marked up Text. - """ - for line in terminal_text.splitlines(): - yield self.decode_line(line) - - def decode_line(self, line: str) -> Text: - """Decode a line containing ansi codes. - - Args: - line (str): A line of terminal output. - - Returns: - Text: A Text instance marked up according to ansi codes. - """ - from_ansi = Color.from_ansi - from_rgb = Color.from_rgb - _Style = Style - text = Text() - append = text.append - line = line.rsplit("\r", 1)[-1] - for plain_text, sgr, osc in _ansi_tokenize(line): - if plain_text: - append(plain_text, self.style or None) - elif osc is not None: - if osc.startswith("8;"): - _params, semicolon, link = osc[2:].partition(";") - if semicolon: - self.style = self.style.update_link(link or None) - elif sgr is not None: - # Translate in to semi-colon separated codes - # Ignore invalid codes, because we want to be lenient - codes = [ - min(255, int(_code) if _code else 0) - for _code in sgr.split(";") - if _code.isdigit() or _code == "" - ] - iter_codes = iter(codes) - for code in iter_codes: - if code == 0: - # reset - self.style = _Style.null() - elif code in SGR_STYLE_MAP: - # styles - self.style += _Style.parse(SGR_STYLE_MAP[code]) - elif code == 38: - #  Foreground - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ) - ) - elif code == 48: - # Background - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - None, from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - None, - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ), - ) - - return text - - -if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover - import io - import os - import pty - import sys - - decoder = AnsiDecoder() - - stdout = io.BytesIO() - - def read(fd: int) -> bytes: - data = os.read(fd, 1024) - stdout.write(data) - return data - - pty.spawn(sys.argv[1:], read) - - from .console import Console - - console = Console(record=True) - - stdout_result = stdout.getvalue().decode("utf-8") - print(stdout_result) - - for line in decoder.decode(stdout_result): - console.print(line) - - console.save_html("stdout.html") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py deleted file mode 100755 index 022284b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/bar.py +++ /dev/null @@ -1,93 +0,0 @@ -from typing import Optional, Union - -from .color import Color -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style - -# There are left-aligned characters for 1/8 to 7/8, but -# the right-aligned characters exist only for 1/8 and 4/8. -BEGIN_BLOCK_ELEMENTS = ["█", "█", "█", "▐", "▐", "▐", "▕", "▕"] -END_BLOCK_ELEMENTS = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉"] -FULL_BLOCK = "█" - - -class Bar(JupyterMixin): - """Renders a solid block bar. - - Args: - size (float): Value for the end of the bar. - begin (float): Begin point (between 0 and size, inclusive). - end (float): End point (between 0 and size, inclusive). - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - color (Union[Color, str], optional): Color of the bar. Defaults to "default". - bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". - """ - - def __init__( - self, - size: float, - begin: float, - end: float, - *, - width: Optional[int] = None, - color: Union[Color, str] = "default", - bgcolor: Union[Color, str] = "default", - ): - self.size = size - self.begin = max(begin, 0) - self.end = min(end, size) - self.width = width - self.style = Style(color=color, bgcolor=bgcolor) - - def __repr__(self) -> str: - return f"Bar({self.size}, {self.begin}, {self.end})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - width = min( - self.width if self.width is not None else options.max_width, - options.max_width, - ) - - if self.begin >= self.end: - yield Segment(" " * width, self.style) - yield Segment.line() - return - - prefix_complete_eights = int(width * 8 * self.begin / self.size) - prefix_bar_count = prefix_complete_eights // 8 - prefix_eights_count = prefix_complete_eights % 8 - - body_complete_eights = int(width * 8 * self.end / self.size) - body_bar_count = body_complete_eights // 8 - body_eights_count = body_complete_eights % 8 - - # When start and end fall into the same cell, we ideally should render - # a symbol that's "center-aligned", but there is no good symbol in Unicode. - # In this case, we fall back to right-aligned block symbol for simplicity. - - prefix = " " * prefix_bar_count - if prefix_eights_count: - prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] - - body = FULL_BLOCK * body_bar_count - if body_eights_count: - body += END_BLOCK_ELEMENTS[body_eights_count] - - suffix = " " * (width - len(body)) - - yield Segment(prefix + body[len(prefix) :] + suffix, self.style) - yield Segment.line() - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py deleted file mode 100755 index 3f330cc..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/box.py +++ /dev/null @@ -1,474 +0,0 @@ -from typing import TYPE_CHECKING, Iterable, List, Literal - - -from ._loop import loop_last - -if TYPE_CHECKING: - from pip._vendor.rich.console import ConsoleOptions - - -class Box: - """Defines characters to render boxes. - - ┌─┬┐ top - │ ││ head - ├─┼┤ head_row - │ ││ mid - ├─┼┤ row - ├─┼┤ foot_row - │ ││ foot - └─┴┘ bottom - - Args: - box (str): Characters making up box. - ascii (bool, optional): True if this box uses ascii characters only. Default is False. - """ - - def __init__(self, box: str, *, ascii: bool = False) -> None: - self._box = box - self.ascii = ascii - line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() - # top - self.top_left, self.top, self.top_divider, self.top_right = iter(line1) - # head - self.head_left, _, self.head_vertical, self.head_right = iter(line2) - # head_row - ( - self.head_row_left, - self.head_row_horizontal, - self.head_row_cross, - self.head_row_right, - ) = iter(line3) - - # mid - self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) - # row - self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) - # foot_row - ( - self.foot_row_left, - self.foot_row_horizontal, - self.foot_row_cross, - self.foot_row_right, - ) = iter(line6) - # foot - self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) - # bottom - self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( - line8 - ) - - def __repr__(self) -> str: - return "Box(...)" - - def __str__(self) -> str: - return self._box - - def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": - """Substitute this box for another if it won't render due to platform issues. - - Args: - options (ConsoleOptions): Console options used in rendering. - safe (bool, optional): Substitute this for another Box if there are known problems - displaying on the platform (currently only relevant on Windows). Default is True. - - Returns: - Box: A different Box or the same Box. - """ - box = self - if options.legacy_windows and safe: - box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) - if options.ascii_only and not box.ascii: - box = ASCII - return box - - def get_plain_headed_box(self) -> "Box": - """If this box uses special characters for the borders of the header, then - return the equivalent box that does not. - - Returns: - Box: The most similar Box that doesn't use header-specific box characters. - If the current Box already satisfies this criterion, then it's returned. - """ - return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) - - def get_top(self, widths: Iterable[int]) -> str: - """Get the top of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.top_left) - for last, width in loop_last(widths): - append(self.top * width) - if not last: - append(self.top_divider) - append(self.top_right) - return "".join(parts) - - def get_row( - self, - widths: Iterable[int], - level: Literal["head", "row", "foot", "mid"] = "row", - edge: bool = True, - ) -> str: - """Get the top of a simple box. - - Args: - width (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - if level == "head": - left = self.head_row_left - horizontal = self.head_row_horizontal - cross = self.head_row_cross - right = self.head_row_right - elif level == "row": - left = self.row_left - horizontal = self.row_horizontal - cross = self.row_cross - right = self.row_right - elif level == "mid": - left = self.mid_left - horizontal = " " - cross = self.mid_vertical - right = self.mid_right - elif level == "foot": - left = self.foot_row_left - horizontal = self.foot_row_horizontal - cross = self.foot_row_cross - right = self.foot_row_right - else: - raise ValueError("level must be 'head', 'row' or 'foot'") - - parts: List[str] = [] - append = parts.append - if edge: - append(left) - for last, width in loop_last(widths): - append(horizontal * width) - if not last: - append(cross) - if edge: - append(right) - return "".join(parts) - - def get_bottom(self, widths: Iterable[int]) -> str: - """Get the bottom of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.bottom_left) - for last, width in loop_last(widths): - append(self.bottom * width) - if not last: - append(self.bottom_divider) - append(self.bottom_right) - return "".join(parts) - - -# fmt: off -ASCII: Box = Box( - "+--+\n" - "| ||\n" - "|-+|\n" - "| ||\n" - "|-+|\n" - "|-+|\n" - "| ||\n" - "+--+\n", - ascii=True, -) - -ASCII2: Box = Box( - "+-++\n" - "| ||\n" - "+-++\n" - "| ||\n" - "+-++\n" - "+-++\n" - "| ||\n" - "+-++\n", - ascii=True, -) - -ASCII_DOUBLE_HEAD: Box = Box( - "+-++\n" - "| ||\n" - "+=++\n" - "| ||\n" - "+-++\n" - "+-++\n" - "| ||\n" - "+-++\n", - ascii=True, -) - -SQUARE: Box = Box( - "┌─┬┐\n" - "│ ││\n" - "├─┼┤\n" - "│ ││\n" - "├─┼┤\n" - "├─┼┤\n" - "│ ││\n" - "└─┴┘\n" -) - -SQUARE_DOUBLE_HEAD: Box = Box( - "┌─┬┐\n" - "│ ││\n" - "╞═╪╡\n" - "│ ││\n" - "├─┼┤\n" - "├─┼┤\n" - "│ ││\n" - "└─┴┘\n" -) - -MINIMAL: Box = Box( - " ╷ \n" - " │ \n" - "╶─┼╴\n" - " │ \n" - "╶─┼╴\n" - "╶─┼╴\n" - " │ \n" - " ╵ \n" -) - - -MINIMAL_HEAVY_HEAD: Box = Box( - " ╷ \n" - " │ \n" - "╺━┿╸\n" - " │ \n" - "╶─┼╴\n" - "╶─┼╴\n" - " │ \n" - " ╵ \n" -) - -MINIMAL_DOUBLE_HEAD: Box = Box( - " ╷ \n" - " │ \n" - " ═╪ \n" - " │ \n" - " ─┼ \n" - " ─┼ \n" - " │ \n" - " ╵ \n" -) - - -SIMPLE: Box = Box( - " \n" - " \n" - " ── \n" - " \n" - " \n" - " ── \n" - " \n" - " \n" -) - -SIMPLE_HEAD: Box = Box( - " \n" - " \n" - " ── \n" - " \n" - " \n" - " \n" - " \n" - " \n" -) - - -SIMPLE_HEAVY: Box = Box( - " \n" - " \n" - " ━━ \n" - " \n" - " \n" - " ━━ \n" - " \n" - " \n" -) - - -HORIZONTALS: Box = Box( - " ── \n" - " \n" - " ── \n" - " \n" - " ── \n" - " ── \n" - " \n" - " ── \n" -) - -ROUNDED: Box = Box( - "╭─┬╮\n" - "│ ││\n" - "├─┼┤\n" - "│ ││\n" - "├─┼┤\n" - "├─┼┤\n" - "│ ││\n" - "╰─┴╯\n" -) - -HEAVY: Box = Box( - "┏━┳┓\n" - "┃ ┃┃\n" - "┣━╋┫\n" - "┃ ┃┃\n" - "┣━╋┫\n" - "┣━╋┫\n" - "┃ ┃┃\n" - "┗━┻┛\n" -) - -HEAVY_EDGE: Box = Box( - "┏━┯┓\n" - "┃ │┃\n" - "┠─┼┨\n" - "┃ │┃\n" - "┠─┼┨\n" - "┠─┼┨\n" - "┃ │┃\n" - "┗━┷┛\n" -) - -HEAVY_HEAD: Box = Box( - "┏━┳┓\n" - "┃ ┃┃\n" - "┡━╇┩\n" - "│ ││\n" - "├─┼┤\n" - "├─┼┤\n" - "│ ││\n" - "└─┴┘\n" -) - -DOUBLE: Box = Box( - "╔═╦╗\n" - "║ ║║\n" - "╠═╬╣\n" - "║ ║║\n" - "╠═╬╣\n" - "╠═╬╣\n" - "║ ║║\n" - "╚═╩╝\n" -) - -DOUBLE_EDGE: Box = Box( - "╔═╤╗\n" - "║ │║\n" - "╟─┼╢\n" - "║ │║\n" - "╟─┼╢\n" - "╟─┼╢\n" - "║ │║\n" - "╚═╧╝\n" -) - -MARKDOWN: Box = Box( - " \n" - "| ||\n" - "|-||\n" - "| ||\n" - "|-||\n" - "|-||\n" - "| ||\n" - " \n", - ascii=True, -) -# fmt: on - -# Map Boxes that don't render with raster fonts on to equivalent that do -LEGACY_WINDOWS_SUBSTITUTIONS = { - ROUNDED: SQUARE, - MINIMAL_HEAVY_HEAD: MINIMAL, - SIMPLE_HEAVY: SIMPLE, - HEAVY: SQUARE, - HEAVY_EDGE: SQUARE, - HEAVY_HEAD: SQUARE, -} - -# Map headed boxes to their headerless equivalents -PLAIN_HEADED_SUBSTITUTIONS = { - HEAVY_HEAD: SQUARE, - SQUARE_DOUBLE_HEAD: SQUARE, - MINIMAL_DOUBLE_HEAD: MINIMAL, - MINIMAL_HEAVY_HEAD: MINIMAL, - ASCII_DOUBLE_HEAD: ASCII2, -} - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.panel import Panel - - from . import box as box - from .console import Console - from .table import Table - from .text import Text - - console = Console(record=True) - - BOXES = [ - "ASCII", - "ASCII2", - "ASCII_DOUBLE_HEAD", - "SQUARE", - "SQUARE_DOUBLE_HEAD", - "MINIMAL", - "MINIMAL_HEAVY_HEAD", - "MINIMAL_DOUBLE_HEAD", - "SIMPLE", - "SIMPLE_HEAD", - "SIMPLE_HEAVY", - "HORIZONTALS", - "ROUNDED", - "HEAVY", - "HEAVY_EDGE", - "HEAVY_HEAD", - "DOUBLE", - "DOUBLE_EDGE", - "MARKDOWN", - ] - - console.print(Panel("[bold green]Box Constants", style="green"), justify="center") - console.print() - - columns = Columns(expand=True, padding=2) - for box_name in sorted(BOXES): - table = Table( - show_footer=True, style="dim", border_style="not dim", expand=True - ) - table.add_column("Header 1", "Footer 1") - table.add_column("Header 2", "Footer 2") - table.add_row("Cell", "Cell") - table.add_row("Cell", "Cell") - table.box = getattr(box, box_name) - table.title = Text(f"box.{box_name}", style="magenta") - columns.add_renderable(table) - console.print(columns) - - # console.save_svg("box.svg") diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py deleted file mode 100755 index a854622..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/cells.py +++ /dev/null @@ -1,174 +0,0 @@ -from __future__ import annotations - -from functools import lru_cache -from typing import Callable - -from ._cell_widths import CELL_WIDTHS - -# Ranges of unicode ordinals that produce a 1-cell wide character -# This is non-exhaustive, but covers most common Western characters -_SINGLE_CELL_UNICODE_RANGES: list[tuple[int, int]] = [ - (0x20, 0x7E), # Latin (excluding non-printable) - (0xA0, 0xAC), - (0xAE, 0x002FF), - (0x00370, 0x00482), # Greek / Cyrillic - (0x02500, 0x025FC), # Box drawing, box elements, geometric shapes - (0x02800, 0x028FF), # Braille -] - -# A set of characters that are a single cell wide -_SINGLE_CELLS = frozenset( - [ - character - for _start, _end in _SINGLE_CELL_UNICODE_RANGES - for character in map(chr, range(_start, _end + 1)) - ] -) - -# When called with a string this will return True if all -# characters are single-cell, otherwise False -_is_single_cell_widths: Callable[[str], bool] = _SINGLE_CELLS.issuperset - - -@lru_cache(4096) -def cached_cell_len(text: str) -> int: - """Get the number of cells required to display text. - - This method always caches, which may use up a lot of memory. It is recommended to use - `cell_len` over this method. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - if _is_single_cell_widths(text): - return len(text) - return sum(map(get_character_cell_size, text)) - - -def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: - """Get the number of cells required to display text. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - if len(text) < 512: - return _cell_len(text) - if _is_single_cell_widths(text): - return len(text) - return sum(map(get_character_cell_size, text)) - - -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str) -> int: - """Get the cell size of a character. - - Args: - character (str): A single character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - codepoint = ord(character) - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 - while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 - else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 - - -def set_cell_size(text: str, total: int) -> str: - """Set the length of a string to fit within given number of cells.""" - - if _is_single_cell_widths(text): - size = len(text) - if size < total: - return text + " " * (total - size) - return text[:total] - - if total <= 0: - return "" - cell_size = cell_len(text) - if cell_size == total: - return text - if cell_size < total: - return text + " " * (total - cell_size) - - start = 0 - end = len(text) - - # Binary search until we find the right size - while True: - pos = (start + end) // 2 - before = text[: pos + 1] - before_len = cell_len(before) - if before_len == total + 1 and cell_len(before[-1]) == 2: - return before[:-1] + " " - if before_len == total: - return before - if before_len > total: - end = pos - else: - start = pos - - -def chop_cells( - text: str, - width: int, -) -> list[str]: - """Split text into lines such that each line fits within the available (cell) width. - - Args: - text: The text to fold such that it fits in the given width. - width: The width available (number of cells). - - Returns: - A list of strings such that each string in the list has cell width - less than or equal to the available width. - """ - _get_character_cell_size = get_character_cell_size - lines: list[list[str]] = [[]] - - append_new_line = lines.append - append_to_last_line = lines[-1].append - - total_width = 0 - - for character in text: - cell_width = _get_character_cell_size(character) - char_doesnt_fit = total_width + cell_width > width - - if char_doesnt_fit: - append_new_line([character]) - append_to_last_line = lines[-1].append - total_width = cell_width - else: - append_to_last_line(character) - total_width += cell_width - - return ["".join(line) for line in lines] - - -if __name__ == "__main__": # pragma: no cover - print(get_character_cell_size("😽")) - for line in chop_cells("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", 8): - print(line) - for n in range(80, 1, -1): - print(set_cell_size("""这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑。""", n) + "|") - print("x" * n) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py deleted file mode 100755 index e2c23a6..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py +++ /dev/null @@ -1,621 +0,0 @@ -import re -import sys -from colorsys import rgb_to_hls -from enum import IntEnum -from functools import lru_cache -from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple - -from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE -from .color_triplet import ColorTriplet -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: # pragma: no cover - from .terminal_theme import TerminalTheme - from .text import Text - - -WINDOWS = sys.platform == "win32" - - -class ColorSystem(IntEnum): - """One of the 3 color system supported by terminals.""" - - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorSystem.{self.name}" - - def __str__(self) -> str: - return repr(self) - - -class ColorType(IntEnum): - """Type of color stored in Color class.""" - - DEFAULT = 0 - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorType.{self.name}" - - -ANSI_COLOR_NAMES = { - "black": 0, - "red": 1, - "green": 2, - "yellow": 3, - "blue": 4, - "magenta": 5, - "cyan": 6, - "white": 7, - "bright_black": 8, - "bright_red": 9, - "bright_green": 10, - "bright_yellow": 11, - "bright_blue": 12, - "bright_magenta": 13, - "bright_cyan": 14, - "bright_white": 15, - "grey0": 16, - "gray0": 16, - "navy_blue": 17, - "dark_blue": 18, - "blue3": 20, - "blue1": 21, - "dark_green": 22, - "deep_sky_blue4": 25, - "dodger_blue3": 26, - "dodger_blue2": 27, - "green4": 28, - "spring_green4": 29, - "turquoise4": 30, - "deep_sky_blue3": 32, - "dodger_blue1": 33, - "green3": 40, - "spring_green3": 41, - "dark_cyan": 36, - "light_sea_green": 37, - "deep_sky_blue2": 38, - "deep_sky_blue1": 39, - "spring_green2": 47, - "cyan3": 43, - "dark_turquoise": 44, - "turquoise2": 45, - "green1": 46, - "spring_green1": 48, - "medium_spring_green": 49, - "cyan2": 50, - "cyan1": 51, - "dark_red": 88, - "deep_pink4": 125, - "purple4": 55, - "purple3": 56, - "blue_violet": 57, - "orange4": 94, - "grey37": 59, - "gray37": 59, - "medium_purple4": 60, - "slate_blue3": 62, - "royal_blue1": 63, - "chartreuse4": 64, - "dark_sea_green4": 71, - "pale_turquoise4": 66, - "steel_blue": 67, - "steel_blue3": 68, - "cornflower_blue": 69, - "chartreuse3": 76, - "cadet_blue": 73, - "sky_blue3": 74, - "steel_blue1": 81, - "pale_green3": 114, - "sea_green3": 78, - "aquamarine3": 79, - "medium_turquoise": 80, - "chartreuse2": 112, - "sea_green2": 83, - "sea_green1": 85, - "aquamarine1": 122, - "dark_slate_gray2": 87, - "dark_magenta": 91, - "dark_violet": 128, - "purple": 129, - "light_pink4": 95, - "plum4": 96, - "medium_purple3": 98, - "slate_blue1": 99, - "yellow4": 106, - "wheat4": 101, - "grey53": 102, - "gray53": 102, - "light_slate_grey": 103, - "light_slate_gray": 103, - "medium_purple": 104, - "light_slate_blue": 105, - "dark_olive_green3": 149, - "dark_sea_green": 108, - "light_sky_blue3": 110, - "sky_blue2": 111, - "dark_sea_green3": 150, - "dark_slate_gray3": 116, - "sky_blue1": 117, - "chartreuse1": 118, - "light_green": 120, - "pale_green1": 156, - "dark_slate_gray1": 123, - "red3": 160, - "medium_violet_red": 126, - "magenta3": 164, - "dark_orange3": 166, - "indian_red": 167, - "hot_pink3": 168, - "medium_orchid3": 133, - "medium_orchid": 134, - "medium_purple2": 140, - "dark_goldenrod": 136, - "light_salmon3": 173, - "rosy_brown": 138, - "grey63": 139, - "gray63": 139, - "medium_purple1": 141, - "gold3": 178, - "dark_khaki": 143, - "navajo_white3": 144, - "grey69": 145, - "gray69": 145, - "light_steel_blue3": 146, - "light_steel_blue": 147, - "yellow3": 184, - "dark_sea_green2": 157, - "light_cyan3": 152, - "light_sky_blue1": 153, - "green_yellow": 154, - "dark_olive_green2": 155, - "dark_sea_green1": 193, - "pale_turquoise1": 159, - "deep_pink3": 162, - "magenta2": 200, - "hot_pink2": 169, - "orchid": 170, - "medium_orchid1": 207, - "orange3": 172, - "light_pink3": 174, - "pink3": 175, - "plum3": 176, - "violet": 177, - "light_goldenrod3": 179, - "tan": 180, - "misty_rose3": 181, - "thistle3": 182, - "plum2": 183, - "khaki3": 185, - "light_goldenrod2": 222, - "light_yellow3": 187, - "grey84": 188, - "gray84": 188, - "light_steel_blue1": 189, - "yellow2": 190, - "dark_olive_green1": 192, - "honeydew2": 194, - "light_cyan1": 195, - "red1": 196, - "deep_pink2": 197, - "deep_pink1": 199, - "magenta1": 201, - "orange_red1": 202, - "indian_red1": 204, - "hot_pink": 206, - "dark_orange": 208, - "salmon1": 209, - "light_coral": 210, - "pale_violet_red1": 211, - "orchid2": 212, - "orchid1": 213, - "orange1": 214, - "sandy_brown": 215, - "light_salmon1": 216, - "light_pink1": 217, - "pink1": 218, - "plum1": 219, - "gold1": 220, - "navajo_white1": 223, - "misty_rose1": 224, - "thistle1": 225, - "yellow1": 226, - "light_goldenrod1": 227, - "khaki1": 228, - "wheat1": 229, - "cornsilk1": 230, - "grey100": 231, - "gray100": 231, - "grey3": 232, - "gray3": 232, - "grey7": 233, - "gray7": 233, - "grey11": 234, - "gray11": 234, - "grey15": 235, - "gray15": 235, - "grey19": 236, - "gray19": 236, - "grey23": 237, - "gray23": 237, - "grey27": 238, - "gray27": 238, - "grey30": 239, - "gray30": 239, - "grey35": 240, - "gray35": 240, - "grey39": 241, - "gray39": 241, - "grey42": 242, - "gray42": 242, - "grey46": 243, - "gray46": 243, - "grey50": 244, - "gray50": 244, - "grey54": 245, - "gray54": 245, - "grey58": 246, - "gray58": 246, - "grey62": 247, - "gray62": 247, - "grey66": 248, - "gray66": 248, - "grey70": 249, - "gray70": 249, - "grey74": 250, - "gray74": 250, - "grey78": 251, - "gray78": 251, - "grey82": 252, - "gray82": 252, - "grey85": 253, - "gray85": 253, - "grey89": 254, - "gray89": 254, - "grey93": 255, - "gray93": 255, -} - - -class ColorParseError(Exception): - """The color could not be parsed.""" - - -RE_COLOR = re.compile( - r"""^ -\#([0-9a-f]{6})$| -color\(([0-9]{1,3})\)$| -rgb\(([\d\s,]+)\)$ -""", - re.VERBOSE, -) - - -@rich_repr -class Color(NamedTuple): - """Terminal color definition.""" - - name: str - """The name of the color (typically the input to Color.parse).""" - type: ColorType - """The type of the color.""" - number: Optional[int] = None - """The color number, if a standard color, or None.""" - triplet: Optional[ColorTriplet] = None - """A triplet of color components, if an RGB color.""" - - def __rich__(self) -> "Text": - """Displays the actual color if Rich printed.""" - from .style import Style - from .text import Text - - return Text.assemble( - f"", - ) - - def __rich_repr__(self) -> Result: - yield self.name - yield self.type - yield "number", self.number, None - yield "triplet", self.triplet, None - - @property - def system(self) -> ColorSystem: - """Get the native color system for this color.""" - if self.type == ColorType.DEFAULT: - return ColorSystem.STANDARD - return ColorSystem(int(self.type)) - - @property - def is_system_defined(self) -> bool: - """Check if the color is ultimately defined by the system.""" - return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) - - @property - def is_default(self) -> bool: - """Check if the color is a default color.""" - return self.type == ColorType.DEFAULT - - def get_truecolor( - self, theme: Optional["TerminalTheme"] = None, foreground: bool = True - ) -> ColorTriplet: - """Get an equivalent color triplet for this color. - - Args: - theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. - foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. - - Returns: - ColorTriplet: A color triplet containing RGB components. - """ - - if theme is None: - theme = DEFAULT_TERMINAL_THEME - if self.type == ColorType.TRUECOLOR: - assert self.triplet is not None - return self.triplet - elif self.type == ColorType.EIGHT_BIT: - assert self.number is not None - return EIGHT_BIT_PALETTE[self.number] - elif self.type == ColorType.STANDARD: - assert self.number is not None - return theme.ansi_colors[self.number] - elif self.type == ColorType.WINDOWS: - assert self.number is not None - return WINDOWS_PALETTE[self.number] - else: # self.type == ColorType.DEFAULT: - assert self.number is None - return theme.foreground_color if foreground else theme.background_color - - @classmethod - def from_ansi(cls, number: int) -> "Color": - """Create a Color number from it's 8-bit ansi number. - - Args: - number (int): A number between 0-255 inclusive. - - Returns: - Color: A new Color instance. - """ - return cls( - name=f"color({number})", - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - @classmethod - def from_triplet(cls, triplet: "ColorTriplet") -> "Color": - """Create a truecolor RGB color from a triplet of values. - - Args: - triplet (ColorTriplet): A color triplet containing red, green and blue components. - - Returns: - Color: A new color object. - """ - return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) - - @classmethod - def from_rgb(cls, red: float, green: float, blue: float) -> "Color": - """Create a truecolor from three color components in the range(0->255). - - Args: - red (float): Red component in range 0-255. - green (float): Green component in range 0-255. - blue (float): Blue component in range 0-255. - - Returns: - Color: A new color object. - """ - return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) - - @classmethod - def default(cls) -> "Color": - """Get a Color instance representing the default color. - - Returns: - Color: Default color. - """ - return cls(name="default", type=ColorType.DEFAULT) - - @classmethod - @lru_cache(maxsize=1024) - def parse(cls, color: str) -> "Color": - """Parse a color definition.""" - original_color = color - color = color.lower().strip() - - if color == "default": - return cls(color, type=ColorType.DEFAULT) - - color_number = ANSI_COLOR_NAMES.get(color) - if color_number is not None: - return cls( - color, - type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), - number=color_number, - ) - - color_match = RE_COLOR.match(color) - if color_match is None: - raise ColorParseError(f"{original_color!r} is not a valid color") - - color_24, color_8, color_rgb = color_match.groups() - if color_24: - triplet = ColorTriplet( - int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - elif color_8: - number = int(color_8) - if number > 255: - raise ColorParseError(f"color number must be <= 255 in {color!r}") - return cls( - color, - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - else: # color_rgb: - components = color_rgb.split(",") - if len(components) != 3: - raise ColorParseError( - f"expected three components in {original_color!r}" - ) - red, green, blue = components - triplet = ColorTriplet(int(red), int(green), int(blue)) - if not all(component <= 255 for component in triplet): - raise ColorParseError( - f"color components must be <= 255 in {original_color!r}" - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - @lru_cache(maxsize=1024) - def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: - """Get the ANSI escape codes for this color.""" - _type = self.type - if _type == ColorType.DEFAULT: - return ("39" if foreground else "49",) - - elif _type == ColorType.WINDOWS: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.STANDARD: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.EIGHT_BIT: - assert self.number is not None - return ("38" if foreground else "48", "5", str(self.number)) - - else: # self.standard == ColorStandard.TRUECOLOR: - assert self.triplet is not None - red, green, blue = self.triplet - return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) - - @lru_cache(maxsize=1024) - def downgrade(self, system: ColorSystem) -> "Color": - """Downgrade a color system to a system with fewer colors.""" - - if self.type in (ColorType.DEFAULT, system): - return self - # Convert to 8-bit color from truecolor color - if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - _h, l, s = rgb_to_hls(*self.triplet.normalized) - # If saturation is under 15% assume it is grayscale - if s < 0.15: - gray = round(l * 25.0) - if gray == 0: - color_number = 16 - elif gray == 25: - color_number = 231 - else: - color_number = 231 + gray - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - red, green, blue = self.triplet - six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 - six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 - six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 - - color_number = ( - 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) - ) - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - # Convert to standard from truecolor or 8-bit - elif system == ColorSystem.STANDARD: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = STANDARD_PALETTE.match(triplet) - return Color(self.name, ColorType.STANDARD, number=color_number) - - elif system == ColorSystem.WINDOWS: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - if self.number < 16: - return Color(self.name, ColorType.WINDOWS, number=self.number) - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = WINDOWS_PALETTE.match(triplet) - return Color(self.name, ColorType.WINDOWS, number=color_number) - - return self - - -def parse_rgb_hex(hex_color: str) -> ColorTriplet: - """Parse six hex characters in to RGB triplet.""" - assert len(hex_color) == 6, "must be 6 characters" - color = ColorTriplet( - int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) - ) - return color - - -def blend_rgb( - color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 -) -> ColorTriplet: - """Blend one RGB color in to another.""" - r1, g1, b1 = color1 - r2, g2, b2 = color2 - new_color = ColorTriplet( - int(r1 + (r2 - r1) * cross_fade), - int(g1 + (g2 - g1) * cross_fade), - int(b1 + (b2 - b1) * cross_fade), - ) - return new_color - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - from .table import Table - from .text import Text - - console = Console() - - table = Table(show_footer=False, show_edge=True) - table.add_column("Color", width=10, overflow="ellipsis") - table.add_column("Number", justify="right", style="yellow") - table.add_column("Name", style="green") - table.add_column("Hex", style="blue") - table.add_column("RGB", style="magenta") - - colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) - for color_number, name in colors: - if "grey" in name: - continue - color_cell = Text(" " * 10, style=f"on {name}") - if color_number < 16: - table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) - else: - color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] - table.add_row( - color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb - ) - - console.print(table) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py deleted file mode 100755 index 02cab32..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import NamedTuple, Tuple - - -class ColorTriplet(NamedTuple): - """The red, green, and blue components of a color.""" - - red: int - """Red component in 0 to 255 range.""" - green: int - """Green component in 0 to 255 range.""" - blue: int - """Blue component in 0 to 255 range.""" - - @property - def hex(self) -> str: - """get the color triplet in CSS style.""" - red, green, blue = self - return f"#{red:02x}{green:02x}{blue:02x}" - - @property - def rgb(self) -> str: - """The color in RGB format. - - Returns: - str: An rgb color, e.g. ``"rgb(100,23,255)"``. - """ - red, green, blue = self - return f"rgb({red},{green},{blue})" - - @property - def normalized(self) -> Tuple[float, float, float]: - """Convert components into floats between 0 and 1. - - Returns: - Tuple[float, float, float]: A tuple of three normalized colour components. - """ - red, green, blue = self - return red / 255.0, green / 255.0, blue / 255.0 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py deleted file mode 100755 index 669a3a7..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/columns.py +++ /dev/null @@ -1,187 +0,0 @@ -from collections import defaultdict -from itertools import chain -from operator import itemgetter -from typing import Dict, Iterable, List, Optional, Tuple - -from .align import Align, AlignMethod -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .constrain import Constrain -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .table import Table -from .text import TextType -from .jupyter import JupyterMixin - - -class Columns(JupyterMixin): - """Display renderables in neat columns. - - Args: - renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). - width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. - padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). - expand (bool, optional): Expand columns to full width. Defaults to False. - equal (bool, optional): Arrange in to equal sized columns. Defaults to False. - column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. - right_to_left (bool, optional): Start column from right hand side. Defaults to False. - align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. - title (TextType, optional): Optional title for Columns. - """ - - def __init__( - self, - renderables: Optional[Iterable[RenderableType]] = None, - padding: PaddingDimensions = (0, 1), - *, - width: Optional[int] = None, - expand: bool = False, - equal: bool = False, - column_first: bool = False, - right_to_left: bool = False, - align: Optional[AlignMethod] = None, - title: Optional[TextType] = None, - ) -> None: - self.renderables = list(renderables or []) - self.width = width - self.padding = padding - self.expand = expand - self.equal = equal - self.column_first = column_first - self.right_to_left = right_to_left - self.align: Optional[AlignMethod] = align - self.title = title - - def add_renderable(self, renderable: RenderableType) -> None: - """Add a renderable to the columns. - - Args: - renderable (RenderableType): Any renderable object. - """ - self.renderables.append(renderable) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - render_str = console.render_str - renderables = [ - render_str(renderable) if isinstance(renderable, str) else renderable - for renderable in self.renderables - ] - if not renderables: - return - _top, right, _bottom, left = Padding.unpack(self.padding) - width_padding = max(left, right) - max_width = options.max_width - widths: Dict[int, int] = defaultdict(int) - column_count = len(renderables) - - get_measurement = Measurement.get - renderable_widths = [ - get_measurement(console, options, renderable).maximum - for renderable in renderables - ] - if self.equal: - renderable_widths = [max(renderable_widths)] * len(renderable_widths) - - def iter_renderables( - column_count: int, - ) -> Iterable[Tuple[int, Optional[RenderableType]]]: - item_count = len(renderables) - if self.column_first: - width_renderables = list(zip(renderable_widths, renderables)) - - column_lengths: List[int] = [item_count // column_count] * column_count - for col_no in range(item_count % column_count): - column_lengths[col_no] += 1 - - row_count = (item_count + column_count - 1) // column_count - cells = [[-1] * column_count for _ in range(row_count)] - row = col = 0 - for index in range(item_count): - cells[row][col] = index - column_lengths[col] -= 1 - if column_lengths[col]: - row += 1 - else: - col += 1 - row = 0 - for index in chain.from_iterable(cells): - if index == -1: - break - yield width_renderables[index] - else: - yield from zip(renderable_widths, renderables) - # Pad odd elements with spaces - if item_count % column_count: - for _ in range(column_count - (item_count % column_count)): - yield 0, None - - table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) - table.expand = self.expand - table.title = self.title - - if self.width is not None: - column_count = (max_width) // (self.width + width_padding) - for _ in range(column_count): - table.add_column(width=self.width) - else: - while column_count > 1: - widths.clear() - column_no = 0 - for renderable_width, _ in iter_renderables(column_count): - widths[column_no] = max(widths[column_no], renderable_width) - total_width = sum(widths.values()) + width_padding * ( - len(widths) - 1 - ) - if total_width > max_width: - column_count = len(widths) - 1 - break - else: - column_no = (column_no + 1) % column_count - else: - break - - get_renderable = itemgetter(1) - _renderables = [ - get_renderable(_renderable) - for _renderable in iter_renderables(column_count) - ] - if self.equal: - _renderables = [ - None - if renderable is None - else Constrain(renderable, renderable_widths[0]) - for renderable in _renderables - ] - if self.align: - align = self.align - _Align = Align - _renderables = [ - None if renderable is None else _Align(renderable, align) - for renderable in _renderables - ] - - right_to_left = self.right_to_left - add_row = table.add_row - for start in range(0, len(_renderables), column_count): - row = _renderables[start : start + column_count] - if right_to_left: - row = row[::-1] - add_row(*row) - yield table - - -if __name__ == "__main__": # pragma: no cover - import os - - console = Console() - - files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] - columns = Columns(files, padding=(0, 1), expand=False, equal=False) - console.print(columns) - console.rule() - columns.column_first = True - console.print(columns) - columns.right_to_left = True - console.rule() - console.print(columns) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py deleted file mode 100755 index db2ba55..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py +++ /dev/null @@ -1,2680 +0,0 @@ -import inspect -import os -import sys -import threading -import zlib -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from datetime import datetime -from functools import wraps -from getpass import getpass -from html import escape -from inspect import isclass -from itertools import islice -from math import ceil -from time import monotonic -from types import FrameType, ModuleType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Literal, - Mapping, - NamedTuple, - Optional, - Protocol, - TextIO, - Tuple, - Type, - Union, - cast, - runtime_checkable, -) - -from pip._vendor.rich._null_file import NULL_FILE - -from . import errors, themes -from ._emoji_replace import _emoji_replace -from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT -from ._fileno import get_fileno -from ._log_render import FormatTimeCallable, LogRender -from .align import Align, AlignMethod -from .color import ColorSystem, blend_rgb -from .control import Control -from .emoji import EmojiVariant -from .highlighter import NullHighlighter, ReprHighlighter -from .markup import render as render_markup -from .measure import Measurement, measure_renderables -from .pager import Pager, SystemPager -from .pretty import Pretty, is_expandable -from .protocol import rich_cast -from .region import Region -from .scope import render_scope -from .screen import Screen -from .segment import Segment -from .style import Style, StyleType -from .styled import Styled -from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme -from .text import Text, TextType -from .theme import Theme, ThemeStack - -if TYPE_CHECKING: - from ._windows import WindowsConsoleFeatures - from .live import Live - from .status import Status - -JUPYTER_DEFAULT_COLUMNS = 115 -JUPYTER_DEFAULT_LINES = 100 -WINDOWS = sys.platform == "win32" - -HighlighterType = Callable[[Union[str, "Text"]], "Text"] -JustifyMethod = Literal["default", "left", "center", "right", "full"] -OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] - - -class NoChange: - pass - - -NO_CHANGE = NoChange() - -try: - _STDIN_FILENO = sys.__stdin__.fileno() # type: ignore[union-attr] -except Exception: - _STDIN_FILENO = 0 -try: - _STDOUT_FILENO = sys.__stdout__.fileno() # type: ignore[union-attr] -except Exception: - _STDOUT_FILENO = 1 -try: - _STDERR_FILENO = sys.__stderr__.fileno() # type: ignore[union-attr] -except Exception: - _STDERR_FILENO = 2 - -_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) -_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) - - -_TERM_COLORS = { - "kitty": ColorSystem.EIGHT_BIT, - "256color": ColorSystem.EIGHT_BIT, - "16color": ColorSystem.STANDARD, -} - - -class ConsoleDimensions(NamedTuple): - """Size of the terminal.""" - - width: int - """The width of the console in 'cells'.""" - height: int - """The height of the console in lines.""" - - -@dataclass -class ConsoleOptions: - """Options for __rich_console__ method.""" - - size: ConsoleDimensions - """Size of console.""" - legacy_windows: bool - """legacy_windows: flag for legacy windows.""" - min_width: int - """Minimum width of renderable.""" - max_width: int - """Maximum width of renderable.""" - is_terminal: bool - """True if the target is a terminal, otherwise False.""" - encoding: str - """Encoding of terminal.""" - max_height: int - """Height of container (starts as terminal)""" - justify: Optional[JustifyMethod] = None - """Justify value override for renderable.""" - overflow: Optional[OverflowMethod] = None - """Overflow value override for renderable.""" - no_wrap: Optional[bool] = False - """Disable wrapping for text.""" - highlight: Optional[bool] = None - """Highlight override for render_str.""" - markup: Optional[bool] = None - """Enable markup when rendering strings.""" - height: Optional[int] = None - - @property - def ascii_only(self) -> bool: - """Check if renderables should use ascii only.""" - return not self.encoding.startswith("utf") - - def copy(self) -> "ConsoleOptions": - """Return a copy of the options. - - Returns: - ConsoleOptions: a copy of self. - """ - options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) - options.__dict__ = self.__dict__.copy() - return options - - def update( - self, - *, - width: Union[int, NoChange] = NO_CHANGE, - min_width: Union[int, NoChange] = NO_CHANGE, - max_width: Union[int, NoChange] = NO_CHANGE, - justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, - overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, - no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, - highlight: Union[Optional[bool], NoChange] = NO_CHANGE, - markup: Union[Optional[bool], NoChange] = NO_CHANGE, - height: Union[Optional[int], NoChange] = NO_CHANGE, - ) -> "ConsoleOptions": - """Update values, return a copy.""" - options = self.copy() - if not isinstance(width, NoChange): - options.min_width = options.max_width = max(0, width) - if not isinstance(min_width, NoChange): - options.min_width = min_width - if not isinstance(max_width, NoChange): - options.max_width = max_width - if not isinstance(justify, NoChange): - options.justify = justify - if not isinstance(overflow, NoChange): - options.overflow = overflow - if not isinstance(no_wrap, NoChange): - options.no_wrap = no_wrap - if not isinstance(highlight, NoChange): - options.highlight = highlight - if not isinstance(markup, NoChange): - options.markup = markup - if not isinstance(height, NoChange): - if height is not None: - options.max_height = height - options.height = None if height is None else max(0, height) - return options - - def update_width(self, width: int) -> "ConsoleOptions": - """Update just the width, return a copy. - - Args: - width (int): New width (sets both min_width and max_width) - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - return options - - def update_height(self, height: int) -> "ConsoleOptions": - """Update the height, and return a copy. - - Args: - height (int): New height - - Returns: - ~ConsoleOptions: New Console options instance. - """ - options = self.copy() - options.max_height = options.height = height - return options - - def reset_height(self) -> "ConsoleOptions": - """Return a copy of the options with height set to ``None``. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.height = None - return options - - def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": - """Update the width and height, and return a copy. - - Args: - width (int): New width (sets both min_width and max_width). - height (int): New height. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - options.height = options.max_height = height - return options - - -@runtime_checkable -class RichCast(Protocol): - """An object that may be 'cast' to a console renderable.""" - - def __rich__( - self, - ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover - ... - - -@runtime_checkable -class ConsoleRenderable(Protocol): - """An object that supports the console protocol.""" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": # pragma: no cover - ... - - -# A type that may be rendered by Console. -RenderableType = Union[ConsoleRenderable, RichCast, str] -"""A string or any object that may be rendered by Rich.""" - -# The result of calling a __rich_console__ method. -RenderResult = Iterable[Union[RenderableType, Segment]] - -_null_highlighter = NullHighlighter() - - -class CaptureError(Exception): - """An error in the Capture context manager.""" - - -class NewLine: - """A renderable to generate new line(s)""" - - def __init__(self, count: int = 1) -> None: - self.count = count - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - yield Segment("\n" * self.count) - - -class ScreenUpdate: - """Render a list of lines at a given offset.""" - - def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: - self._lines = lines - self.x = x - self.y = y - - def __rich_console__( - self, console: "Console", options: ConsoleOptions - ) -> RenderResult: - x = self.x - move_to = Control.move_to - for offset, line in enumerate(self._lines, self.y): - yield move_to(x, offset) - yield from line - - -class Capture: - """Context manager to capture the result of printing to the console. - See :meth:`~rich.console.Console.capture` for how to use. - - Args: - console (Console): A console instance to capture output. - """ - - def __init__(self, console: "Console") -> None: - self._console = console - self._result: Optional[str] = None - - def __enter__(self) -> "Capture": - self._console.begin_capture() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self._result = self._console.end_capture() - - def get(self) -> str: - """Get the result of the capture.""" - if self._result is None: - raise CaptureError( - "Capture result is not available until context manager exits." - ) - return self._result - - -class ThemeContext: - """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" - - def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: - self.console = console - self.theme = theme - self.inherit = inherit - - def __enter__(self) -> "ThemeContext": - self.console.push_theme(self.theme) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.console.pop_theme() - - -class PagerContext: - """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" - - def __init__( - self, - console: "Console", - pager: Optional[Pager] = None, - styles: bool = False, - links: bool = False, - ) -> None: - self._console = console - self.pager = SystemPager() if pager is None else pager - self.styles = styles - self.links = links - - def __enter__(self) -> "PagerContext": - self._console._enter_buffer() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if exc_type is None: - with self._console._lock: - buffer: List[Segment] = self._console._buffer[:] - del self._console._buffer[:] - segments: Iterable[Segment] = buffer - if not self.styles: - segments = Segment.strip_styles(segments) - elif not self.links: - segments = Segment.strip_links(segments) - content = self._console._render_buffer(segments) - self.pager.show(content) - self._console._exit_buffer() - - -class ScreenContext: - """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" - - def __init__( - self, console: "Console", hide_cursor: bool, style: StyleType = "" - ) -> None: - self.console = console - self.hide_cursor = hide_cursor - self.screen = Screen(style=style) - self._changed = False - - def update( - self, *renderables: RenderableType, style: Optional[StyleType] = None - ) -> None: - """Update the screen. - - Args: - renderable (RenderableType, optional): Optional renderable to replace current renderable, - or None for no change. Defaults to None. - style: (Style, optional): Replacement style, or None for no change. Defaults to None. - """ - if renderables: - self.screen.renderable = ( - Group(*renderables) if len(renderables) > 1 else renderables[0] - ) - if style is not None: - self.screen.style = style - self.console.print(self.screen, end="") - - def __enter__(self) -> "ScreenContext": - self._changed = self.console.set_alt_screen(True) - if self._changed and self.hide_cursor: - self.console.show_cursor(False) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if self._changed: - self.console.set_alt_screen(False) - if self.hide_cursor: - self.console.show_cursor(True) - - -class Group: - """Takes a group of renderables and returns a renderable object that renders the group. - - Args: - renderables (Iterable[RenderableType]): An iterable of renderable objects. - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: - self._renderables = renderables - self.fit = fit - self._render: Optional[List[RenderableType]] = None - - @property - def renderables(self) -> List["RenderableType"]: - if self._render is None: - self._render = list(self._renderables) - return self._render - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.fit: - return measure_renderables(console, options, self.renderables) - else: - return Measurement(options.max_width, options.max_width) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> RenderResult: - yield from self.renderables - - -def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: - """A decorator that turns an iterable of renderables in to a group. - - Args: - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def decorator( - method: Callable[..., Iterable[RenderableType]], - ) -> Callable[..., Group]: - """Convert a method that returns an iterable of renderables in to a Group.""" - - @wraps(method) - def _replace(*args: Any, **kwargs: Any) -> Group: - renderables = method(*args, **kwargs) - return Group(*renderables, fit=fit) - - return _replace - - return decorator - - -def _is_jupyter() -> bool: # pragma: no cover - """Check if we're running in a Jupyter notebook.""" - try: - get_ipython # type: ignore[name-defined] - except NameError: - return False - ipython = get_ipython() # type: ignore[name-defined] - shell = ipython.__class__.__name__ - if ( - "google.colab" in str(ipython.__class__) - or os.getenv("DATABRICKS_RUNTIME_VERSION") - or shell == "ZMQInteractiveShell" - ): - return True # Jupyter notebook or qtconsole - elif shell == "TerminalInteractiveShell": - return False # Terminal running IPython - else: - return False # Other type (?) - - -COLOR_SYSTEMS = { - "standard": ColorSystem.STANDARD, - "256": ColorSystem.EIGHT_BIT, - "truecolor": ColorSystem.TRUECOLOR, - "windows": ColorSystem.WINDOWS, -} - -_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} - - -@dataclass -class ConsoleThreadLocals(threading.local): - """Thread local values for Console context.""" - - theme_stack: ThemeStack - buffer: List[Segment] = field(default_factory=list) - buffer_index: int = 0 - - -class RenderHook(ABC): - """Provides hooks in to the render process.""" - - @abstractmethod - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Called with a list of objects to render. - - This method can return a new list of renderables, or modify and return the same list. - - Args: - renderables (List[ConsoleRenderable]): A number of renderable objects. - - Returns: - List[ConsoleRenderable]: A replacement list of renderables. - """ - - -_windows_console_features: Optional["WindowsConsoleFeatures"] = None - - -def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover - global _windows_console_features - if _windows_console_features is not None: - return _windows_console_features - from ._windows import get_windows_console_features - - _windows_console_features = get_windows_console_features() - return _windows_console_features - - -def detect_legacy_windows() -> bool: - """Detect legacy Windows.""" - return WINDOWS and not get_windows_console_features().vt - - -class Console: - """A high level console interface. - - Args: - color_system (str, optional): The color system supported by your terminal, - either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. - force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. - force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. - force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. - soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. - theme (Theme, optional): An optional style theme object, or ``None`` for default theme. - stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. - file (IO, optional): A file object where the console should write to. Defaults to stdout. - quiet (bool, Optional): Boolean to suppress all output. Defaults to False. - width (int, optional): The width of the terminal. Leave as default to auto-detect width. - height (int, optional): The height of the terminal. Leave as default to auto-detect height. - style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. - no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. - tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. - record (bool, optional): Boolean to enable recording of terminal output, - required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. - markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. - emoji (bool, optional): Enable emoji code. Defaults to True. - emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. - highlight (bool, optional): Enable automatic highlighting. Defaults to True. - log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. - log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". - highlighter (HighlighterType, optional): Default highlighter. - legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. - safe_box (bool, optional): Restrict box options that don't render on legacy Windows. - get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), - or None for datetime.now. - get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. - """ - - _environ: Mapping[str, str] = os.environ - - def __init__( - self, - *, - color_system: Optional[ - Literal["auto", "standard", "256", "truecolor", "windows"] - ] = "auto", - force_terminal: Optional[bool] = None, - force_jupyter: Optional[bool] = None, - force_interactive: Optional[bool] = None, - soft_wrap: bool = False, - theme: Optional[Theme] = None, - stderr: bool = False, - file: Optional[IO[str]] = None, - quiet: bool = False, - width: Optional[int] = None, - height: Optional[int] = None, - style: Optional[StyleType] = None, - no_color: Optional[bool] = None, - tab_size: int = 8, - record: bool = False, - markup: bool = True, - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - highlight: bool = True, - log_time: bool = True, - log_path: bool = True, - log_time_format: Union[str, FormatTimeCallable] = "[%X]", - highlighter: Optional["HighlighterType"] = ReprHighlighter(), - legacy_windows: Optional[bool] = None, - safe_box: bool = True, - get_datetime: Optional[Callable[[], datetime]] = None, - get_time: Optional[Callable[[], float]] = None, - _environ: Optional[Mapping[str, str]] = None, - ): - # Copy of os.environ allows us to replace it for testing - if _environ is not None: - self._environ = _environ - - self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter - if self.is_jupyter: - if width is None: - jupyter_columns = self._environ.get("JUPYTER_COLUMNS") - if jupyter_columns is not None and jupyter_columns.isdigit(): - width = int(jupyter_columns) - else: - width = JUPYTER_DEFAULT_COLUMNS - if height is None: - jupyter_lines = self._environ.get("JUPYTER_LINES") - if jupyter_lines is not None and jupyter_lines.isdigit(): - height = int(jupyter_lines) - else: - height = JUPYTER_DEFAULT_LINES - - self.tab_size = tab_size - self.record = record - self._markup = markup - self._emoji = emoji - self._emoji_variant: Optional[EmojiVariant] = emoji_variant - self._highlight = highlight - self.legacy_windows: bool = ( - (detect_legacy_windows() and not self.is_jupyter) - if legacy_windows is None - else legacy_windows - ) - - if width is None: - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - self.legacy_windows - if height is None: - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - self.soft_wrap = soft_wrap - self._width = width - self._height = height - - self._color_system: Optional[ColorSystem] - - self._force_terminal = None - if force_terminal is not None: - self._force_terminal = force_terminal - - self._file = file - self.quiet = quiet - self.stderr = stderr - - if color_system is None: - self._color_system = None - elif color_system == "auto": - self._color_system = self._detect_color_system() - else: - self._color_system = COLOR_SYSTEMS[color_system] - - self._lock = threading.RLock() - self._log_render = LogRender( - show_time=log_time, - show_path=log_path, - time_format=log_time_format, - ) - self.highlighter: HighlighterType = highlighter or _null_highlighter - self.safe_box = safe_box - self.get_datetime = get_datetime or datetime.now - self.get_time = get_time or monotonic - self.style = style - self.no_color = ( - no_color - if no_color is not None - else self._environ.get("NO_COLOR", "") != "" - ) - if force_interactive is None: - tty_interactive = self._environ.get("TTY_INTERACTIVE", None) - if tty_interactive is not None: - if tty_interactive == "0": - force_interactive = False - elif tty_interactive == "1": - force_interactive = True - - self.is_interactive = ( - (self.is_terminal and not self.is_dumb_terminal) - if force_interactive is None - else force_interactive - ) - - self._record_buffer_lock = threading.RLock() - self._thread_locals = ConsoleThreadLocals( - theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) - ) - self._record_buffer: List[Segment] = [] - self._render_hooks: List[RenderHook] = [] - self._live_stack: List[Live] = [] - self._is_alt_screen = False - - def __repr__(self) -> str: - return f"" - - @property - def file(self) -> IO[str]: - """Get the file object to write to.""" - file = self._file or (sys.stderr if self.stderr else sys.stdout) - file = getattr(file, "rich_proxied_file", file) - if file is None: - file = NULL_FILE - return file - - @file.setter - def file(self, new_file: IO[str]) -> None: - """Set a new file object.""" - self._file = new_file - - @property - def _buffer(self) -> List[Segment]: - """Get a thread local buffer.""" - return self._thread_locals.buffer - - @property - def _buffer_index(self) -> int: - """Get a thread local buffer.""" - return self._thread_locals.buffer_index - - @_buffer_index.setter - def _buffer_index(self, value: int) -> None: - self._thread_locals.buffer_index = value - - @property - def _theme_stack(self) -> ThemeStack: - """Get the thread local theme stack.""" - return self._thread_locals.theme_stack - - def _detect_color_system(self) -> Optional[ColorSystem]: - """Detect color system from env vars.""" - if self.is_jupyter: - return ColorSystem.TRUECOLOR - if not self.is_terminal or self.is_dumb_terminal: - return None - if WINDOWS: # pragma: no cover - if self.legacy_windows: # pragma: no cover - return ColorSystem.WINDOWS - windows_console_features = get_windows_console_features() - return ( - ColorSystem.TRUECOLOR - if windows_console_features.truecolor - else ColorSystem.EIGHT_BIT - ) - else: - color_term = self._environ.get("COLORTERM", "").strip().lower() - if color_term in ("truecolor", "24bit"): - return ColorSystem.TRUECOLOR - term = self._environ.get("TERM", "").strip().lower() - _term_name, _hyphen, colors = term.rpartition("-") - color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) - return color_system - - def _enter_buffer(self) -> None: - """Enter in to a buffer context, and buffer all output.""" - self._buffer_index += 1 - - def _exit_buffer(self) -> None: - """Leave buffer context, and render content if required.""" - self._buffer_index -= 1 - self._check_buffer() - - def set_live(self, live: "Live") -> bool: - """Set Live instance. Used by Live context manager (no need to call directly). - - Args: - live (Live): Live instance using this Console. - - Returns: - Boolean that indicates if the live is the topmost of the stack. - - Raises: - errors.LiveError: If this Console has a Live context currently active. - """ - with self._lock: - self._live_stack.append(live) - return len(self._live_stack) == 1 - - def clear_live(self) -> None: - """Clear the Live instance. Used by the Live context manager (no need to call directly).""" - with self._lock: - self._live_stack.pop() - - def push_render_hook(self, hook: RenderHook) -> None: - """Add a new render hook to the stack. - - Args: - hook (RenderHook): Render hook instance. - """ - with self._lock: - self._render_hooks.append(hook) - - def pop_render_hook(self) -> None: - """Pop the last renderhook from the stack.""" - with self._lock: - self._render_hooks.pop() - - def __enter__(self) -> "Console": - """Own context manager to enter buffer context.""" - self._enter_buffer() - return self - - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: - """Exit buffer context.""" - self._exit_buffer() - - def begin_capture(self) -> None: - """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" - self._enter_buffer() - - def end_capture(self) -> str: - """End capture mode and return captured string. - - Returns: - str: Console output. - """ - render_result = self._render_buffer(self._buffer) - del self._buffer[:] - self._exit_buffer() - return render_result - - def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: - """Push a new theme on to the top of the stack, replacing the styles from the previous theme. - Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather - than calling this method directly. - - Args: - theme (Theme): A theme instance. - inherit (bool, optional): Inherit existing styles. Defaults to True. - """ - self._theme_stack.push_theme(theme, inherit=inherit) - - def pop_theme(self) -> None: - """Remove theme from top of stack, restoring previous theme.""" - self._theme_stack.pop_theme() - - def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: - """Use a different theme for the duration of the context manager. - - Args: - theme (Theme): Theme instance to user. - inherit (bool, optional): Inherit existing console styles. Defaults to True. - - Returns: - ThemeContext: [description] - """ - return ThemeContext(self, theme, inherit) - - @property - def color_system(self) -> Optional[str]: - """Get color system string. - - Returns: - Optional[str]: "standard", "256" or "truecolor". - """ - - if self._color_system is not None: - return _COLOR_SYSTEMS_NAMES[self._color_system] - else: - return None - - @property - def encoding(self) -> str: - """Get the encoding of the console file, e.g. ``"utf-8"``. - - Returns: - str: A standard encoding string. - """ - return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() - - @property - def is_terminal(self) -> bool: - """Check if the console is writing to a terminal. - - Returns: - bool: True if the console writing to a device capable of - understanding escape sequences, otherwise False. - """ - # If dev has explicitly set this value, return it - if self._force_terminal is not None: - return self._force_terminal - - # Fudge for Idle - if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( - "idlelib" - ): - # Return False for Idle which claims to be a tty but can't handle ansi codes - return False - - if self.is_jupyter: - # return False for Jupyter, which may have FORCE_COLOR set - return False - - environ = self._environ - - tty_compatible = environ.get("TTY_COMPATIBLE", "") - # 0 indicates device is not tty compatible - if tty_compatible == "0": - return False - # 1 indicates device is tty compatible - if tty_compatible == "1": - return True - - # https://force-color.org/ - force_color = environ.get("FORCE_COLOR") - if force_color is not None: - return force_color != "" - - # Any other value defaults to auto detect - isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) - try: - return False if isatty is None else isatty() - except ValueError: - # in some situation (at the end of a pytest run for example) isatty() can raise - # ValueError: I/O operation on closed file - # return False because we aren't in a terminal anymore - return False - - @property - def is_dumb_terminal(self) -> bool: - """Detect dumb terminal. - - Returns: - bool: True if writing to a dumb terminal, otherwise False. - - """ - _term = self._environ.get("TERM", "") - is_dumb = _term.lower() in ("dumb", "unknown") - return self.is_terminal and is_dumb - - @property - def options(self) -> ConsoleOptions: - """Get default console options.""" - size = self.size - return ConsoleOptions( - max_height=size.height, - size=size, - legacy_windows=self.legacy_windows, - min_width=1, - max_width=size.width, - encoding=self.encoding, - is_terminal=self.is_terminal, - ) - - @property - def size(self) -> ConsoleDimensions: - """Get the size of the console. - - Returns: - ConsoleDimensions: A named tuple containing the dimensions. - """ - - if self._width is not None and self._height is not None: - return ConsoleDimensions(self._width - self.legacy_windows, self._height) - - if self.is_dumb_terminal: - return ConsoleDimensions(80, 25) - - width: Optional[int] = None - height: Optional[int] = None - - streams = _STD_STREAMS_OUTPUT if WINDOWS else _STD_STREAMS - for file_descriptor in streams: - try: - width, height = os.get_terminal_size(file_descriptor) - except (AttributeError, ValueError, OSError): # Probably not a terminal - pass - else: - break - - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - # get_terminal_size can report 0, 0 if run from pseudo-terminal - width = width or 80 - height = height or 25 - return ConsoleDimensions( - width - self.legacy_windows if self._width is None else self._width, - height if self._height is None else self._height, - ) - - @size.setter - def size(self, new_size: Tuple[int, int]) -> None: - """Set a new size for the terminal. - - Args: - new_size (Tuple[int, int]): New width and height. - """ - width, height = new_size - self._width = width - self._height = height - - @property - def width(self) -> int: - """Get the width of the console. - - Returns: - int: The width (in characters) of the console. - """ - return self.size.width - - @width.setter - def width(self, width: int) -> None: - """Set width. - - Args: - width (int): New width. - """ - self._width = width - - @property - def height(self) -> int: - """Get the height of the console. - - Returns: - int: The height (in lines) of the console. - """ - return self.size.height - - @height.setter - def height(self, height: int) -> None: - """Set height. - - Args: - height (int): new height. - """ - self._height = height - - def bell(self) -> None: - """Play a 'bell' sound (if supported by the terminal).""" - self.control(Control.bell()) - - def capture(self) -> Capture: - """A context manager to *capture* the result of print() or log() in a string, - rather than writing it to the console. - - Example: - >>> from rich.console import Console - >>> console = Console() - >>> with console.capture() as capture: - ... console.print("[bold magenta]Hello World[/]") - >>> print(capture.get()) - - Returns: - Capture: Context manager with disables writing to the terminal. - """ - capture = Capture(self) - return capture - - def pager( - self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False - ) -> PagerContext: - """A context manager to display anything printed within a "pager". The pager application - is defined by the system and will typically support at least pressing a key to scroll. - - Args: - pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. - styles (bool, optional): Show styles in pager. Defaults to False. - links (bool, optional): Show links in pager. Defaults to False. - - Example: - >>> from rich.console import Console - >>> from rich.__main__ import make_test_card - >>> console = Console() - >>> with console.pager(): - console.print(make_test_card()) - - Returns: - PagerContext: A context manager. - """ - return PagerContext(self, pager=pager, styles=styles, links=links) - - def line(self, count: int = 1) -> None: - """Write new line(s). - - Args: - count (int, optional): Number of new lines. Defaults to 1. - """ - - assert count >= 0, "count must be >= 0" - self.print(NewLine(count)) - - def clear(self, home: bool = True) -> None: - """Clear the screen. - - Args: - home (bool, optional): Also move the cursor to 'home' position. Defaults to True. - """ - if home: - self.control(Control.clear(), Control.home()) - else: - self.control(Control.clear()) - - def status( - self, - status: RenderableType, - *, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ) -> "Status": - """Display a status and spinner. - - Args: - status (RenderableType): A status renderable (str or Text typically). - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - - Returns: - Status: A Status object that may be used as a context manager. - """ - from .status import Status - - status_renderable = Status( - status, - console=self, - spinner=spinner, - spinner_style=spinner_style, - speed=speed, - refresh_per_second=refresh_per_second, - ) - return status_renderable - - def show_cursor(self, show: bool = True) -> bool: - """Show or hide the cursor. - - Args: - show (bool, optional): Set visibility of the cursor. - """ - if self.is_terminal: - self.control(Control.show_cursor(show)) - return True - return False - - def set_alt_screen(self, enable: bool = True) -> bool: - """Enables alternative screen mode. - - Note, if you enable this mode, you should ensure that is disabled before - the application exits. See :meth:`~rich.Console.screen` for a context manager - that handles this for you. - - Args: - enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. - - Returns: - bool: True if the control codes were written. - - """ - changed = False - if self.is_terminal and not self.legacy_windows: - self.control(Control.alt_screen(enable)) - changed = True - self._is_alt_screen = enable - return changed - - @property - def is_alt_screen(self) -> bool: - """Check if the alt screen was enabled. - - Returns: - bool: True if the alt screen was enabled, otherwise False. - """ - return self._is_alt_screen - - def set_window_title(self, title: str) -> bool: - """Set the title of the console terminal window. - - Warning: There is no means within Rich of "resetting" the window title to its - previous value, meaning the title you set will persist even after your application - exits. - - ``fish`` shell resets the window title before and after each command by default, - negating this issue. Windows Terminal and command prompt will also reset the title for you. - Most other shells and terminals, however, do not do this. - - Some terminals may require configuration changes before you can set the title. - Some terminals may not support setting the title at all. - - Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) - may also set the terminal window title. This could result in whatever value you write - using this method being overwritten. - - Args: - title (str): The new title of the terminal window. - - Returns: - bool: True if the control code to change the terminal title was - written, otherwise False. Note that a return value of True - does not guarantee that the window title has actually changed, - since the feature may be unsupported/disabled in some terminals. - """ - if self.is_terminal: - self.control(Control.title(title)) - return True - return False - - def screen( - self, hide_cursor: bool = True, style: Optional[StyleType] = None - ) -> "ScreenContext": - """Context manager to enable and disable 'alternative screen' mode. - - Args: - hide_cursor (bool, optional): Also hide the cursor. Defaults to False. - style (Style, optional): Optional style for screen. Defaults to None. - - Returns: - ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. - """ - return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") - - def measure( - self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None - ) -> Measurement: - """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains - information regarding the number of characters required to print the renderable. - - Args: - renderable (RenderableType): Any renderable or string. - options (Optional[ConsoleOptions], optional): Options to use when measuring, or None - to use default options. Defaults to None. - - Returns: - Measurement: A measurement of the renderable. - """ - measurement = Measurement.get(self, options or self.options, renderable) - return measurement - - def render( - self, renderable: RenderableType, options: Optional[ConsoleOptions] = None - ) -> Iterable[Segment]: - """Render an object in to an iterable of `Segment` instances. - - This method contains the logic for rendering objects with the console protocol. - You are unlikely to need to use it directly, unless you are extending the library. - - Args: - renderable (RenderableType): An object supporting the console protocol, or - an object that may be converted to a string. - options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. - - Returns: - Iterable[Segment]: An iterable of segments that may be rendered. - """ - - _options = options or self.options - if _options.max_width < 1: - # No space to render anything. This prevents potential recursion errors. - return - render_iterable: RenderResult - - renderable = rich_cast(renderable) - if hasattr(renderable, "__rich_console__") and not isclass(renderable): - render_iterable = renderable.__rich_console__(self, _options) - elif isinstance(renderable, str): - text_renderable = self.render_str( - renderable, highlight=_options.highlight, markup=_options.markup - ) - render_iterable = text_renderable.__rich_console__(self, _options) - else: - raise errors.NotRenderableError( - f"Unable to render {renderable!r}; " - "A str, Segment or object with __rich_console__ method is required" - ) - - try: - iter_render = iter(render_iterable) - except TypeError: - raise errors.NotRenderableError( - f"object {render_iterable!r} is not renderable" - ) - _Segment = Segment - _options = _options.reset_height() - for render_output in iter_render: - if isinstance(render_output, _Segment): - yield render_output - else: - yield from self.render(render_output, _options) - - def render_lines( - self, - renderable: RenderableType, - options: Optional[ConsoleOptions] = None, - *, - style: Optional[Style] = None, - pad: bool = True, - new_lines: bool = False, - ) -> List[List[Segment]]: - """Render objects in to a list of lines. - - The output of render_lines is useful when further formatting of rendered console text - is required, such as the Panel class which draws a border around any renderable object. - - Args: - renderable (RenderableType): Any object renderable in the console. - options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. - style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. - pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. - new_lines (bool, optional): Include "\n" characters at end of lines. - - Returns: - List[List[Segment]]: A list of lines, where a line is a list of Segment objects. - """ - with self._lock: - render_options = options or self.options - _rendered = self.render(renderable, render_options) - if style: - _rendered = Segment.apply_style(_rendered, style) - - render_height = render_options.height - if render_height is not None: - render_height = max(0, render_height) - - lines = list( - islice( - Segment.split_and_crop_lines( - _rendered, - render_options.max_width, - include_new_lines=new_lines, - pad=pad, - style=style, - ), - None, - render_height, - ) - ) - if render_options.height is not None: - extra_lines = render_options.height - len(lines) - if extra_lines > 0: - pad_line = [ - ( - [ - Segment(" " * render_options.max_width, style), - Segment("\n"), - ] - if new_lines - else [Segment(" " * render_options.max_width, style)] - ) - ] - lines.extend(pad_line * extra_lines) - - return lines - - def render_str( - self, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - highlighter: Optional[HighlighterType] = None, - ) -> "Text": - """Convert a string to a Text instance. This is called automatically if - you print or log a string. - - Args: - text (str): Text to render. - style (Union[str, Style], optional): Style to apply to rendered text. - justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. - highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. - highlighter (HighlighterType, optional): Optional highlighter to apply. - Returns: - ConsoleRenderable: Renderable object. - - """ - emoji_enabled = emoji or (emoji is None and self._emoji) - markup_enabled = markup or (markup is None and self._markup) - highlight_enabled = highlight or (highlight is None and self._highlight) - - if markup_enabled: - rich_text = render_markup( - text, - style=style, - emoji=emoji_enabled, - emoji_variant=self._emoji_variant, - ) - rich_text.justify = justify - rich_text.overflow = overflow - else: - rich_text = Text( - ( - _emoji_replace(text, default_variant=self._emoji_variant) - if emoji_enabled - else text - ), - justify=justify, - overflow=overflow, - style=style, - ) - - _highlighter = (highlighter or self.highlighter) if highlight_enabled else None - if _highlighter is not None: - highlight_text = _highlighter(str(rich_text)) - highlight_text.copy_styles(rich_text) - return highlight_text - - return rich_text - - def get_style( - self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None - ) -> Style: - """Get a Style instance by its theme name or parse a definition. - - Args: - name (str): The name of a style or a style definition. - - Returns: - Style: A Style object. - - Raises: - MissingStyle: If no style could be parsed from name. - - """ - if isinstance(name, Style): - return name - - try: - style = self._theme_stack.get(name) - if style is None: - style = Style.parse(name) - return style.copy() if style.link else style - except errors.StyleSyntaxError as error: - if default is not None: - return self.get_style(default) - raise errors.MissingStyle( - f"Failed to get style {name!r}; {error}" - ) from None - - def _collect_renderables( - self, - objects: Iterable[Any], - sep: str, - end: str, - *, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - ) -> List[ConsoleRenderable]: - """Combine a number of renderables and text into one renderable. - - Args: - objects (Iterable[Any]): Anything that Rich can render. - sep (str): String to write between print data. - end (str): String to write at end of print data. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. - - Returns: - List[ConsoleRenderable]: A list of things to render. - """ - renderables: List[ConsoleRenderable] = [] - _append = renderables.append - text: List[Text] = [] - append_text = text.append - - append = _append - if justify in ("left", "center", "right"): - - def align_append(renderable: RenderableType) -> None: - _append(Align(renderable, cast(AlignMethod, justify))) - - append = align_append - - _highlighter: HighlighterType = _null_highlighter - if highlight or (highlight is None and self._highlight): - _highlighter = self.highlighter - - def check_text() -> None: - if text: - sep_text = Text(sep, justify=justify, end=end) - append(sep_text.join(text)) - text.clear() - - for renderable in objects: - renderable = rich_cast(renderable) - if isinstance(renderable, str): - append_text( - self.render_str( - renderable, - emoji=emoji, - markup=markup, - highlight=highlight, - highlighter=_highlighter, - ) - ) - elif isinstance(renderable, Text): - append_text(renderable) - elif isinstance(renderable, ConsoleRenderable): - check_text() - append(renderable) - elif is_expandable(renderable): - check_text() - append(Pretty(renderable, highlighter=_highlighter)) - else: - append_text(_highlighter(str(renderable))) - - check_text() - - if self.style is not None: - style = self.get_style(self.style) - renderables = [Styled(renderable, style) for renderable in renderables] - - return renderables - - def rule( - self, - title: TextType = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - align: AlignMethod = "center", - ) -> None: - """Draw a line with optional centered title. - - Args: - title (str, optional): Text to render over the rule. Defaults to "". - characters (str, optional): Character(s) to form the line. Defaults to "─". - style (str, optional): Style of line. Defaults to "rule.line". - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - from .rule import Rule - - rule = Rule(title=title, characters=characters, style=style, align=align) - self.print(rule) - - def control(self, *control: Control) -> None: - """Insert non-printing control codes. - - Args: - control_codes (str): Control codes, such as those that may move the cursor. - """ - if not self.is_dumb_terminal: - with self: - self._buffer.extend(_control.segment for _control in control) - - def out( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - highlight: Optional[bool] = None, - ) -> None: - """Output to the terminal. This is a low-level way of writing to the terminal which unlike - :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will - optionally apply highlighting and a basic style. - - Args: - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use - console default. Defaults to ``None``. - """ - raw_output: str = sep.join(str(_object) for _object in objects) - self.print( - raw_output, - style=style, - highlight=highlight, - emoji=False, - markup=False, - no_wrap=True, - overflow="ignore", - crop=False, - end=end, - ) - - def print( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - no_wrap: Optional[bool] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - width: Optional[int] = None, - height: Optional[int] = None, - crop: bool = True, - soft_wrap: Optional[bool] = None, - new_line_start: bool = False, - ) -> None: - """Print to the console. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. - width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. - crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. - soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for - Console default. Defaults to ``None``. - new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. - """ - if not objects: - objects = (NewLine(),) - - if soft_wrap is None: - soft_wrap = self.soft_wrap - if soft_wrap: - if no_wrap is None: - no_wrap = True - if overflow is None: - overflow = "ignore" - crop = False - render_hooks = self._render_hooks[:] - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - render_options = self.options.update( - justify=justify, - overflow=overflow, - width=min(width, self.width) if width is not None else NO_CHANGE, - height=height, - no_wrap=no_wrap, - markup=markup, - highlight=highlight, - ) - - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - if style is None: - for renderable in renderables: - extend(render(renderable, render_options)) - else: - for renderable in renderables: - extend( - Segment.apply_style( - render(renderable, render_options), self.get_style(style) - ) - ) - if new_line_start: - if ( - len("".join(segment.text for segment in new_segments).splitlines()) - > 1 - ): - new_segments.insert(0, Segment.line()) - if crop: - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - else: - self._buffer.extend(new_segments) - - def print_json( - self, - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (Optional[str]): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - from pip._vendor.rich.json import JSON - - if json is None: - json_renderable = JSON.from_data( - data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - else: - if not isinstance(json, str): - raise TypeError( - f"json must be str. Did you mean print_json(data={json!r}) ?" - ) - json_renderable = JSON( - json, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - self.print(json_renderable, soft_wrap=True) - - def update_screen( - self, - renderable: RenderableType, - *, - region: Optional[Region] = None, - options: Optional[ConsoleOptions] = None, - ) -> None: - """Update the screen at a given offset. - - Args: - renderable (RenderableType): A Rich renderable. - region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. - x (int, optional): x offset. Defaults to 0. - y (int, optional): y offset. Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - render_options = options or self.options - if region is None: - x = y = 0 - render_options = render_options.update_dimensions( - render_options.max_width, render_options.height or self.height - ) - else: - x, y, width, height = region - render_options = render_options.update_dimensions(width, height) - - lines = self.render_lines(renderable, options=render_options) - self.update_screen_lines(lines, x, y) - - def update_screen_lines( - self, lines: List[List[Segment]], x: int = 0, y: int = 0 - ) -> None: - """Update lines of the screen at a given offset. - - Args: - lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). - x (int, optional): x offset (column no). Defaults to 0. - y (int, optional): y offset (column no). Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - screen_update = ScreenUpdate(lines, x, y) - segments = self.render(screen_update) - self._buffer.extend(segments) - self._check_buffer() - - def print_exception( - self, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> None: - """Prints a rich render of the last exception and traceback. - - Args: - width (Optional[int], optional): Number of characters used to render code. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from .traceback import Traceback - - traceback = Traceback( - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - suppress=suppress, - max_frames=max_frames, - ) - self.print(traceback) - - @staticmethod - def _caller_frame_info( - offset: int, - currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, - ) -> Tuple[str, int, Dict[str, Any]]: - """Get caller frame information. - - Args: - offset (int): the caller offset within the current frame stack. - currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to - retrieve the current frame. Defaults to ``inspect.currentframe``. - - Returns: - Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and - the dictionary of local variables associated with the caller frame. - - Raises: - RuntimeError: If the stack offset is invalid. - """ - # Ignore the frame of this local helper - offset += 1 - - frame = currentframe() - if frame is not None: - # Use the faster currentframe where implemented - while offset and frame is not None: - frame = frame.f_back - offset -= 1 - assert frame is not None - return frame.f_code.co_filename, frame.f_lineno, frame.f_locals - else: - # Fallback to the slower stack - frame_info = inspect.stack()[offset] - return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals - - def log( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - log_locals: bool = False, - _stack_offset: int = 1, - ) -> None: - """Log rich content to the terminal. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. - log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` - was called. Defaults to False. - _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. - """ - if not objects: - objects = (NewLine(),) - - render_hooks = self._render_hooks[:] - - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - if style is not None: - renderables = [Styled(renderable, style) for renderable in renderables] - - filename, line_no, locals = self._caller_frame_info(_stack_offset) - link_path = None if filename.startswith("<") else os.path.abspath(filename) - path = filename.rpartition(os.sep)[-1] - if log_locals: - locals_map = { - key: value - for key, value in locals.items() - if not key.startswith("__") - } - renderables.append(render_scope(locals_map, title="[i]locals")) - - renderables = [ - self._log_render( - self, - renderables, - log_time=self.get_datetime(), - path=path, - line_no=line_no, - link_path=link_path, - ) - ] - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - render_options = self.options - for renderable in renderables: - extend(render(renderable, render_options)) - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - - def on_broken_pipe(self) -> None: - """This function is called when a `BrokenPipeError` is raised. - - This can occur when piping Textual output in Linux and macOS. - The default implementation is to exit the app, but you could implement - this method in a subclass to change the behavior. - - See https://docs.python.org/3/library/signal.html#note-on-sigpipe for details. - """ - self.quiet = True - devnull = os.open(os.devnull, os.O_WRONLY) - os.dup2(devnull, sys.stdout.fileno()) - raise SystemExit(1) - - def _check_buffer(self) -> None: - """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) - Rendering is supported on Windows, Unix and Jupyter environments. For - legacy Windows consoles, the win32 API is called directly. - This method will also record what it renders if recording is enabled via Console.record. - """ - if self.quiet: - del self._buffer[:] - return - - try: - self._write_buffer() - except BrokenPipeError: - self.on_broken_pipe() - - def _write_buffer(self) -> None: - """Write the buffer to the output file.""" - - with self._lock: - if self.record and not self._buffer_index: - with self._record_buffer_lock: - self._record_buffer.extend(self._buffer[:]) - - if self._buffer_index == 0: - if self.is_jupyter: # pragma: no cover - from .jupyter import display - - display(self._buffer, self._render_buffer(self._buffer[:])) - del self._buffer[:] - else: - if WINDOWS: - use_legacy_windows_render = False - if self.legacy_windows: - fileno = get_fileno(self.file) - if fileno is not None: - use_legacy_windows_render = ( - fileno in _STD_STREAMS_OUTPUT - ) - - if use_legacy_windows_render: - from pip._vendor.rich._win32_console import LegacyWindowsTerm - from pip._vendor.rich._windows_renderer import legacy_windows_render - - buffer = self._buffer[:] - if self.no_color and self._color_system: - buffer = list(Segment.remove_color(buffer)) - - legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) - else: - # Either a non-std stream on legacy Windows, or modern Windows. - text = self._render_buffer(self._buffer[:]) - # https://bugs.python.org/issue37871 - # https://github.com/python/cpython/issues/82052 - # We need to avoid writing more than 32Kb in a single write, due to the above bug - write = self.file.write - # Worse case scenario, every character is 4 bytes of utf-8 - MAX_WRITE = 32 * 1024 // 4 - try: - if len(text) <= MAX_WRITE: - write(text) - else: - batch: List[str] = [] - batch_append = batch.append - size = 0 - for line in text.splitlines(True): - if size + len(line) > MAX_WRITE and batch: - write("".join(batch)) - batch.clear() - size = 0 - batch_append(line) - size += len(line) - if batch: - write("".join(batch)) - batch.clear() - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - else: - text = self._render_buffer(self._buffer[:]) - try: - self.file.write(text) - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - - self.file.flush() - del self._buffer[:] - - def _render_buffer(self, buffer: Iterable[Segment]) -> str: - """Render buffered output, and clear buffer.""" - output: List[str] = [] - append = output.append - color_system = self._color_system - legacy_windows = self.legacy_windows - not_terminal = not self.is_terminal - if self.no_color and color_system: - buffer = Segment.remove_color(buffer) - for text, style, control in buffer: - if style: - append( - style.render( - text, - color_system=color_system, - legacy_windows=legacy_windows, - ) - ) - elif not (not_terminal and control): - append(text) - - rendered = "".join(output) - return rendered - - def input( - self, - prompt: TextType = "", - *, - markup: bool = True, - emoji: bool = True, - password: bool = False, - stream: Optional[TextIO] = None, - ) -> str: - """Displays a prompt and waits for input from the user. The prompt may contain color / style. - - It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. - - Args: - prompt (Union[str, Text]): Text to render in the prompt. - markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. - emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. - password: (bool, optional): Hide typed text. Defaults to False. - stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. - - Returns: - str: Text read from stdin. - """ - if prompt: - self.print(prompt, markup=markup, emoji=emoji, end="") - if password: - result = getpass("", stream=stream) - else: - if stream: - result = stream.readline() - else: - result = input() - return result - - def export_text(self, *, clear: bool = True, styles: bool = False) -> str: - """Generate text from console contents (requires record=True argument in constructor). - - Args: - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. - Defaults to ``False``. - - Returns: - str: String containing console contents. - - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - - with self._record_buffer_lock: - if styles: - text = "".join( - (style.render(text) if style else text) - for text, style, _ in self._record_buffer - ) - else: - text = "".join( - segment.text - for segment in self._record_buffer - if not segment.control - ) - if clear: - del self._record_buffer[:] - return text - - def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: - """Generate text from console and save to a given location (requires record=True argument in constructor). - - Args: - path (str): Path to write text files. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. - Defaults to ``False``. - - """ - text = self.export_text(clear=clear, styles=styles) - with open(path, "w", encoding="utf-8") as write_file: - write_file.write(text) - - def export_html( - self, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: Optional[str] = None, - inline_styles: bool = False, - ) -> str: - """Generate HTML from console contents (requires record=True argument in constructor). - - Args: - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - Returns: - str: String containing console contents as HTML. - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - fragments: List[str] = [] - append = fragments.append - _theme = theme or DEFAULT_TERMINAL_THEME - stylesheet = "" - - render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format - - with self._record_buffer_lock: - if inline_styles: - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - if style.link: - text = f'{text}' - text = f'{text}' if rule else text - append(text) - else: - styles: Dict[str, int] = {} - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - style_number = styles.setdefault(rule, len(styles) + 1) - if style.link: - text = f'{text}' - else: - text = f'{text}' - append(text) - stylesheet_rules: List[str] = [] - stylesheet_append = stylesheet_rules.append - for style_rule, style_number in styles.items(): - if style_rule: - stylesheet_append(f".r{style_number} {{{style_rule}}}") - stylesheet = "\n".join(stylesheet_rules) - - rendered_code = render_code_format.format( - code="".join(fragments), - stylesheet=stylesheet, - foreground=_theme.foreground_color.hex, - background=_theme.background_color.hex, - ) - if clear: - del self._record_buffer[:] - return rendered_code - - def save_html( - self, - path: str, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_HTML_FORMAT, - inline_styles: bool = False, - ) -> None: - """Generate HTML from console contents and write to a file (requires record=True argument in constructor). - - Args: - path (str): Path to write html file. - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - """ - html = self.export_html( - theme=theme, - clear=clear, - code_format=code_format, - inline_styles=inline_styles, - ) - with open(path, "w", encoding="utf-8") as write_file: - write_file.write(html) - - def export_svg( - self, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> str: - """ - Generate an SVG from the console contents (requires record=True in Console constructor). - - Args: - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - - from pip._vendor.rich.cells import cell_len - - style_cache: Dict[Style, str] = {} - - def get_svg_style(style: Style) -> str: - """Convert a Style to CSS rules for SVG.""" - if style in style_cache: - return style_cache[style] - css_rules = [] - color = ( - _theme.foreground_color - if (style.color is None or style.color.is_default) - else style.color.get_truecolor(_theme) - ) - bgcolor = ( - _theme.background_color - if (style.bgcolor is None or style.bgcolor.is_default) - else style.bgcolor.get_truecolor(_theme) - ) - if style.reverse: - color, bgcolor = bgcolor, color - if style.dim: - color = blend_rgb(color, bgcolor, 0.4) - css_rules.append(f"fill: {color.hex}") - if style.bold: - css_rules.append("font-weight: bold") - if style.italic: - css_rules.append("font-style: italic;") - if style.underline: - css_rules.append("text-decoration: underline;") - if style.strike: - css_rules.append("text-decoration: line-through;") - - css = ";".join(css_rules) - style_cache[style] = css - return css - - _theme = theme or SVG_EXPORT_THEME - - width = self.width - char_height = 20 - char_width = char_height * font_aspect_ratio - line_height = char_height * 1.22 - - margin_top = 1 - margin_right = 1 - margin_bottom = 1 - margin_left = 1 - - padding_top = 40 - padding_right = 8 - padding_bottom = 8 - padding_left = 8 - - padding_width = padding_left + padding_right - padding_height = padding_top + padding_bottom - margin_width = margin_left + margin_right - margin_height = margin_top + margin_bottom - - text_backgrounds: List[str] = [] - text_group: List[str] = [] - classes: Dict[str, int] = {} - style_no = 1 - - def escape_text(text: str) -> str: - """HTML escape text and replace spaces with nbsp.""" - return escape(text).replace(" ", " ") - - def make_tag( - name: str, content: Optional[str] = None, **attribs: object - ) -> str: - """Make a tag from name, content, and attributes.""" - - def stringify(value: object) -> str: - if isinstance(value, (float)): - return format(value, "g") - return str(value) - - tag_attribs = " ".join( - f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' - for k, v in attribs.items() - ) - return ( - f"<{name} {tag_attribs}>{content}" - if content - else f"<{name} {tag_attribs}/>" - ) - - with self._record_buffer_lock: - segments = list(Segment.filter_control(self._record_buffer)) - if clear: - self._record_buffer.clear() - - if unique_id is None: - unique_id = "terminal-" + str( - zlib.adler32( - ("".join(repr(segment) for segment in segments)).encode( - "utf-8", - "ignore", - ) - + title.encode("utf-8", "ignore") - ) - ) - y = 0 - for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): - x = 0 - for text, style, _control in line: - style = style or Style() - rules = get_svg_style(style) - if rules not in classes: - classes[rules] = style_no - style_no += 1 - class_name = f"r{classes[rules]}" - - if style.reverse: - has_background = True - background = ( - _theme.foreground_color.hex - if style.color is None - else style.color.get_truecolor(_theme).hex - ) - else: - bgcolor = style.bgcolor - has_background = bgcolor is not None and not bgcolor.is_default - background = ( - _theme.background_color.hex - if style.bgcolor is None - else style.bgcolor.get_truecolor(_theme).hex - ) - - text_length = cell_len(text) - if has_background: - text_backgrounds.append( - make_tag( - "rect", - fill=background, - x=x * char_width, - y=y * line_height + 1.5, - width=char_width * text_length, - height=line_height + 0.25, - shape_rendering="crispEdges", - ) - ) - - if text != " " * len(text): - text_group.append( - make_tag( - "text", - escape_text(text), - _class=f"{unique_id}-{class_name}", - x=x * char_width, - y=y * line_height + char_height, - textLength=char_width * len(text), - clip_path=f"url(#{unique_id}-line-{y})", - ) - ) - x += cell_len(text) - - line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] - lines = "\n".join( - f""" - {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} - """ - for line_no, offset in enumerate(line_offsets) - ) - - styles = "\n".join( - f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() - ) - backgrounds = "".join(text_backgrounds) - matrix = "".join(text_group) - - terminal_width = ceil(width * char_width + padding_width) - terminal_height = (y + 1) * line_height + padding_height - chrome = make_tag( - "rect", - fill=_theme.background_color.hex, - stroke="rgba(255,255,255,0.35)", - stroke_width="1", - x=margin_left, - y=margin_top, - width=terminal_width, - height=terminal_height, - rx=8, - ) - - title_color = _theme.foreground_color.hex - if title: - chrome += make_tag( - "text", - escape_text(title), - _class=f"{unique_id}-title", - fill=title_color, - text_anchor="middle", - x=terminal_width // 2, - y=margin_top + char_height + 6, - ) - chrome += f""" - - - - - - """ - - svg = code_format.format( - unique_id=unique_id, - char_width=char_width, - char_height=char_height, - line_height=line_height, - terminal_width=char_width * width - 1, - terminal_height=(y + 1) * line_height - 1, - width=terminal_width + margin_width, - height=terminal_height + margin_height, - terminal_x=margin_left + padding_left, - terminal_y=margin_top + padding_top, - styles=styles, - chrome=chrome, - backgrounds=backgrounds, - matrix=matrix, - lines=lines, - ) - return svg - - def save_svg( - self, - path: str, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> None: - """Generate an SVG file from the console contents (requires record=True in Console constructor). - - Args: - path (str): The path to write the SVG to. - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - svg = self.export_svg( - title=title, - theme=theme, - clear=clear, - code_format=code_format, - font_aspect_ratio=font_aspect_ratio, - unique_id=unique_id, - ) - with open(path, "w", encoding="utf-8") as write_file: - write_file.write(svg) - - -def _svg_hash(svg_main_code: str) -> str: - """Returns a unique hash for the given SVG main code. - - Args: - svg_main_code (str): The content we're going to inject in the SVG envelope. - - Returns: - str: a hash of the given content - """ - return str(zlib.adler32(svg_main_code.encode())) - - -if __name__ == "__main__": # pragma: no cover - console = Console(record=True) - - console.log( - "JSONRPC [i]request[/i]", - 5, - 1.3, - True, - False, - None, - { - "jsonrpc": "2.0", - "method": "subtract", - "params": {"minuend": 42, "subtrahend": 23}, - "id": 3, - }, - ) - - console.log("Hello, World!", "{'a': 1}", repr(console)) - - console.print( - { - "name": None, - "empty": [], - "quiz": { - "sport": { - "answered": True, - "q1": { - "question": "Which one is correct team name in NBA?", - "options": [ - "New York Bulls", - "Los Angeles Kings", - "Golden State Warriors", - "Huston Rocket", - ], - "answer": "Huston Rocket", - }, - }, - "maths": { - "answered": False, - "q1": { - "question": "5 + 7 = ?", - "options": [10, 11, 12, 13], - "answer": 12, - }, - "q2": { - "question": "12 - 8 = ?", - "options": [1, 2, 3, 4], - "answer": 4, - }, - }, - }, - } - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py deleted file mode 100755 index 65fdf56..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .jupyter import JupyterMixin -from .measure import Measurement - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Constrain(JupyterMixin): - """Constrain the width of a renderable to a given number of characters. - - Args: - renderable (RenderableType): A renderable object. - width (int, optional): The maximum width (in characters) to render. Defaults to 80. - """ - - def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: - self.renderable = renderable - self.width = width - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.width is None: - yield self.renderable - else: - child_options = options.update_width(min(self.width, options.max_width)) - yield from console.render(self.renderable, child_options) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.width is not None: - options = options.update_width(self.width) - measurement = Measurement.get(console, options, self.renderable) - return measurement diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py deleted file mode 100755 index 901ff8b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/containers.py +++ /dev/null @@ -1,167 +0,0 @@ -from itertools import zip_longest -from typing import ( - TYPE_CHECKING, - Iterable, - Iterator, - List, - Optional, - TypeVar, - Union, - overload, -) - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderResult, - RenderableType, - ) - from .text import Text - -from .cells import cell_len -from .measure import Measurement - -T = TypeVar("T") - - -class Renderables: - """A list subclass which renders its contents to the console.""" - - def __init__( - self, renderables: Optional[Iterable["RenderableType"]] = None - ) -> None: - self._renderables: List["RenderableType"] = ( - list(renderables) if renderables is not None else [] - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._renderables - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - dimensions = [ - Measurement.get(console, options, renderable) - for renderable in self._renderables - ] - if not dimensions: - return Measurement(1, 1) - _min = max(dimension.minimum for dimension in dimensions) - _max = max(dimension.maximum for dimension in dimensions) - return Measurement(_min, _max) - - def append(self, renderable: "RenderableType") -> None: - self._renderables.append(renderable) - - def __iter__(self) -> Iterable["RenderableType"]: - return iter(self._renderables) - - -class Lines: - """A list subclass which can render to the console.""" - - def __init__(self, lines: Iterable["Text"] = ()) -> None: - self._lines: List["Text"] = list(lines) - - def __repr__(self) -> str: - return f"Lines({self._lines!r})" - - def __iter__(self) -> Iterator["Text"]: - return iter(self._lines) - - @overload - def __getitem__(self, index: int) -> "Text": - ... - - @overload - def __getitem__(self, index: slice) -> List["Text"]: - ... - - def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: - return self._lines[index] - - def __setitem__(self, index: int, value: "Text") -> "Lines": - self._lines[index] = value - return self - - def __len__(self) -> int: - return self._lines.__len__() - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._lines - - def append(self, line: "Text") -> None: - self._lines.append(line) - - def extend(self, lines: Iterable["Text"]) -> None: - self._lines.extend(lines) - - def pop(self, index: int = -1) -> "Text": - return self._lines.pop(index) - - def justify( - self, - console: "Console", - width: int, - justify: "JustifyMethod" = "left", - overflow: "OverflowMethod" = "fold", - ) -> None: - """Justify and overflow text to a given width. - - Args: - console (Console): Console instance. - width (int): Number of cells available per line. - justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". - overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". - - """ - from .text import Text - - if justify == "left": - for line in self._lines: - line.truncate(width, overflow=overflow, pad=True) - elif justify == "center": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left((width - cell_len(line.plain)) // 2) - line.pad_right(width - cell_len(line.plain)) - elif justify == "right": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left(width - cell_len(line.plain)) - elif justify == "full": - for line_index, line in enumerate(self._lines): - if line_index == len(self._lines) - 1: - break - words = line.split(" ") - words_size = sum(cell_len(word.plain) for word in words) - num_spaces = len(words) - 1 - spaces = [1 for _ in range(num_spaces)] - index = 0 - if spaces: - while words_size + num_spaces < width: - spaces[len(spaces) - index - 1] += 1 - num_spaces += 1 - index = (index + 1) % len(spaces) - tokens: List[Text] = [] - for index, (word, next_word) in enumerate( - zip_longest(words, words[1:]) - ): - tokens.append(word) - if index < len(spaces): - style = word.get_style_at_offset(console, -1) - next_style = next_word.get_style_at_offset(console, 0) - space_style = style if style == next_style else line.style - tokens.append(Text(" " * spaces[index], style=space_style)) - self[line_index] = Text("").join(tokens) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py deleted file mode 100755 index 84963e9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py +++ /dev/null @@ -1,219 +0,0 @@ -import time -from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union, Final - -from .segment import ControlCode, ControlType, Segment - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -STRIP_CONTROL_CODES: Final = [ - 7, # Bell - 8, # Backspace - 11, # Vertical tab - 12, # Form feed - 13, # Carriage return -] -_CONTROL_STRIP_TRANSLATE: Final = { - _codepoint: None for _codepoint in STRIP_CONTROL_CODES -} - -CONTROL_ESCAPE: Final = { - 7: "\\a", - 8: "\\b", - 11: "\\v", - 12: "\\f", - 13: "\\r", -} - -CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { - ControlType.BELL: lambda: "\x07", - ControlType.CARRIAGE_RETURN: lambda: "\r", - ControlType.HOME: lambda: "\x1b[H", - ControlType.CLEAR: lambda: "\x1b[2J", - ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", - ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", - ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", - ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", - ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", - ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", - ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", - ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", - ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", - ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", - ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", - ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", -} - - -class Control: - """A renderable that inserts a control code (non printable but may move cursor). - - Args: - *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a - tuple of ControlType and an integer parameter - """ - - __slots__ = ["segment"] - - def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: - control_codes: List[ControlCode] = [ - (code,) if isinstance(code, ControlType) else code for code in codes - ] - _format_map = CONTROL_CODES_FORMAT - rendered_codes = "".join( - _format_map[code](*parameters) for code, *parameters in control_codes - ) - self.segment = Segment(rendered_codes, None, control_codes) - - @classmethod - def bell(cls) -> "Control": - """Ring the 'bell'.""" - return cls(ControlType.BELL) - - @classmethod - def home(cls) -> "Control": - """Move cursor to 'home' position.""" - return cls(ControlType.HOME) - - @classmethod - def move(cls, x: int = 0, y: int = 0) -> "Control": - """Move cursor relative to current position. - - Args: - x (int): X offset. - y (int): Y offset. - - Returns: - ~Control: Control object. - - """ - - def get_codes() -> Iterable[ControlCode]: - control = ControlType - if x: - yield ( - control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, - abs(x), - ) - if y: - yield ( - control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, - abs(y), - ) - - control = cls(*get_codes()) - return control - - @classmethod - def move_to_column(cls, x: int, y: int = 0) -> "Control": - """Move to the given column, optionally add offset to row. - - Returns: - x (int): absolute x (column) - y (int): optional y offset (row) - - Returns: - ~Control: Control object. - """ - - return ( - cls( - (ControlType.CURSOR_MOVE_TO_COLUMN, x), - ( - ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, - abs(y), - ), - ) - if y - else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) - ) - - @classmethod - def move_to(cls, x: int, y: int) -> "Control": - """Move cursor to absolute position. - - Args: - x (int): x offset (column) - y (int): y offset (row) - - Returns: - ~Control: Control object. - """ - return cls((ControlType.CURSOR_MOVE_TO, x, y)) - - @classmethod - def clear(cls) -> "Control": - """Clear the screen.""" - return cls(ControlType.CLEAR) - - @classmethod - def show_cursor(cls, show: bool) -> "Control": - """Show or hide the cursor.""" - return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) - - @classmethod - def alt_screen(cls, enable: bool) -> "Control": - """Enable or disable alt screen.""" - if enable: - return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) - else: - return cls(ControlType.DISABLE_ALT_SCREEN) - - @classmethod - def title(cls, title: str) -> "Control": - """Set the terminal window title - - Args: - title (str): The new terminal window title - """ - return cls((ControlType.SET_WINDOW_TITLE, title)) - - def __str__(self) -> str: - return self.segment.text - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.segment.text: - yield self.segment - - -def strip_control_codes( - text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE -) -> str: - """Remove control codes from text. - - Args: - text (str): A string possibly contain control codes. - - Returns: - str: String with control codes removed. - """ - return text.translate(_translate_table) - - -def escape_control_codes( - text: str, - _translate_table: Dict[int, str] = CONTROL_ESCAPE, -) -> str: - """Replace control codes with their "escaped" equivalent in the given text. - (e.g. "\b" becomes "\\b") - - Args: - text (str): A string possibly containing control codes. - - Returns: - str: String with control codes replaced with their escaped version. - """ - return text.translate(_translate_table) - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - console = Console() - console.print("Look at the title of your terminal window ^") - # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) - for i in range(10): - console.set_window_title("🚀 Loading" + "." * i) - time.sleep(0.5) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py deleted file mode 100755 index 61797bf..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/default_styles.py +++ /dev/null @@ -1,193 +0,0 @@ -from typing import Dict - -from .style import Style - -DEFAULT_STYLES: Dict[str, Style] = { - "none": Style.null(), - "reset": Style( - color="default", - bgcolor="default", - dim=False, - bold=False, - italic=False, - underline=False, - blink=False, - blink2=False, - reverse=False, - conceal=False, - strike=False, - ), - "dim": Style(dim=True), - "bright": Style(dim=False), - "bold": Style(bold=True), - "strong": Style(bold=True), - "code": Style(reverse=True, bold=True), - "italic": Style(italic=True), - "emphasize": Style(italic=True), - "underline": Style(underline=True), - "blink": Style(blink=True), - "blink2": Style(blink2=True), - "reverse": Style(reverse=True), - "strike": Style(strike=True), - "black": Style(color="black"), - "red": Style(color="red"), - "green": Style(color="green"), - "yellow": Style(color="yellow"), - "magenta": Style(color="magenta"), - "cyan": Style(color="cyan"), - "white": Style(color="white"), - "inspect.attr": Style(color="yellow", italic=True), - "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), - "inspect.callable": Style(bold=True, color="red"), - "inspect.async_def": Style(italic=True, color="bright_cyan"), - "inspect.def": Style(italic=True, color="bright_cyan"), - "inspect.class": Style(italic=True, color="bright_cyan"), - "inspect.error": Style(bold=True, color="red"), - "inspect.equals": Style(), - "inspect.help": Style(color="cyan"), - "inspect.doc": Style(dim=True), - "inspect.value.border": Style(color="green"), - "live.ellipsis": Style(bold=True, color="red"), - "layout.tree.row": Style(dim=False, color="red"), - "layout.tree.column": Style(dim=False, color="blue"), - "logging.keyword": Style(bold=True, color="yellow"), - "logging.level.notset": Style(dim=True), - "logging.level.debug": Style(color="green"), - "logging.level.info": Style(color="blue"), - "logging.level.warning": Style(color="yellow"), - "logging.level.error": Style(color="red", bold=True), - "logging.level.critical": Style(color="red", bold=True, reverse=True), - "log.level": Style.null(), - "log.time": Style(color="cyan", dim=True), - "log.message": Style.null(), - "log.path": Style(dim=True), - "repr.ellipsis": Style(color="yellow"), - "repr.indent": Style(color="green", dim=True), - "repr.error": Style(color="red", bold=True), - "repr.str": Style(color="green", italic=False, bold=False), - "repr.brace": Style(bold=True), - "repr.comma": Style(bold=True), - "repr.ipv4": Style(bold=True, color="bright_green"), - "repr.ipv6": Style(bold=True, color="bright_green"), - "repr.eui48": Style(bold=True, color="bright_green"), - "repr.eui64": Style(bold=True, color="bright_green"), - "repr.tag_start": Style(bold=True), - "repr.tag_name": Style(color="bright_magenta", bold=True), - "repr.tag_contents": Style(color="default"), - "repr.tag_end": Style(bold=True), - "repr.attrib_name": Style(color="yellow", italic=False), - "repr.attrib_equal": Style(bold=True), - "repr.attrib_value": Style(color="magenta", italic=False), - "repr.number": Style(color="cyan", bold=True, italic=False), - "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same - "repr.bool_true": Style(color="bright_green", italic=True), - "repr.bool_false": Style(color="bright_red", italic=True), - "repr.none": Style(color="magenta", italic=True), - "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), - "repr.uuid": Style(color="bright_yellow", bold=False), - "repr.call": Style(color="magenta", bold=True), - "repr.path": Style(color="magenta"), - "repr.filename": Style(color="bright_magenta"), - "rule.line": Style(color="bright_green"), - "rule.text": Style.null(), - "json.brace": Style(bold=True), - "json.bool_true": Style(color="bright_green", italic=True), - "json.bool_false": Style(color="bright_red", italic=True), - "json.null": Style(color="magenta", italic=True), - "json.number": Style(color="cyan", bold=True, italic=False), - "json.str": Style(color="green", italic=False, bold=False), - "json.key": Style(color="blue", bold=True), - "prompt": Style.null(), - "prompt.choices": Style(color="magenta", bold=True), - "prompt.default": Style(color="cyan", bold=True), - "prompt.invalid": Style(color="red"), - "prompt.invalid.choice": Style(color="red"), - "pretty": Style.null(), - "scope.border": Style(color="blue"), - "scope.key": Style(color="yellow", italic=True), - "scope.key.special": Style(color="yellow", italic=True, dim=True), - "scope.equals": Style(color="red"), - "table.header": Style(bold=True), - "table.footer": Style(bold=True), - "table.cell": Style.null(), - "table.title": Style(italic=True), - "table.caption": Style(italic=True, dim=True), - "traceback.error": Style(color="red", italic=True), - "traceback.border.syntax_error": Style(color="bright_red"), - "traceback.border": Style(color="red"), - "traceback.text": Style.null(), - "traceback.title": Style(color="red", bold=True), - "traceback.exc_type": Style(color="bright_red", bold=True), - "traceback.exc_value": Style.null(), - "traceback.offset": Style(color="bright_red", bold=True), - "traceback.error_range": Style(underline=True, bold=True), - "traceback.note": Style(color="green", bold=True), - "traceback.group.border": Style(color="magenta"), - "bar.back": Style(color="grey23"), - "bar.complete": Style(color="rgb(249,38,114)"), - "bar.finished": Style(color="rgb(114,156,31)"), - "bar.pulse": Style(color="rgb(249,38,114)"), - "progress.description": Style.null(), - "progress.filesize": Style(color="green"), - "progress.filesize.total": Style(color="green"), - "progress.download": Style(color="green"), - "progress.elapsed": Style(color="yellow"), - "progress.percentage": Style(color="magenta"), - "progress.remaining": Style(color="cyan"), - "progress.data.speed": Style(color="red"), - "progress.spinner": Style(color="green"), - "status.spinner": Style(color="green"), - "tree": Style(), - "tree.line": Style(), - "markdown.paragraph": Style(), - "markdown.text": Style(), - "markdown.em": Style(italic=True), - "markdown.emph": Style(italic=True), # For commonmark backwards compatibility - "markdown.strong": Style(bold=True), - "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), - "markdown.code_block": Style(color="cyan", bgcolor="black"), - "markdown.block_quote": Style(color="magenta"), - "markdown.list": Style(color="cyan"), - "markdown.item": Style(), - "markdown.item.bullet": Style(color="yellow", bold=True), - "markdown.item.number": Style(color="yellow", bold=True), - "markdown.hr": Style(color="yellow"), - "markdown.h1.border": Style(), - "markdown.h1": Style(bold=True), - "markdown.h2": Style(bold=True, underline=True), - "markdown.h3": Style(bold=True), - "markdown.h4": Style(bold=True, dim=True), - "markdown.h5": Style(underline=True), - "markdown.h6": Style(italic=True), - "markdown.h7": Style(italic=True, dim=True), - "markdown.link": Style(color="bright_blue"), - "markdown.link_url": Style(color="blue", underline=True), - "markdown.s": Style(strike=True), - "iso8601.date": Style(color="blue"), - "iso8601.time": Style(color="magenta"), - "iso8601.timezone": Style(color="yellow"), -} - - -if __name__ == "__main__": # pragma: no cover - import argparse - import io - - from pip._vendor.rich.console import Console - from pip._vendor.rich.table import Table - from pip._vendor.rich.text import Text - - parser = argparse.ArgumentParser() - parser.add_argument("--html", action="store_true", help="Export as HTML table") - args = parser.parse_args() - html: bool = args.html - console = Console(record=True, width=70, file=io.StringIO()) if html else Console() - - table = Table("Name", "Styling") - - for style_name, style in DEFAULT_STYLES.items(): - table.add_row(Text(style_name, style=style), str(style)) - - console.print(table) - if html: - print(console.export_html(inline_styles=True)) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py deleted file mode 100755 index 92893b3..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/diagnose.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -import platform - -from pip._vendor.rich import inspect -from pip._vendor.rich.console import Console, get_windows_console_features -from pip._vendor.rich.panel import Panel -from pip._vendor.rich.pretty import Pretty - - -def report() -> None: # pragma: no cover - """Print a report to the terminal with debugging information""" - console = Console() - inspect(console) - features = get_windows_console_features() - inspect(features) - - env_names = ( - "CLICOLOR", - "COLORTERM", - "COLUMNS", - "JPY_PARENT_PID", - "JUPYTER_COLUMNS", - "JUPYTER_LINES", - "LINES", - "NO_COLOR", - "TERM_PROGRAM", - "TERM", - "TTY_COMPATIBLE", - "TTY_INTERACTIVE", - "VSCODE_VERBOSE_LOGGING", - ) - env = {name: os.getenv(name) for name in env_names} - console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) - - console.print(f'platform="{platform.system()}"') - - -if __name__ == "__main__": # pragma: no cover - report() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py deleted file mode 100755 index 4a667ed..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/emoji.py +++ /dev/null @@ -1,91 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Optional, Union, Literal - -from .jupyter import JupyterMixin -from .segment import Segment -from .style import Style -from ._emoji_codes import EMOJI -from ._emoji_replace import _emoji_replace - - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - - -EmojiVariant = Literal["emoji", "text"] - - -class NoEmoji(Exception): - """No emoji by that name.""" - - -class Emoji(JupyterMixin): - __slots__ = ["name", "style", "_char", "variant"] - - VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} - - def __init__( - self, - name: str, - style: Union[str, Style] = "none", - variant: Optional[EmojiVariant] = None, - ) -> None: - """A single emoji character. - - Args: - name (str): Name of emoji. - style (Union[str, Style], optional): Optional style. Defaults to None. - - Raises: - NoEmoji: If the emoji doesn't exist. - """ - self.name = name - self.style = style - self.variant = variant - try: - self._char = EMOJI[name] - except KeyError: - raise NoEmoji(f"No emoji called {name!r}") - if variant is not None: - self._char += self.VARIANTS.get(variant, "") - - @classmethod - def replace(cls, text: str) -> str: - """Replace emoji markup with corresponding unicode characters. - - Args: - text (str): A string with emojis codes, e.g. "Hello :smiley:!" - - Returns: - str: A string with emoji codes replaces with actual emoji. - """ - return _emoji_replace(text) - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return self._char - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield Segment(self._char, console.get_style(self.style)) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.console import Console - - console = Console(record=True) - - columns = Columns( - (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), - column_first=True, - ) - - console.print(columns) - if len(sys.argv) > 1: - console.save_html(sys.argv[1]) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py deleted file mode 100755 index 0bcbe53..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/errors.py +++ /dev/null @@ -1,34 +0,0 @@ -class ConsoleError(Exception): - """An error in console operation.""" - - -class StyleError(Exception): - """An error in styles.""" - - -class StyleSyntaxError(ConsoleError): - """Style was badly formatted.""" - - -class MissingStyle(StyleError): - """No such style.""" - - -class StyleStackError(ConsoleError): - """Style stack is invalid.""" - - -class NotRenderableError(ConsoleError): - """Object is not renderable.""" - - -class MarkupError(ConsoleError): - """Markup was badly formatted.""" - - -class LiveError(ConsoleError): - """Error related to Live display.""" - - -class NoAltScreen(ConsoleError): - """Alt screen mode was required.""" diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py deleted file mode 100755 index 4b0b0da..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py +++ /dev/null @@ -1,57 +0,0 @@ -import io -from typing import IO, TYPE_CHECKING, Any, List - -from .ansi import AnsiDecoder -from .text import Text - -if TYPE_CHECKING: - from .console import Console - - -class FileProxy(io.TextIOBase): - """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" - - def __init__(self, console: "Console", file: IO[str]) -> None: - self.__console = console - self.__file = file - self.__buffer: List[str] = [] - self.__ansi_decoder = AnsiDecoder() - - @property - def rich_proxied_file(self) -> IO[str]: - """Get proxied file.""" - return self.__file - - def __getattr__(self, name: str) -> Any: - return getattr(self.__file, name) - - def write(self, text: str) -> int: - if not isinstance(text, str): - raise TypeError(f"write() argument must be str, not {type(text).__name__}") - buffer = self.__buffer - lines: List[str] = [] - while text: - line, new_line, text = text.partition("\n") - if new_line: - lines.append("".join(buffer) + line) - buffer.clear() - else: - buffer.append(line) - break - if lines: - console = self.__console - with console: - output = Text("\n").join( - self.__ansi_decoder.decode_line(line) for line in lines - ) - console.print(output) - return len(text) - - def flush(self) -> None: - output = "".join(self.__buffer) - if output: - self.__console.print(output) - del self.__buffer[:] - - def fileno(self) -> int: - return self.__file.fileno() diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py deleted file mode 100755 index 83bc911..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/filesize.py +++ /dev/null @@ -1,88 +0,0 @@ -"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 - -The functions declared in this module should cover the different -use cases needed to generate a string representation of a file size -using several different units. Since there are many standards regarding -file size units, three different functions have been implemented. - -See Also: - * `Wikipedia: Binary prefix `_ - -""" - -__all__ = ["decimal"] - -from typing import Iterable, List, Optional, Tuple - - -def _to_str( - size: int, - suffixes: Iterable[str], - base: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - if size == 1: - return "1 byte" - elif size < base: - return f"{size:,} bytes" - - for i, suffix in enumerate(suffixes, 2): # noqa: B007 - unit = base**i - if size < unit: - break - return "{:,.{precision}f}{separator}{}".format( - (base * size / unit), - suffix, - precision=precision, - separator=separator, - ) - - -def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: - """Pick a suffix and base for the given size.""" - for i, suffix in enumerate(suffixes): - unit = base**i - if size < unit * base: - break - return unit, suffix - - -def decimal( - size: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - """Convert a filesize in to a string (powers of 1000, SI prefixes). - - In this convention, ``1000 B = 1 kB``. - - This is typically the format used to advertise the storage - capacity of USB flash drives and the like (*256 MB* meaning - actually a storage capacity of more than *256 000 000 B*), - or used by **Mac OS X** since v10.6 to report file sizes. - - Arguments: - int (size): A file size. - int (precision): The number of decimal places to include (default = 1). - str (separator): The string to separate the value from the units (default = " "). - - Returns: - `str`: A string containing a abbreviated file size and units. - - Example: - >>> filesize.decimal(30000) - '30.0 kB' - >>> filesize.decimal(30000, precision=2, separator="") - '30.00kB' - - """ - return _to_str( - size, - ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), - 1000, - precision=precision, - separator=separator, - ) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py deleted file mode 100755 index e4c462e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py +++ /dev/null @@ -1,232 +0,0 @@ -import re -from abc import ABC, abstractmethod -from typing import List, Union - -from .text import Span, Text - - -def _combine_regex(*regexes: str) -> str: - """Combine a number of regexes in to a single regex. - - Returns: - str: New regex with all regexes ORed together. - """ - return "|".join(regexes) - - -class Highlighter(ABC): - """Abstract base class for highlighters.""" - - def __call__(self, text: Union[str, Text]) -> Text: - """Highlight a str or Text instance. - - Args: - text (Union[str, ~Text]): Text to highlight. - - Raises: - TypeError: If not called with text or str. - - Returns: - Text: A test instance with highlighting applied. - """ - if isinstance(text, str): - highlight_text = Text(text) - elif isinstance(text, Text): - highlight_text = text.copy() - else: - raise TypeError(f"str or Text instance required, not {text!r}") - self.highlight(highlight_text) - return highlight_text - - @abstractmethod - def highlight(self, text: Text) -> None: - """Apply highlighting in place to text. - - Args: - text (~Text): A text object highlight. - """ - - -class NullHighlighter(Highlighter): - """A highlighter object that doesn't highlight. - - May be used to disable highlighting entirely. - - """ - - def highlight(self, text: Text) -> None: - """Nothing to do""" - - -class RegexHighlighter(Highlighter): - """Applies highlighting from a list of regular expressions.""" - - highlights: List[str] = [] - base_style: str = "" - - def highlight(self, text: Text) -> None: - """Highlight :class:`rich.text.Text` using regular expressions. - - Args: - text (~Text): Text to highlighted. - - """ - - highlight_regex = text.highlight_regex - for re_highlight in self.highlights: - highlight_regex(re_highlight, style_prefix=self.base_style) - - -class ReprHighlighter(RegexHighlighter): - """Highlights the text typically produced from ``__repr__`` methods.""" - - base_style = "repr." - highlights = [ - r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", - r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', - r"(?P[][{}()])", - _combine_regex( - r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", - r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", - r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", - r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", - r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", - r"(?P[\w.]*?)\(", - r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", - r"(?P\.\.\.)", - r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", - r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#~@]*)", - ), - ] - - -class JSONHighlighter(RegexHighlighter): - """Highlights JSON""" - - # Captures the start and end of JSON strings, handling escaped quotes - JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", - r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", - r"(?P(? None: - super().highlight(text) - - # Additional work to handle highlighting JSON keys - plain = text.plain - append = text.spans.append - whitespace = self.JSON_WHITESPACE - for match in re.finditer(self.JSON_STR, plain): - start, end = match.span() - cursor = end - while cursor < len(plain): - char = plain[cursor] - cursor += 1 - if char == ":": - append(Span(start, end, "json.key")) - elif char in whitespace: - continue - break - - -class ISO8601Highlighter(RegexHighlighter): - """Highlights the ISO8601 date time strings. - Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html - """ - - base_style = "iso8601." - highlights = [ - # - # Dates - # - # Calendar month (e.g. 2008-08). The hyphen is required - r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", - # Calendar date w/o hyphens (e.g. 20080830) - r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", - # Ordinal date (e.g. 2008-243). The hyphen is optional - r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", - # - # Weeks - # - # Week of the year (e.g., 2008-W35). The hyphen is optional - r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", - # Week date (e.g., 2008-W35-6). The hyphens are optional - r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", - # - # Times - # - # Hours and minutes (e.g., 17:21). The colon is optional - r"^(?P

    5c)=15dZd-JH4ZSvqA&*J}M9BOmf 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 PE2k_R_C+@JtDXM~ZyufA diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc deleted file mode 100755 index da620c31646425d34511c5140e853fba55464f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2096 zcmah~-D?|15Z}|C&Zj%ecC5rPZkk@>x{c&mYWzWi8%h&n61NbF?U$;g$N6q;oqW1G zcGnIvGUTCzJi3q)Qz*F5rU`lIQ=xx`RMb`+7z`y3eG{0xg8Ujp+G*~k`LR1)$+DVC3w#JpIN@{+*UV{W`8 z=Vbw5iO4V)-M*5NS3oA^6LuU6wv5$v$?p3~%4@cQ`)%1yz+8oS($-c`y8mx}SXv6j zYhF2&ER(WOT)`|%u73X6qOovuapBXYTQ|}|*ym8oH7R`}gagaivoSH(T)bKia5!Z; zg*%uy#p#*3>6ux#NNq2encbwmz3v2ed<=`wi!R+P+UsGzRlwG!;jb03#X^~2wnaQk zXy2L-903u&V;9In#5!aZ#A2}6ZjXR}`f?t;#Q@8bRsr04{x|ts2BzT#xTO6HfQ-B^<8WjX)#nC>Uflyo`pk^ zG7|O`OlmSl(gM-IP0H`3zgW!`{1VQUOk(-DPy7vkCT9jgZX0{sIoDas1!Y$7y_xLg z%Q@;WJQbMMrn!M>E^vaJ0o!b!csyM=so4uqP81jeJ4CZ@OEPN+mLSd{ z`Z6x)y>4w5Wmju+kDWo5Jh8&h>9(_i*kGr$*Na^-hALu@=ZKx^)akakD^;XQY#R~5 zo2|qSI_}V+BX#QlPOrye@O4=He2<;!ur0tHyRrnLT-y140W!TK!kMp|?fB;5!Xw-= zUDxq8^pgj zO884aR$@km`F;*~s2Vqxu3ukVURt>sN(2Xxu^X82j148mE1hWCHsRGN9Va7PEwVBc z)qritc7|;OOokdSq(%ut;@aWhD`X6Ah4LcB5z|SEpPGo&xdyoabG}B8fZRpRVHCeo zl|Ja~&n`@SKk>svRXTmBp4!Xo7i(&|uBMwP5zqee-mjV3^kRK_F`Dx9o&Rp9re*3{ zrip~aJBO*W`)VyUUQdlz`^OJQ-rO%f&eTTc>LYXawZ<8J?~AW*Ke&BgJsdl~zf&8_ z)W6|cfv7jZ)=y-4vSE9}A^s$S+2;v}7k&Lm?dTU}4H;K4sY zDEJ3d#DAtIS#lCQd0SaeJ(es{^n!Zj@W z7A^n<6c(U_3537{j{)`G0qQe&=>zb^`pOcI22VgQ{Nd6bG~F>N8GSmb3YM;0+F`R` zd1BKGz(4{iNW5oOB=K3mLh89nOa7LEErpI~WTiSLI%OG`;_bah?2HRm$0SxP)kI{I zf+)+b8q2d-=Pa&M#hBv>0(?;Iw>6QV*F}C zigl%fF_o#E_PNkzA7dhf)I?jE8spDk>5h1PigH;pR1%d+G?bYKYO36wv>~uiKd_3Zj6 q^*0`>J2r*Z>yZr$A3`_>cd!0_7f}Qc7U19TKKbcpfBmP_iv0#GHLOMe diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc deleted file mode 100755 index f3fe555bd87e894b8be55ed58b4661c8331d5449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7622 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc deleted file mode 100755 index 1be0dbe54df4b71ba826e0798e575b2a50f02706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7165 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc deleted file mode 100755 index 60fac9bd8b5c11fcc9811e108727daf50e1d66b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2774 zcmbtWU2Gdw7QQo{KTm9D(zGOTOEQ5pTL)rODz@TBRFH%Ml~U9eq_x-`O+B}H4;*#eOcZHg_Tx3an6kGIQ%^A zotbm*x%ZrN?>*-`$NqahuM%kAd~|d5q(sQSk?A#|JJ=0iaD!OH;%w67s$7$=@*J^v zD`RJxLRCn{f-N?ss+5dHTW%^PNYA)UhZ#NBuQBhzcoZ zUQDe-;%VltdA0OlDb047-M_%#2BD!=~#M=xt_1nztyPkmsM4V_5xe+pGii@4VXK&|JJ2v^o4rE zwgyDXeKj9FtRL$;`f=Uuh6mJok);@XLRnv=mrU?59N5*DU5BO?Sq_{M zse5NxehDHjCOVO3dY;{=nHYVe=~^@z+7tBI2&l3Hs4p=ZtTCsCfWU@O%D^YXxBDUx z05E6q2;dC>EKfoq%zQvXV)Q{5a=@WZ(n21%UJ3yCArzTqhQcL|<*^f^aj)T(jmr=e zmz7zgRxj65h$R9{1F5|ug1q2U`_kSF8$|)M<%>WtBKl9~Ds{I>D@~Kt+{&x&ihH60 zKB&MZmn(MTV#Qkz>aKI5eEfLDZv=GS12>y1)UUu-h^nKAsoaeSSNLG8% zB&-;6Tm4A&B(Wcqx()Jo`Z^9I<%SsYTZ4P|Rl`gu+~xL{oec?g>Bqb;n(l%jN}2~a z3Z+oAGIxdBAbqE=u^|T-&2C#o>?JLfako&sEB;a*POtQ&*zlmXCH>+y2L@MHdnJh6 z2K75V6J$dP4)qxl%KL3Bl0T0o-py{Pp}GX9ekbz=xxv2&84+fEAyk0lICAY^f_Hft z6Y=ea71SfCP8%!rAR-q^e1hO8+k;sI8EBAiB zCAKbijz9H9v8^p#m%r7fzt*O=WldW;!|T+Szt)dXsHEfA7$ji*bgG9Q}dtBkGSxTH=2tGBUmcc8`8` z=yT~FZEK6$+TxD32$pB(c4nV#kDmSb!n3*5dV<&e-AB*}~SFffb7RHMvM*j2v&U`f&cEn6Z4{|!~{u!j7+x$9o}t0k5w`|*O{J; zv#NMJCOz`tq1jkOMk3nyW_D-zkyu7nA%~|@QI)8Lc&I18rx}kI#Hr4h9%rzB?AfG$ zkR6Lf;A8STB)tb-VY#G5Qn2ndoR#$ASVJP&Pyfa+OpFBLsY65q|HmXbF%X1)aZP?f z)1REgJtt7R@3Nni=h9d_&rZSumPh|zK;jI?aUC+({;l@`Inv($cJ{Nd`s*3+qc9Q^ enUi8(5~Y~@zvRFS2j2WO`2pvC{Eda=+CKvxGo6qC diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc deleted file mode 100755 index 873bc1ce497afb0deb1c7ddd5df2fc237b6033dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32035 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 RJC|zsm>{-hEd0d>{}*KbJxBlm diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc deleted file mode 100755 index 92015bc1ec333ff514559dc50fe10826de10fb41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6693 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc deleted file mode 100755 index 855a077d55a4d08f484b4d0233aa6ef100dfb364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6758 zcmcH-OKcm*bx7`#OLF{AQz8)~aQ)+>PcHqmhme0_r+tOp#-ptuAs-V;XrMx>fqWo< z?O-KX4dp{sAum8bM1_i24d=tvNIt^*VnwP(^HJUoS7Oz8KF-^bid;?P6TB@|lGRi` z6(B)!n$YNVLSrm?Cq&5S@OQ3!n)T55`=9|Ke++0bkStevt9|)C&LQDQMGh={2WUQb zrUA^0Ox)`Cx*ZLgyb}OQ_&e8&B;OD7`)JCK4-num(5C8q(sVcFQ_k=CFX#7f4R*?H zw`ni!yVrjQtnxXx4C1*Bo@NaL|Dz6rbchb$8}Yv{SBueZ-t++ex;3uF50P1-3s-_y zL+_C*;92j%I=J13+H386(t~^XE)aTPfn+lekT4st66dvIi7ggO@1I|*vux0k&ee^w zS}Rs80WlBoy#qS(hFa6r3bT@Lvl?Yuak0YqjDRJdS*@=bOgme?TCM?0;pgSc44#pN zdbw6(8Z@H|#+pN4>Qpe{b{@S6Qa&b($xby7QWjD8*X2TEv&1i^UYU=Coz~ByVBQoj=v}{!c1%?IF$c z3}s3;GzDawXIBlySgV7`N@XpZ^SG59cT%QYznWH5*YC0?6&DA(g3wxtDTb=7>I`T! zWnQf@WeFO~6?L&#QCvnjQDHT20n!U{TiyfWoEzE3d6c1Z4G>6p4L(8ruHs!T0a)S}^M zSjT~-VhLX?T4&Fa{32#^$9GlM*pkNdl|r3q1)YIG_Z2a}T3uxDQkN8$p6LqAP@EZE z?4QrQ=0i^b6UO$dZX^3zR$|sSR@5q+sTQ@8I&(%{R!__n>-Cw-taf>(QeK>KBIiVIc6LTD8|+ve z>PvB%=`;0meWn0pRMloMsAgQZsIP&Zg>tQI6bg;h0#8-BHUf*AegVKWV)v7w%!aTT zH#0{!gqAdF4va!K_RaA4R^+p#znpFU;+M_gcejV%Z4JK*1Bq`2Moc-qdCu%VV2;n4 zgQIp-9E?3A03IX2$s6!{1nh|w)|j!X)k@y$2PC$+v!G?bS;!@LI@bcZ8<@`qv;)w+ z8_>q!p(DAXjRVvU0%-KOi`g~%G?L-FxJGtTeVe~)N(Z$Gq(=+yFM1S4{Gu;;DuSN` z8qb|(kY`tzmpUO`Qe|q$L>ehoFp7BLq zu=6EA+p`6y4DhVBX7dodbVKpKzZ6S;Uyf%-{$ zf~9u%@UT+{-dVBu2*}^5)1txL0_&D#j6i>BMvU&1_o?>w?Sj8fU-XrWd3L2eVb?Ex z)wQN7rIliBnfVjDzp!$-&hA0k6%3_+A89UGX9a&+8SR?tEzv8kPnO5i=J#D0FSedE zUUmJF7XD+|eR|RJ8s@w6xPf---2RE3XB{5NR(O@W2~Rj#k>?>NnfoJCN1w-c=H{m? zbQ=jb)*Tiv0!sfg00?!3$i2;Y#vD~PPHq0oj1M>Chs}xH#;KM(X2#Ra_(5}I42I5_ zaiAOf=HMYSJ#?FX`u-RFt=TvJ_QKy!+M!@3`H%p3i~wlQLIO$jY@YdA&fJ$XK&*aY zH08{;{Blcvx!JyVAY-5XT2}7Mia9Xy(S^^1*3`)_4}W#k4w1wJFiarBMAG&Ho{xM9 z6q5nZ-9LhcKY?y}!3aa%bq89zhhjGrgN*}VB+W^%Zk%~r#oWA`Pq9P;k=C72p97W+ z*|jn!c?U2$76&K*lDrxFS{lAD4R1@MP|up}`~SKawayE}-c6#n7(qAG`ku8M!?nb{ zwW#&?a4A@w+@;(~-ArvuBQ0s9*}nHK1TFu>imDxkQK+eCpKkfMN5EZ!Z;#+0E&{n* zR81(VA2g-0y@EY=$N@FF!xlXEUfoWx4tue-TKG2is1+>~VE+ZX=Rzax8pp%@1}5mZ zQ@ch?Nxl`k8M`5G${R9hxe@0oS`xcjD!?I$SrKeqhO>8=qZUg7Ol)7@Q+wP=wzbFi zmld1@@jSG(69`@apra%&HK3u{)vnE$gP=%^`%K6XGKnT`MQ=uL#5dy`{Kppr0Wk># zd_Utzb`a=Xd>{#<*^0->w!b?ntCiplS(TyM!E3NzT>^ zL6y;D=vpGr%bJ31sjjJTCNb7D-1<5`#J4$^>NNiD&;;5Hf>{KZ60OARMV$7~Th66qbieWcYhX-BaeBfSH599uFOp0E?xN|N+|ox)a{WG1^9IV_KoaMBJ2 z#LVr}Hi5@3co>4A>%ZcIkaUqOC{9Agbb&XH2$@VDx5Y6r32IF~YaW|5C!Vnr*e7kU zlODc3)=E#c$w2!pKbvK4I&9kt`wl?l*_n;$qFk|dV2Q*Ac84DHtfLGb`8 z)Cr`ZIEuJVAO*zn+c{j?csB?K#eO931X5V+-vRYr*h;hx_7b#}&{4&~dB9a;;E+A}#6_#_Eu;aJ$%;yikR6PR%G@ zd_%olh7UZqXpy~gOpv!FPz?ij@{D)5<5U$NvxU|E9U*Wq)H6<%YN zih2c30G?2O_E&M9bJo&&7NCFgUa76p_g;0czWY@K5Wk9+()#*+h&SM7(K&?r}#Hisjqtre=M z%NnKyORQ_hqcgS>e zzk4seNd}w#+aw2@{(CRR4i^Fe@Y((0#;+gpk;k3mr$R)KHyZatBio@7Qy6Xf?;SyD z`tP0Oz{c{8@@DzkX)~I>HFk5XIsEc=^p#fh6`Q2Qo-YSYDX}4L6mLkI(uQP8sax@z z@n-*X+tPGPnr=$d`;Q;nmU1mA*OYQyWYTM(m6uuq~9^%R#BiP05 z*ZTI`Z}&sP=2?{gaQ63So4qHug_l~wOU?FeA0uG#(1?!Trv5tf`s}Ic&{xyKspFBa IP6Pn{8!f#e+yDRo diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc deleted file mode 100755 index 302463f735e3a3bfef76d4281a0e4482b5096d15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35238 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 F|6dAUd1n9s diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc deleted file mode 100755 index 59a9655860106e3b5084cadeff4946b0ee5b078d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2439 zcmah~&2JM&6rc5e`1>Pqzz`x~%BN{#ivkj*6(vBLeo%u5m+oa{JVWBJ>vd-xDn~|j zB@RAtpej-jmvX2mh*s*M2mTBPS*^8FrAR%|ldH5BPJM6Iv9n3l&hEZ_@6F7cx4++; z+3(}=2!Zy?gGWn$D1`iu#%5Co%0?HIRYD1sOkzp8BoP{*vKg>sT^71xDwe9NLRU@A z3hF_LFp0-toMwisupYJ|dc=zAQ7fj$BoZKVga+>t8hR2SD1(6Ajnq$_uK8~|l9G-C+dm_PXc)UjA+oGjmREnkjqaapdUOc(vE1Z~<-1zm+ zuFe`4Kb*bz$w$SxR~Qkz(N9^)S?0`Q)jF8LdA2Z6!}Ilq$*wnQET_1^i+0tqP39&B z%9UEZ0xmapja4b**O;?x*4>0>m2P+w%U;f&)CR`J1yEKABf3P19-xvg(-aNeRdgjx zMi(8U3Gk^jOd~W(V^m|>O^qhO7o@>?k{fq5ks)3Aai&%?8`)CU!HlzY8&odR!bI|s zNEX@*UvSO}4Xsgk_Lx8C+}Z3*wXtPDemKbse{6&c4BfJ(mqeM{j+3n~vMeB4;cQ1F zH!@nBM*$006@hsWb&a$7GOrfP@&GP;VXdIO@dk)h(v+IS0L^R709d2?AoJvzRLli< z0=jt;L{4@UhnY7=9tVQ~3a_sf7Hx|atP(HVg^%q8`(&Y1s}*ju>g|GAxlyP!>Wg;u zWd6j7f>Wup=~}6LtF*wJLakCO7%+_5yud5v#e(<*ny)q7kYQA+mAYZ9Bn475zv)QB zs?G$67U@kMYAg4Wy%Og+_mdEhk z*_vc&2#v1pg1e)^oFM_tfPc%~QRUVAGbr|;5R=BdNsJnfw^JQAw5d551ZaiE5oR}K z7)XvW02L_73@Pz<;401>h!*Km$OP}wi&$mOpWTu_uyCIg3EQCqa@EK56NqtBO z*+LIgHdOP{kdh}be6yW9LZBT92w;u(|JLz_!Fznb5VVy}3E%LWU zQv2?G`S6RU!Jj66-oKWd=_Y47p&9XEz>U~lxO)XHV(;=4m__IllwkpTyout)K2gEB z5bls_$zq1#MhwHU>9UD>%rHJ*E}4U#pkYwE4E*iFiI|x9XpSeqGa|AOU&rIvg#wdt zz5&r1Uj2ZohWZ3WBB1W;6Tb*)>YiRE+n4eE=DXs(9?tYtu=~U>QnGqM5`%?;qfuE8 zPxMt(`sBZ)moH|CA8(Z^Rl|V4jauUs@!L_ama5Ej)kS8S_DayMW^b6wteBf{wR)pg zsV;CV0yj8d%HuycsC$lOzlDYo{KI2IoUXB^6f3N#Z=J`m-`&?T64LSS@=xLaYisW*qQu%OFXg=*d2dfS((&It<*knYUXP8pKe&JT{^^IA oug^U=_xPQ)*mO5G-J0zw;nr;X@K=}bUT%r2A0^5pL=|xT14Y$G{Qv*} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc deleted file mode 100755 index c3ac73a8f557577f1f6fbd99303798a9f8e61f0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43645 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 JLrlE+{{ri^Ms@%I diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc deleted file mode 100755 index a6ca4e6f34a8958e5988874c6b93e50a4c45a5a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49060 zcmeIbdvqIDnkQCx5+DH*Bmt1%6MPeVih94F)Wfnw*^(^VY`ZCn1xl3oasjd=HrS(1 zJYz^lGXwX?V|K5cM)!7m=wr<;ch5|sO}gi3&rB!YWOIVjR#pfSZ8+ID**@8G0>|#N zy>pV?{Jwju3RNH_Ke~64Ke`Bhb>Hv%-S2+icW?cP*IO#!`R8}PfBB7jg77cNqCGCv z@L8)<5Z)6+L9|Q@GnP@yjCIsHV;i+u$jv%!pK**jW}KtWnUc|x8P}+5#y#quDIG1H zDH|=D@r-(AyrW)(wTbrW@|lX!iW%RikJ%m5l`~bNRWsG2)y(dk_Rj=H1I%199h|8d zt(mDEtz~xCbZDk-w2qnG)AchAqYcblI^8(aG}^?>Wz)?w;nDC+%V-O;d!}1w+D6-$ z**o1n(=pn?%;nRaGhL%yGu@-z%w91anduqrndu$vwFps%D(w;lv2J=hl^it_#QNzSGdo9j zvRXDw@0!^?y4xaHh3Iav@dFF;z(0Ss2+Vz}*d#WK;rlH`x$KGVN$=Id8sB28*e14% z9rrswup>SE^9OD8v>07t_x*^uEuIm&M+}R-_xsG{Vd3{_c^Thgzc?Tce(BH~#36Cx zmkzy2+$?Spx1zS&K5(G6_~*|v%ClYEA?_^BLEIJHFYXriOxnf0Z`nr=phxJ7U5Ok3}6=c(0}ClUr?bUwwzlWkB?7GkH=y; z$K+IWTFjM5(fR4|iD<-~^PYY6g~MZqjvYSq{Bt8mbN1n>iFnTSTs$g`Uzm>O>?fvT z@m%T1_)JthdvzWzu2b{zskzzl>746K^o^_0*@r=C^mz|7`$F54z zndodB>6W}OE{apL7ju=WVR#BYF_bxmz}~6Ym=v8AdClQaawd9Fjp;ZOzk#~D+3W0$ z`6yDepN(EeQxRk?&RoeMq%?lJ-p1Y>mPwUxI zN;wa=pN__^PRA#-p+#>EpMUoE(8%uzQDM{~3ZvGSKnsl8MC+&>v%w+ScO$49w7{s7 z*&VvQBDb(MGW;+GGqdX%)k7*^AbKW)?00zm_$AVX+GHu`TC3 zG&g;9W_J81Ao7NzlT)+NSa>`>HRIePJ4XulI%L)Hxa189sX{s)n1J49Cer$%XmIj*8*&ICq_!9|)rm;}~MG zaC|O2GB=A%DHnPs##xGACNGw}7GBThLKNfsSvg#r662S`-BYviHO1#%XpD(V5BOo?D8Ku<1-Fhn#dNw!H@KlU-KZP@NR{Ro1nK(Dw1vnMMQgb6bH;Z+qYMNCjHV-NxJT-~gM(LhEk6I&&bZsgI#G)e?K0~fe zO;3j}MA>ZY$5foSIz1kbiss@KRXKKP?%LR;=r~s0bqaX~zQBm8zf_D+%vEJcP0r0> z6g@pD)qhP=>lN!MT`^3PaGa)QSnXMAh`For*p#TxVup0hHD9N+Y&xz}Se6C%ybz6F zi$-U|QIHHb!e3PGX|yDbzBOodDsmicD(+Ban)41YcyrJTOg1ec+fIsC5Z~C(fl@` z!ki#=f)vg<`LN76`N+w6j6*-?F^(k082IG3s=reabD^O#e&Mk6@~TUByyonC`+{5mJyat^j3Jd!J!og2F*jnC)YdILzre9Jk< zKy5^?V;ff?as)Is2~u)Sx&be?Z04L&G=5c@ozR(Xh({YN8~#6|lD{X!4SosXqHy10 z-iU*&w=OiEX6ax}n3w~x2K)m`J{IQ0{=kP8i8yr;i$v_H4=p)+EIK_IqlCkM^Wxy8 zxtZwT%(yf$H+X#R;@qY|P;!I7OK%QNPhA+qZuZjL?52UCp~2WxJlc=t_{um)zrp#b z`N1&+6X&EsX=>uqAV(kbH*$6=#6p>xJ6WzGt5^WwrtnEcFcnW9%v5yA6iD$kQ!+Lt&P|MsNxg`Zs~8&_pG5-`%VahN*FH+FpFlH# z0Rn>rh6rpTu!X=@0%ZU>8@4~vHnMIfz$&kWd;jV>PBo#Mhm$)p_7HxuJw&0JJ8m9L zj%Dl}_{sK;to<9SoxL}YWy;$!_FnvCdvDf$aUR+V<3;J9{$rX8dG( zbJqUaYIEDo=aSc#YrA>f*H63XL;Ugbu_20XTlqlnjs3%TmYZi5a6v>SdhFHxO1tULUa~@A(+9H_d5;i z3H<91%|UuTBc!+<2P^7`It|>I649n|bL^w8s5@FBGH#Y=1=?}uY^Ue0Ei^ng3#yX# z|JYxk z%0xT=i@GioYGV&vz%dm|4F4|C4cAh!Obzc5J@ED33yI}X@Jpj*lh#7oVnx&w^&0HH zB6}t5(#Xz(Y(n_BQt|uguJ~4#$Y2QZ6cyD=@I+ha(;lO_(*FGVKf-65hGC_IIsO{IIp$Q+RJ+7SesB8?Bc*W zAt{w|q%ye1ua4zFejC>K)sw_h+=P~mM5`v9;%4F*GdGey+XlBLmPT{5oc~SQ z^hL zHwyP2-MzSU5%C3t`3A!DigqCOF^Jv>PmecZ-8w)!JCZ-C%znnf)40YOo?lO_(8DQm zYzVnzfm5)Y(E^DAx2j}2I4V&{D!@w`C*cJsL98d(982MyOvJeJ{I_X8GQjsEJnDHY zG{n=MFz`Crep$!ig2#m7m5TJ zC;zvi3=(|)R+RBHaletDYg&|<+`=qv`K>79i)CJ>Hd;qCV3v_+VgbfE|4Plju5iGd z_-{oSOsOSTGQsq0VmUiWJ4e8GB|f)A`|2ZSxy-;m3;E!J$0&)@Y^vbH$wfMmP|m^H z6{&JX8O}{*JX9Z2%(*o6iCl>)v(NcZ0Fxd8n5N?*6Zk_-j)~)QWei*M*{E97oZUJe z&y_MG6VB#JREaNR-{eXQB2&%*CgyL>V-)Y@%J_g_V=d=34ZWP#G+1&Kny)IrVVvMx ziMm^m#;N@-5FpkRXCPDMC1TDCPbg6i8#O(95*4uNB}uqotJ3{^uvP1}s(Fh@?La~i_9UuR z7m^oo7eD-ix-9@3vHRGQ2*OsY+iGCbH@%5k*y?n@5N!3DExtoD2|}WB-f~e`(?X3} z2&3rfa+Bt|Sf8jH7G6KS*bt{dpgxI)_qDZ?CDV-4o?9^=|QV#+`e$-2^cIkDzq;C><_B^5{%sH>l zlIRcOAr+gjNtG)Z<9Org6N^niHoKlZu?lnQG!==aV$R8x%5tSs;2HD%d(MWfdae{2 zSYsTW=4{i^StcBcG)jlQxHkVmutK5mF)Fv0ms>3%Yws8hC)z|j_2I%th~J>}7atp2 zC}(_?0nPq1#E-oO<}<+(f=+_Z8$vw8Sot2}sE89dCgtZlgGQEGdW z-fXZjFF4!~?*Jr^JgEpRb^fGHuIN-M;AZ!BW_|wmD!yBhelt}e`vw%>K!*K33Ad$( ze|$m?4=LfHl=H4P>uXGTmnLOjhvMtVuwTAROPI0uBlh){4js!ARwfL|uzVPX_i%nD zAtW5YW0r(fWPb@;0-DhGTz^1vUHkYy2AXH`X;l}NRBcIPlP#fr1;!SbSbVirm2YXV zm=$oz<^KzA8Re_a{4dgbq>5@mpRRdmP~xJri%FAplt{j&ilbTUO|8e5)N)jdPn%b+ z08AWBv)Yb9S%uQ3=l`#K0$sP7tBV-ax~bF*-Ruk>P=~07a0}XSBS#`GiIGN>$4imZT@?S=*j=1hV1(GgL4XJ%t&M0yVQeF4z_2X1_SZs{x;Pu$aB@_L zokTR&WR+D(N4Biu&i1@uan~%_@0Bw{)>D~!@z(L=VcoA6PVb&s^51Ka1D#5sbGcFu z^vIqb1gY?^*WlDJtig$zD^?IIG_|?eunJignyI0fR@7Aq683m_R@cd;9q9n-&f0;| zga@esXfmjC(@i_O3Fwi>7bDP==sgNX|Zcb$Xf;%I=HNIM+ip^dJ%45eJ|0w_uiT6Cl?d>r9qf zj4DAGSnXynr9?f;d>5)!Tx@jQM%{fK(V)%e3*0Sz$8*=i2m3x6TZ$_FcE#V5bZ4QF zQ5H5PaYGIaDS;u`Gi00-xe~4p8tD5(8XH2MS(Pkc9X?=w7TsgdDxn)i3qr~Ln zPB8Rl9v9{u&3>#N`tJX>E9pvFlJ2Ax@?Gm&w4Bk*V$ZPf0p5oBV>gynw7n%H?8RZs zd7*4bVG-PiLd)H3Fr{MuvZ>61Yf(sL(P?aD@Hd?1Ixm(aO45dT%WFgssg!Cqb7?6K zW|Cusp?wnxKy5-Ch|gXCc-PLkG_SWV;tc;S>n+uaJG5l~+_MB8aC-XKfG>f-(=_lN|3I8TF-Pg;ov|9=@4Qjd; z@E|;hHi`|V)*=dT1&$F_j8Kg2X$c6 zI9&*?-;)PutR4mU6&^-G1sW882dxJccXnpVTC!jTlqR3U@{oGt_MYUPC)G_$Z=_q~ z>UO2NJ>zL#4b~~au4LI0e@)iod+dok@*M2V1$6wdTrsQwdWIFx@WXG(p3|6g?jSO%#JZXBwf+)w@R{K=p3|!cTbD0EJfvRJ zn(kj|l!N<};J##8HrVnw*!3vbwQRp%E(fNRhC7{yUZ z6bB=i)y?|=ScPvQY_Y02+s`d{c|WRQFHrXpSA=yPbj%kst_EHPox)P{XDc%en5WTs zz^h2@BPuU@u)ERINDwE}vQSC88*^E067eY|I%>d5tr7Af989y39EwVRkxEa|837v# z7xBm{s*`1`E{uUHZJ;bR64(q7@oVu_HZ^ohq2HPrOV{CW(cdQ9J zTb%Wn2?z6WGFSp;z8gYhMzsg}V?Vux%$u#5`?}FUb6G>)P z7WtZ+K|j*84maBF_t!T7rXWhcx=hog@VoF}~$4M$&YeMY_h|tx=_0{fXuiE zf+-}^Y0Y`!=W6F9c^4E0EL-MBA{G3|8C#+Iu!8+M>pb`{5lVvb*N7zN>I2tdiugD| z{u{|hdKW3ih{B_hVSE@pE`19=3qIcP1sUoL(LZm)3-r&3MX0KMQjJrZcN3hr25X&u zp^i+bceyIt)|YA9o|;NcJrI97tGia!qy?c>JnrvcYEh!QijYH~XqUC zAnDAv3U2Qm&tq5pBUk;>5!uzIxY{z>j}cqg9x_VmWt1ydR#>-V>`0Wpp(mP#HuOv! zw+b8apyP1R9th-c(V*yn%DwX~`=Z@M6WPqP2xD&OR1(+{I%@^228TJU$o0)T(mqZw8^h17sl-d8|g=uMTe2qQd}CSB7FQBO1@aK=t`8BQYE*d2N7SWo)gtovkK@GHQJ+Lni6k{1+>7J=Ag-&MKyju_ zOF?wU3tV8KIK9hY*z)J^2x95`MPundA~}fOYUy?B8*kK7K;1!w-!C(lthhBq2PkFF z_^&WuIi*ZoVW2U??0B~1*bp$>&DJ?!-GU=@dk>FKTr!-^qYP$1jj(G~3?WrQjnKb# zsv3$Jkv`K(O!$Xkb;=1Cp4I}~Tf*-DAkw9Paw()rah)M1H{C*pwW)Ba)B#+bq1x1d z!05o^xNQjrqA5YEU|m_Ojl6c%FdW2OXXQAI+iJ!k;A00h!*q8IyYy(B3G2;kqAL5< z>wJ0~x6%}eRr&RE10!?s)B5h@FkMNvGyL3S_{Q8-Caa3!5I)_$brDs;%|#RAbaN4I zvf*8WD{S;U7>1WdF>d&_k(7@{CfJ--#}e(_Xcl}%8%*;?Kdo=7)v)YUyy3=<4BKqR z*TOD(FTzM{p|Te8Htwi%F1C`OKNp${D+>lrfhVa2_(!zRknrNBko8pEIr-QVe&h+K z>ts)#;_1t1KZgI2^=`_VZLE7>TBy9rFF8Vo^L7a@4DF)6Vn={zq_L}k))}QZL9fys zqV%Uo3Tr!Cj!#ntY&oWdIp>Z-B8J=daAyX~^_%1!CP4L<8VJyCJ6E-~J9G9p#ww1P^)*cTdu06w6x~OI-*DAmjF;gy1zZW_8zo6?3MS7D0@aSuG-bA;N8At z$&<43OhvO?7FNo_KiQPN_QTyj-u|x7xzx*~%7hhr{IvoeI9cY3bVccHi6m zr)`;my>ib!rDva9zfZ2*5B6BN9B1f%=@MFdGrhaymfcFr?z~Xpu3|v;G$s$Hc0$hi zzHRB~_dNGJk1E_08fgpSIgqe|##%9#x{-V34dm4ghV4rKiesbfp$ zesXrX^@p$g_!Zedp!f$e><0ybyPn6swnx6U^by(DtN3~|?6(>UrvvwzkXl73Q-RaI zwJFz9FkL14+7(}WhW(yYHZ3j4l|4#j4|I*ZRa&4r+1ID|`ZDbINw7f)4rcxFKeaE9 z%H7))`W?vlV=#E@h9Ocxm*IfC5yfe@+9F2x!I| z^!V=VV1qE*-IpA`^IYn}9S9pbGVGVPVZ<_D)(}z`V(Gjtm~p;Ry%}T)7!RU7*V@}b zV%0_p4+1-6|B>DrTpU68EnzKis+cgDTA4je9H`rvpI!5VP*-@GSTFGuu^uUd5glhP ziFu_5b!VWZim5xqM*$X{$YEVN0yL6A-B%Q#PKxpuE{wkI!U5fK(Hk+y>BGP%U-H9ycy1;t>Ya8z6@qGymE?M>Ko z-(xN#Zgmj~x4NK}3Dd55AUt)UbxgG@j(M4M5!fSbSIexsJhjX^-6(p^J%cjqt@i9P z)2O2VNX5wCSV|){t^!0W3Ef{rS0hR1$zqR_#Dy&kL$Gt5a$3jNj(4IT*;-D#-FK~K z?ruVe8`gbusioRm_O!tl(bWg4iV$NLkC0hll0_Th=;K}sPwxZ?MfEvg^09&kY?@*B z?dFo8JseOSQ+IRJ8XsENO)wBIq+r9=_y%4Qjc}YFU_=sleG=V{M0epr^_WRgBTnfr zD4gDI+NN-fHRmmgUam%0RReSdGgXk9t5p39_th*6aeSr9sZ>RkF@rpHO_WawpG_mX zUtzmkD)^h0#Gf3JtGkuz?!3)fS(hq#>}!4GYfW!nzWUGsDUa+sqWF$vd`DITAqaB3 zwGaUL>)+e^-Mv{~efpb^J9a+m*!gfcaVGttz9$Eh`fj=VfBLaU(fYCfHWNIcb zPJoEDTq(O7ncbYs&qKUHt|cl3!%tw$Q)mew;^u@8bqMQVp7l>Cijy&RVmJaq^-#r# z|0MLnY99?&>F1p{4eB`tSB< zJk9(E@-um4)nC7!j8PLMW-9}aD+eA`4rD#mq|g$16o@QGR<6iB2jsv(C2$byJaIGt zl1@-kHFZm!?_9ZiCH=e{988vh+W0}!_nWd+jm!S~O%Ltp*1B$VYaKf! zU#Z@oajo+ssVyiyQ%O99lI(b}PYyn>1fORm>H8WbDHPU*Oju5wb~55G;@*(`vj*U< zx49~i->e7(oM%)-v19eKCWT3xXo3378ikle+;syL7e}$8%%T&i=-BqQA2z)lizTq> zxKp~nzN*clE3R`LfNzUA7w?Gnw}iOPZ$Jn~q6p8fDU&Eb-%*_HF1};(;<5!hKW>`_+xJdPoFB-1H zF!5i!<}_%<0Oi9j1HaR4s!tKmYtfhRC2Ut%FG%m*64Hj2L?Y^wAP(U=YETJVQN5jC zIUyQ`M1H9pLf7IU zLlF*Gk3VXqs#&F|>>%KdgIc`+L)ex@E4I#X<&R_)1t^RdDvF*9Vxayr_-j@CA(?G_ zw8}7ZF%>P5AojRq>g)Dk9aWU{X=s4j!r-`Q;IC^tmz-%QkzL_?%^Cmh)PdB2<;nZA z#JVzsTU&X3*G2rncP(o5+rFrGNqrOzL4C`fB8(0y`2nn44rwM{q%c=vZejD@SRf%?0zWdfb) z7c)J(@OyCNrzho}<4VtQ*?&B5)8eq$YuisBJR6Xc+IrRI))R%R!d!`Q*m$UQ`~|)< zYnYwXQhaXkF++{}>kgR#YJ><9!rbt^#D5RBV$%1e+cQ<2nW{a@Z{GiQrgx9-%c{sQ zkqNI8FNRGLnhrW%AJnGFEk_#eYagf>+tWH;F!~pB;uA%D9JJ5|Z4Iz;)yqFZd~A)` zLcp4g#!o@JlkLT{eekcn9Dtp|&$zJRV`~86t%1Mxx14?L#~JooWd*>_s;K?_og#p16WKs44_!-io{2hda32!?6c3L#|>{5OI= zcT+{xbs=y#!+y(?smZ&unP6nu!W{rv(ML>!LLdCJbymw>stpMe@)6mJjx19cC-%7u^97|0u#on3L9a&W(ReZNjGLc-> z*cvRvl#khYv7Bvu_D0UOFg4FP2qZtv*>Od*B>h7e8FIrB6>z$8K2lER7f*1qN+QN1 z*M-B&2Vs)H5~Fe@hj(#RJu7#gU2-m6{hs$%Pl7l@PW&3MYRZC3p+{w{nX=YwAoMuU^C-}h^#!wR zb@=#YtOK&|CB^qr)))G;#2zGuNw7S51l+&+rlra6_1^1EKEGN~xAf|xiq1?$XSTU# z`Bk}jYs&K^)RCTEd2!{?&)ObL{-fTX_R5ov(V+WeL0h}8EG<8FH@&xWi4jv(_^uPlk2M#NN!(eZD zYL=h|-FKEW!8OeA$mv=pA|LMTTyX2kc9`(MQ>3taq;2754Om&11cwNf< zNuU;I5}THL<sjtu`Ig*s@Zk|T^t=*!K6yOLP|KfBJm`Gb zBX2#aY&{9QA_qp4zzE7w5lDI&dSP=n=OPU(VgODMuGAi#S!2Znc)PTS)mECsv8hK)DX zM12U~f0Y!$NGeS@8N;B2rDy-D>4A|%tEZNKF(b*ED2Z8SPnlJTa6b&%ys+H{Yr@Ek zDr)-$uqGDWCia4ZsfAmLm=zY2icwK2#vVi;ISYNX@+d(EdmZB^(Uqs!2lu$zVk{gZ zRS*69VR3xA36gz$+6Yoh9Wy^u0fr-N^=mGqoC%GW6Y4ixxL-ljg3!1&Qq>sj`%{J} zWRH%|l2S8Dg>$X=09c%Tu1Hs6pTVc6VwZ47=@oOzdU=@!CDJ@;($Hi&4)m=-sJ9qu zwC>4$ssQ_d7@giH;Vzv3Bi2Q6jn*E8qoJ}1|3yc*baKV|_d%l@k8m-q5F^RLgj~3g zWg1^wV;{mWlP&KfasBL55gA}$IB2K0UdK3$?L!=uhc8%Lu+#wj4^4wh(e&uY*nGg2 z^@rG-d94Q+wlR@qdQFK)e%GSOjbE=W)KzjNEVpb|*z}RGlbZz_LajR_?HH2$#;y@o z{SWO1n*0Aknz>TyQm#uHBgBT`qwdzeVk4ZVMi@Z~nj}N8b<={|UG>+sktN5{0&sLw zcgBBY`S8lG17E9aUNdg_<|Cq>n$U zAIQ`Xtn36xy_kCO;Q`d#7@AcT=cIo`rTd=&Kw^$xmsZL8zY<6gASx7UIycG8h|2$y zOhk4>2>eT-(l6mq zq{gEXg#Qvgx-hG#ah|7!Agx?9#4j6k!4eL4;Q-jHa?L=}0}Y+z^;>)H?8ys$_cjQb z@L61`RmRr>LZV|ZGjvdHKS(yK zsasfg7AI9lN!3vTbyX=RbcJf`m$tt1t-GK$EtPfPJ+L=sJkd&hnGFZzrh`h;!A#?! zpHF<;`H!#s)fKt%#Z)P$w2nMD{;^XIol-)lQqE5b#8rVJ%XbOYO+{^$?-qPPl|;#T z)Lvz`6fmZPiAxab zIvauz*E#uL&TP6q-kGdQRww<*Kr)!DVS3h{MaMVflGbjw&skwK;=q8jE*o{;0n< zPFyYZfpo+~3ZouJUc;DOgv5 z5H!2eS{s<&q=Hl2oy1iK(P2F!-15GLg?Z7oXkT<-Kj4;nZj}}*wLvt z&Ti}^jt+gMo1@}f8EbQH;g@-eh#4dF1tN<*U~S^z3bJJew$(z1%5ot$eq2t!DZvoz zJ7~w)Bcz7~Hydbs9O!x!=voe~9Lsd?kpp{`z~1DMY()S|k(apSDQ~uGK=!mJ52XT- zG1ylt@X;c>cVo7ujaI7-Prw#?!(wMDpKzLfEER{{!hQ`$4Y;^-!8nSiusY6)`ZmDd}Ha4Y> zWU*Slls>XNoT(W~9?Ndtog7(uE`2>yzXA89AY}3s-+1?+ZtAymY7Lj7QadsN$#631 zMRFqnx%2{o>jZwEz$F4S^ZBV|rigWntWyMthUABs>&QfSi+z13SAupPkH;mJeWcdF z=KH@X3^CiFLOOdx8wZjLcneq5jN`r`=t;+*XvFVRrrqQf}A`Bg&}*5yWuCB^8#Lf&R;(}{PVV-$Nt+x z|NV<+GY8KqyI*3SUju9u_8q|0G1;nmrK&Yqf-Q-2dmg$Uy1^;KsMZSFf2z7D3JrQ|DfVO_{3kobbPsVWmxv_Q2aYG{u2+*{d5crL{bh1K&wJI zya?E!bIx-t7doNru32SY3-VsjGHv?x66bqC3|0N1#S7Gd@EOenvz|Fyj;vUatfc*1 zplGEKX_BgpwQ3_P40`D*d#-5N;cPqPKs(5V#-mu3Nf%bTxouLKo6*)}eqS2|BMe7H z5r?lZ>Wx+mcl@Vt&AEva&sP_ApEVtTF1prA`WFbeP-|EU)Prm))H zjoU(9EzqRdks4pBWkZd2Qts{9iu$GTM-|OD7{T#-H<-MwTjly~O8vH!D_a3>t6V{+ z7mvQVFW0h*<%#mNfjO(SE$cabuXht?UT0|^q`T<7 zt4Gko=q~H^H|2-9YG2qubCsxPRj|fLW-vqO$|KHb|m$_(LNRFPAFPSxPn) z`N^)Wu;w7!i{l6oBEo`s{Cdtu1fi<#&4NnhC`8WA0s?}AbPpNENCnS8ACQsj zu>3JR76K}kF<#JZBKr?1{zG8cxWQNgz+xPVWI_=r zdTo0!{L@o%=!6nFftxIcQ|(z#FnJuyqNhQ@2U9%_#dbJ-5^TvfM>3ubzkeuIdh67k zQ^`}yZ!nkb2A3P3I&3u%T>|_Yr%+aNyDxP^E^SdtTj>5HKdMpF$}ci_KVn zt)8P%q+=4^IRBvNWD?U@*732l88y>wPr=Mqqb4xIqXqeM%fRz7uOv7(f?5|i48(26 z3gMFK5nsn}F@M69*0GqDD!o6z|3|t5@Tm);uX^3Va3aYZa?y?S^?qM0HRiTh1{+Op z_AGi}(>XhfUf6V=&0;xhI&WsNB3`G(0>`ccwfGsd!SKFJ3<37w)RL*bs=xmW`~y$( zpR}nd1fLc{_1F0@PbmTIde~F!ujfE`d)*Lf4tm{-Q&9c&UMcpUv|Y48H`^<9@Q~>S zEhpm}D?MgbL8x1t3g;*#-26Rj1>NC8?=)&@ELLI^Y8K&kw{Zr=_vjvAYMApe+lGad z?e!gudZ=Q2wCY9wVjxjHXGxUZjwJkedv15#io~jJb%C`aTqgA)_9UtjWyFHfn~~%w z!eUUg-|j(KYY@kJt4s374`?xPo~}hRn@8{MzS#z}RX3;?)GASi8#tOm=s4|Z* zbNO%gnP$B$5h&K@2L<&mt6A-0Xt54w4O_J`7~lA;M%`t?lk9=H-C*v}%%T9FPR(}T z@qrUPh=2Yp)&m!IX*T0K5xU&1*%S3tQ@H4O)m)=neS{nDJI(YRKFD!KO98s&J@J;Hs&IhKzF{T80VTxd%IV3#a}6;X)^0G$T&(0;{~7l z#m9c*qlMU_C%)fc^O{mK=JEw8PnIS-l3mG2vKLpzmcQk>-3fbVvOC$6?3;9m6MTYZ;@v^YpnACoi&&Ese>9H;H7`rPUQFQ9HHD*tQd3ty1Sn5q?ym)8#Y~%~d6+*c%ieL9VJFh#H8m>i7 zE~yW_&;v~LMg8ml%KaOhb0&h9Nduidi|xqm%|tnBS`o7*+NJq~KQ@bz6--o_W_b}F z7ps|Ej5r)Z>>NsJ1;#y{sQAJX2i7TZ1*yNRKQ3q6zhHz1*GaF4Dlqq1%64ZL>Ks9T zM%1*o@U}3+ueL&J=aku5^(HnFaRA_{=T;y(DArk4 z$7D0*#_trdu+5!zdWA7^*dC5;>1cDOac@+HKEFVhf1qMO-Jq?bJMt;WE3VtFDUaAf zbmeiV^sjyGDbLa*)F!-@e|YLP-Ff_4;k=3#iUlnKT#>+%v(wkq*p3#u*0gVBCz$ya zp421K&j{=Sz=;(?Hm3F@Ov&1lhO*w8(1?GQf|S~Beq*~O5MNV=r@g63*O_UVd|@jc zwjmlVvFiQE4LdRoJC--UeEM#MRNT zF@>ka#jwQ~S^GRKe8fH?*{R|i5hv&5Hy=i9IXAl>Q83;Cvmk~x)#TvGl2*TwBb?xh86$H)d!b9?vU$WQ0iaE z_+Nmi>v2urqnf_uvnyL3^gN8pH7Ass6B*wL&KNcJ8Ex&@Xt@K!yAD-fem`S51JRHa z^p+zHzqJn#BE-yKrRwP==mz%^ch7d+>N_ zZx)W@y+XZt17WE*1rHtC*1)GhAutH_=PeLBI`aXcGQ@8o$oiX7$8pRWU&^^x&c2w_ zvgA&8{J2-H9Z+fqRzh;^&QINrK=5+`07E2DhbW&`x+@{10La_499Ukg2Xl5Bxwy*R zPG3gia&j7DIXjJFQs)Q2AdYP1B0GjCW)XlN4S1bQrwObQpdB_oDS7om4EGvbg+e}U ziTNiSFOip@*mCpJ<6!2oNg|G2n7b}Dl9!!6ptauj9CL08I!2-ZKDAT*gqV>B@-nj?ie#LG52Qb&vNPG|H_6mQfQGj8mjsA_G%Oml zUgSI~$B}&t%)s#^T+jKTZZf?TX^X5G|1ZN zfTTq8id~kNE2ZM8SgF65fBH`-W%Wh|7GI*S%6YXb<+%`+fB%KaW9`%dITtid$5{Kb z{-my2w5+LUye8+^i^l1_482K`M$m6gcPQEsPT)ER&ZheqoaKQl2zZr9LukB+yTQ zP1b&RoIg*q^$Q*@C06gfmp(=`?S3wmV);LaJoy}qG%g)BNQiNBM3a7xdugV7`^p75 zxI+oh3KC85b;(+rAaTe>;^XedE3fjX5(SG|A^9mgk67+`!cTM_@6h3i+TJI;J#1fl%;vi<(1&mg7e}~+s$jkh7hUDcg~3gkikBX2 zR(3s)cQXFCqWe)rw_MSqRP}oDFM>Gh~%PR6h(A|`G3V}vk0(SP^HkobOL`H0-SNon4+@|qkxs05)sss1QTIsN@=wZ1WVVwK(9 zfe#|80{Tw|w*9Q)W4FBhw6guQJa9%CIFlFNw7APYv>b^ZK1it4>JKAhC4t4G{H_9Y%v z0mA8}QTBS$&~oqi_fFh9k#eWps|_7X&t-8S@MOB{L0P7EWO>WV(1$ygcYGX>{ihWF zDF`bXvAh7J+|W7g?p@xxvi-r!a@S#{>oA=%YG*+9wUNAi>0Gv@`%jvF)Re7j&Nj5( z8{wd_?cP|nzB${}t~3qgy+Z4TPlb|JBnyx#hm<80eq7u4sJ4$r(y6S!HCxxV6v5XZ zkIQv~O5NZ}M6TNf!9u7Xr;$P=k`Gm-95~+swb449M+$s6dVf@I+^#fkPnBkUf%iP$ z^(^5aP#b+og#A7VHE?2iWeeVN!wv;7v_lE)K(pE_yeBPBf_3k2{z=KbJxUNKYsh7_ zZZPj41L|E{pD$rXD7`l3-ON~udGxOM{hpa8w# z$p@D{c6@wI-uSYz@#TCCqJBz5#peWYJzop`-8zbrCjnE&CXg%o2YIi^0}qe=)rj168adZd&UHa_aAoZ;%Y|@9dQ@)SpfqpDgRFs?7C`D~ zwg$3&OQ0>=)Vfqke@`~=c@UL14=bC8K`94t2Oxl4y8$%Qo^0EOl^UgON2Ye2U$&XF zRzf}5*2vOH`umldc6+v|ZK;g@&{Vw6sgZm&vPb(HOJ$={0iaZo0V)-)@&Q=#J~Lkw z#*l8dq8h#8ZC-M)SGt$I7@8pg--+*@NC$C_Y$^q$w_ow^f7pkXGTl|kE-X}UEv#wg zm?vA;n5i2|xBYl9`8>;^!rQh~N5ir$eT}_VkP&P^PI+5-W!q|Fciuto{*5>j7WoIW ze>VH@4SDOaNBze#{l~KKwFv{yS+f1xxB)n*7F!V)XwRn3rAs)U_=6MQKY@Y<9=y7A zLT)&!G#vf7OKx}(ADD$OuelEESThP>3#|dALUY&CQfNSBDJ}rUBE{7~VL<-dRa#!G z?)ubo?3JymOLZ@8{=vTQ?^}kl$3~@oVQ&pAmdSg2$LMq{vdL7Lu1MW7}<=S zdk>>M0AQwLE+b$kFt!J=+POHpjZEanZi9>T@he4%6C<4@FhYQlgb^~GB5;lXr=yP@ zK5*{UF~DJ|oLp(gBat{wY9YYLNZUaW&@YmeBs2WBFBh4<4Uj9t$AV%px{r2Fl)gjG zX9y6JGUvo@h>rOF9=Rk5FoKu3lG29+yaYr7-y-mz5%|vu{5J&tE`fhZ;8g-l#{VzK z^v48&mvY|G0_X9lhC>PArAlng)!yY(q=7t|?m|&eq@) z$Sv8;+p~Q;*>6L(cQD&Ol#L8!dpBVf%5U52z-Nawuv%3EEl}H1nNroBcaSSSgIK%d zQYs+0CM$@ex}|Of6WmSKQu4LkS9KO$o$W$i;>+j6AOxG1rj$T;evqsifW6ahrKTr8MAnT$ZC8F1nKlb`k^B}iZKa~IM%^xymgjen zo8G+KwBIT?E76jj=)MjRGU&6sx5)txp9aj`K(09b+?FpPlZ#r*O{P+6tuiussI^!U z1)T3QpQGB+)q zr7%rtT)T@`0Z{mAH4KGEvL%kd(nMass{r(5$+b$&y=iGvAt7ecgHawXmm`pV6=>8E zSc$RMgB$Es4E)WGdRm=q^zPlo-mB2BaKN4y%;2C_^~R;ZQVfdA)yosm+EhXtsQ^$8 z(SV^SjZ`u3Ti?X)#DTBaV#URKqEAJ ztUj8OZl$6%UrAO>vzB}{nfwB-bqtUR)2uCDL#A47{)Wg_r_JAbvNdS7MzS?&A)Cn- zraclXb}NnYHgeM|z)cGl0a&V`CGYNc41@A3z|~+=rg=~aZpb^BBSSH)#3js*Bj9yv ztWrw7tPs_hO#Yh|yQ3dufeCo}9k??PBZA&EBJf^y*HBjAF`2o*D3&Yi&p9KxnD$?yGqlnR^D7#4v$FKB=U3Y&`LaKdub z;;3TTGsA{Wc^fnAIm8XC?#fiho#woQT=T*jc-rc8v@c_R;6>8}uVUcqbkwg_*5w^| z6Ao$3mypRNRMzC(WI_W6@?~Ta%-{t}%&N{UW}wz#hQrT&-1b+fI9XW3k|7TU{?nnv zRzX?-!83;T8TemgxY?5^1+d;KPDkgZV>nX*Ztx{6$#8PSr*M0@`gv*f7W4(*nfSOA zetBGqg-_1Ci4RpTRGr2b`Ji@-F9J^EcrhKsXY3TH+K$s|dx3z&vOOKe@#a`m%#~eW zY_GA28{@N3xCcCo;KUr^%Jn-bxZ~_p9NZ^-2ocA5k!za;OpsF08sSrulT#DmOI?(r z(OHl_j1NX!!3EE7bRxWQLm&Q!b}WST!tP`rkUEX~^hvGo%#|D0#;31P<=S^_+1NKU zw4rb7jtvW*lQ>LKocJ)VFE#HlF1WkF;%} zr4ab={6P5J(9jUi`@}d7Q6Gd)Tw!;~tLbfJ zh1j~#aC+_{zHN1CHo9I(w4^rkr1*`tj1V*lj38p<>cS6Tz)c8%+LK13u6;g$Q$ZQZ zVvb>58y<)Jz=_hHM3DlRnQLB@+Ly||AhfbG`Znj7#}Rm($B?dKv=QGEBl$1zGJIm1 zpDH2!i~q_7kL@tr6rOmh|M2APlU!wxEGKTCct4ch{JrLT&9Wz=c%W1mF$GFOw~$Sp z1@B>Xj58^TbRG#x4*?eN#mjko*kR9E>1y;BB->eVF@4WHTQ(fY*~FS=z?=sU$|=)pR(wBeW3#rgASVP8S0}?PCPAGZ|o908Q+rS_N>5>=W=D@czm3Z z-_e+aM!>;q0yG?QPJCYg8A>35ad3qIBiY$b0Ln!wkx%jzPJ}b+pY1njW5B;#;24{p z1CyHZr-?fZ;RRjo%Q)`1dx%}9BLygUkoht>l0*`}T*>9D^EZg}uVpq>yH#S8zeq9a z2+)2a=bD%1;&V8z#lD!3D^Z!hjAhT!1!IdhQv@0VQkXysfm;L!!%1xf+6iM}xT?Jq0zXV&{=g@%mzmlZZ<*863J&W!n& z6OVQpZ~MR!EJoU}cd@EX4g=AA;oxU+_Eu^~fx!-(>+mX)Q<||CC%m zFL(uqJr>X+>%-)UPnpl>M*opo!R|>eJhFvkTPSPakTL(V_T3rtZ`IzIG5=QGYd3gd$4a?UaTx4EH6xWfA z>&U9h`-k4!-mIrC>%q0(bvUd=i2{IP1}H_M6d*O5>D>3QNp`)UxL(M(UOpgO<0eyYJb7PzK?C5~%4wl3{U zIusl&po}sVy|SxMarI?feP20&+7Qz8s_AT%UE37bwv20=USf0go?ejpW?mpudb?%U z9>ujM!0b_7hgy QKegIVI7|Mi+XDFi06~42xFYkIcn`GlWjGIXcO*VCQ8v>{eON7#x{-Hwr096%2Edq%jjxd!O2`N(fbHxufN&u+{!TIi; zeHa(W?94ac{q8yEo_p@xnSCvhh%q|e{r1b}4kQ?R4~@nV@yVSojj^lDVwP57Wi79j z1NlH%&+8hq0+wD1mP7fFvX9j z9}6%$W<{*%G_yLcX@s$B+VvpW(B<32rA^%Gq~3(INp7&|ls22J6xnQ+Hd{8>B>b_q zl1*CLY};Uylr~+~cCy(aZFX+3*<|e+XPIt+^fI~^94^*eFFICri%z9b@@y~jp5a0r)1;q+7&k&iy3tE@#)$T$?hX zMgyM795HCfb~8C@wi#f`;r2ZQXg721i*80`--=Ulc)3tA_G3lPd{8DxrOzl)x8Y0~ z4;#J%WolPyMR!gGthFMZ<;Ce4_kTs~H5`BC|0A~VDyLc_D{hQB6}vfS6wY-FZddJs zyCIRR(Qi)`W=n1jMsQR)je4=_;vDry%~X`HTST^#@Vtqnh9~Z zda2eNOj#c<)tZS?coc^50xgRYYMGE1tl6b0j@`mL0rcKtJV{W)EKyP8{d{i5DciYn zfloTQN1bWsaIR3T<}TQk3%OG9Y_2-z&N!9B*+YkNwBq)`Dm}b~X}gxI7OOdv%q)lJ zcyV$j=la{ll)EEao%5omS*#RY)4bHRZZBmUdK$SLBUoU6O|m@)Z=72(9=Q@+jrRP} z=xu9s?|to*Sdr%)iop10f=m>HRtja?G`*NmEK(s$!3^sGwKmZqiplG#WSm^J@pRRj_eQ=vV zCALqgPeZ*4_%i_w^)~oBfS)SiEcoXD!w@1Ip8No~&U>N%9#DXK2q61EMvS8U4Z;Zm z@fRiF)5bsD07~m;=zJ6Ka{@WrBWN83oP?x{x4@4B29RC=3syg^e#zW6I=r z;Haj++lmA%i?~L>A5?+|;YSeQOfj&C91+F4U^7w`cuk9M0?rZ8=$F91LcqcJMFLrj zzeBG;nunx|AqXoFum&`MEX*&Vo>#(Y@Yeu;l7cAGP0d{;sS5KOSS(5lnY?%f!W&W$ z8M<+-jf7=gE%>it@hezhlgL_)LV6OCE`Ccl{vw3D6jaz7P`{ysFQfA(02G~EJ`esp z0mmaovq6R&dyIcw3Sx$C;#COW0z5}RW^&l?5*OcrK#vVK(0YJ?mmsNEi1;dmK_$r1 zFGD~<$pS0Mzega15)ANO0zM}Nff{p+(|A#3!6l$;G?Vhe?p&4r^0j?7Le%3W z)n8ck0gqJGzgYE^*6IHf??Jp69J=}kKGXN)@Ps)r@WjZ_Xy33oF*qK7_{3kl(KNqn}b= z!DD=xG>xv>HNv{CY1$gwzw+PDTWsIT`g4taXl4C*E4g*? z+L6r$!^BMm3R?~}Zu>|MWYH5k<7DZ?Goxgk8P863P8YXk)Y~VV!|aUDj;8Tq;I-iRH}hY+@X_}zmVZY#>fux_ z9$s=-EH^EuEP_R_j#&ojY#XzV+Xijp_CdRq?(Jiaap$0uT|35H<0XS7?Akfz9`_7- z#=V2yao?bC+&}0a4-5vzO9xBGgM-2G&|ql1Y_M#+e6W1HVz2^nTtdlMc)W73l3lyU zs>Z7atJ$?@tY*A+u$EnW$LhxG2kY6jZ>(Xwaj4z6X_ju|ZEisSi zN7*XIddAlet{;DF@Uig?gB!*-4sOJ^;lWKpWo)xhwG&MyR1a=d7_%Y+doW;hXI?%aazN;Z2Ls z7z=*Ojx_PFq`8B=Yr?zw*lN?eov~d)^Fhk$_evbUt3SGCmjV=G^@_yzLtos}#=n>ZcEtKG~ z&ryO6!p2{|1cLPhV9g0j=cb=fzaHzf6-uU}Vq!EpR&a?iVR|^$X)V~#4GTDVM-#E} zbFoAsCU*J?fs?17>L2Po*x!5j(6J{A_I(qV3+~?N*jV)JSghda8y!v*+=uWjzdte> zPZYezqT?~)5qp`&KNdfh6568yFhQ?wOg+M%(7-Dzv z(HZ*Ec?2=yxTuIH#L=mt;mL`FI5~#1z#jYi$0sk0J{uKBqZ5>?e_(p*GD>)K^wrS` z%IRn<8lM(p<1zNSYDtF7QT8GAJ`j4!mKM7etS16$Swx=t1y- zwcv=y#zx|lR^%5?tv`>Fu16JyC)W>5o}1jXJ~}nE{!(n>()zK{v+FVL&QDHk>e;Yi zeH_zo-Bfh=V)R@rzJ6+SYW)yC6DGy=;^^@C^{lc}n1e$@Vr)tr8kz}EL3-5NZOAX) ziQtMQAKaTx%+KV4d-2PjeD8UFbtnA2I(|i=d+$ShY%#PE)t9wVD=uzY^ev=sor|Dj zES3|fD*y_wI%|ZDc*^T7ZpI}Qm8P<;sQi|OR=f-W6}95}tC_Z2Ywrcya_%;fFnqx^ zIWmGdJ*+i99%|k91Kgl!hVHwFXJ~&%65TptJHg*-oq3TFV7j-K7f{Jr+pK-okx+>< z#8281>inTQd(vt|eo2QB70o&gv7N=?gSh5zT}fxsMP=)>&2*la8XHYSqLDZ{kVbQ2 zGO{r;B2JFu*||~ldW5$?&#_L2ZhUp2SOxnyU{r~?i7LFE0^|6@6hNXI_-SLDDiq-d z?-RU6-ZNe{cG&eEd=kHe;EH9@W$~A%`{oDk`I>URrhG+pCY;`$^Ec*wW$Bai&)@Sk z=6sFC#}67JlDjtLOvTgv_e0_Isdsy`_UyA#L$}<}y%3W^o8{2vl#{)hKaE$Xq)?X} z>Pk8D!Eid3O6J`4tji5uOM17s41-6elnHuMH*AmWi%i5`iKzFHS4I=(k>UlQ55T>tNk9gGy&kPt zA6P{i3LiKhISS&`hOAD!*B#?%h8Yj*bh1kJ{9pLH-OTy4^3F=+tpf6XRW~?9oxL2H< ziX_gXFKNz16YSbBSBkCuX`Q$)aw$4C9gCceC0>bPvVE>z)Av{h`X)YlcIM$l=8o}-qvy_pdO_`Gf~5=@U2=>sFX&kDOuDx0q#r z*#ByRW|r1Jm|}Fz`)8s!XQ&*yX|c4USV`5%woee)$d8Uuvkn8{YZHxf!z84^pi6Jr zX{L4<|CUV(1mZqayi=J$2XJkIqvnosVX`9A86PFr!*50qElz-#b&$Vo(cY4NfSMKm@{YAR$Jz(J(kla32EI6u zchu)S{woKs9Q@+JyrVYn3#BX4v2>m6Ysfk1CpjAOj?P7g)w$1_S+!`P^D?2!>TJ)n z(TjF-;PN>eGQEoyoU;83tM7E&eO%tSKeu+j+{T}>SGu6i>)e*vv}nO8`#3w9gBrhc zbGBm9g4043JDG!qfU|}&#VLD$ogNwRrlSTM#=mw{DpwD`?WW14QsG2{p97)!P3xe; z0~%cTlHg!}ptkYnx&@XEC~tSn6=PI)k*XFvF}L8=-TQFw*WCwV?wCh+Uy5{sc&3jN z!o4r1i>3R%OmK{p3*~Q?3iR(&6vGeOHMy*%J%7rpU zz1QHrLa2^~k%kAHtd>QS%q_u@d=eP~=x`nTNYA$utEbqHz75Xs>H^iL9 zQ9#hCc!yS_5xCJfLUr#CQ0{{zC##CyhFk@VFKp?l;td zCKaA9R?2;xyBV3DU@@^cz-K+`W435+Z7r^p*hi5L#u`4u(mFvIzGz5ue>6^uc|4Dd zpinEPNXut%Uze6lVarCw87p~vq;)Jdl4$LYv<`#c8x!ejWO{6j&TKK(YAp4!$qBTB zx{knNnlW{kW^-J9qvb=ZJeE2*yL85CXmlz*8ecJkiOHc?#OPF{g9v&LK}#uFS(^GH`QEeGFw@{*tqJmrP=t7Co zBaHD`aI1waxQ1B5g%T1g{xiCo!qSQxrT)0b>-NW*Ney=Lh&{ zmLWB5OA<`gA&2(Pi93yDnsniga%V@f1a}$(HR+zRo&)c02umP-Br4P^@a#OsGT}QW zKc_DQ@DxO1(s%mAI-JB46cBIyku50_tE6B@yNjoB)#>Gou@^r*BDH3rG#;G*qhTf{ zu%3@oQPlYjPJznH9>qt*%RWhfY-otzrtxij7{L|G&uc7o>lRK*wHxKyjj7UnRa>sI zJ>|IW%~#g3)5dK$`SY81;uOeNH?g~lDxBQ;nh1N?x+dGTuo0KO`wh+6QmJ9R+_0X$ zOW}_#Hw_GX>O$7-w8keETv4Q4{gQbAxLUsH~b=ckSQ*EgFoHJkK&uU{u z$&h8bmSt+-?dfDF#vWFSV-uf3tYyo@xD{ISa#6vz@o~Hy!4(Vfx%%dhNWm64*phR% z{4%Wp>5Ow~EIK-|TzdfP=-PwbeTT9yw#Q7)UAr_}jSsr4WXWcdEb)77w&^8HuAKx4 zAXdU}HzZ5vsHJFV^U-hWLdNIOnv2VX?ofGEA<%)0Q3T&5Dd{X z`neCV>J*%lVAqMua|r(d(lkSqgjRlwC80qFi)F-S8nh~-W`5_ zbLNcX>y&++ix#`5E?-%D^YmM%Z=9JwlRA+1mw)x>wWFDK$sdvZk(@u0uc%EOy&r7M zxf}U_(lw}s8iGwQ5^Jo~^v1@Hm*~3!QZUN}t?852;x$)WnGE8+*5r7vUGw*9vpU5I zl!7&-_%dB-qw)h=vF+kieznP5LqoBb(PBOYw9w6;;C=iF1T>LrGwtt(rQm8gxEd@! zPwV}PmYlzZWPvl8Q@76C3wGp!2NzD>K6AJK2S@I$JD77HT%naxNcFR~lIVfR!E!-s z?@MO!gf*d|G>gU9!eS}fNsDPtg(+Itjvau^jx`w@f~>V@MvBwa0{UhGkC!wP0FA)J zohefqtN7@jQiLZFsAKGe>;1Vdt5nRTvzhvz!ImYF#M1!$uVZg|gFA+KqUq$e?^{VBn z4Pz76>T%7`eslKXc$(9#<5M=Yw@t9V>Bbk@Ebg-y!KPrlZ8yoJtw~b%aU3%gssx#{ zLOp|vw^1OX%wAl@8qZ3C@T6_dIc$5?c98)A(Ur7v>D?bxOxUcJiGa;A=YWnI$?8y; zqK@1R+x0eNXA`MIMZ(kK(+ECr6>L3^nItNptBFi!jTfgW1`r#$a)m+JUwC&CxjsBO zKDB#hn=%uiibNVoLqk0~$0moPWAWWRc*IDwp=hG`uo(4UBGouifS*7jV{ufM7lXg9 z>13jq{(N;^=Gk0zH-7h6n4RWl{tV%w(^6RnDQHXP>8w)NO?p_(`~@k^1tyy69)u1YiQpQ+~moKlG*_~aAR z^M1G{)ek{aJ`|q!W*(PAt&288&5LdDVBLn>XBM4!`%`M1pRpG5S}Lm-gYIzYPb~<3 zMnS3%LSZD!g;cCtXWALqh;yC*o} zsA$GFG^7oYnUJ~Z{uz>q-$p=V!RGVSyl;n~$Wyc6Vy8z2Kd-a+tANloVC(f9vgRwA z(mOKKQboI5(Vp|SKZvyde&Cyd?+o8*``+3QCT~wlk==4+Hy8YE&V+%=(l1}ToVuK^ zY52PDYrgEMg}&@jsb-^GvoY<=S2tvyo_{qR{JGmw9mz$Wl&TKORR?n+1%l+QgW006uTx+Hj2#@C%sW9PF4Hv0UpJ} z2(bQfSwb~Lb4tNga&T47y^14keRXIx$Vi(X;3***Xh2)Wt+Q4uU=pZ69b%rfgVl@G zXA%63*rEOEe3J+p2B(mg#S9X^X@#=dr+ks{QA~aSqM;-oYGo9#iq+?M!#e9oIit!_5c|TdWvxKzkLlz>yd5 zgdYN$xTv``Vt>|h6NB-3n5elAYzIigjUW@cu$m}0*ij(*?BHD5qot? z+&$C8D$R?mLsIJdhlmv?r12l{cg2zm9Ki2RTPgwCcMGG~O4sp+`f%w?`ZZMUq^7>d zxGTR+CDT<(B;LlSRp)2s>h$IUy$cCc=haL&lejgLD_x5xrXQ=$Nvy{07h{)aY-iU0 z!usMbtYBQ7@ zf})NbdErdwtHmK3@?|x$|Y!^NlH2e)Yyhi__B!l?)0ce{1SM`pL|x ze6TX(z88$-f{}cvD(y;NN?*#vvIiHQ%^sJVHcQo8N?7^c+O1!s(uvPi zz~}~^_Ng#XSppK|GlJJ5@T0iDevt{K%G!GwX~Vv;xJEAUZ%Ccq z$VNXYPU}P?T54+VEtNB(O$XwHuab*(OQ+L`wn$6Xml4?%LHK$U6d}K{3AiEp$EuD03$~QFAxi%kc$hjLB zjQR;ta363ur7OEpx?_MyL|8G1^vAd`LL|KoxnL)_M4IA&Hn!W2Z3Bg?Ee>B(v^N_&h8Mksr;8g$dYGc#4qM6{7Oob@GrfOf9vUlpNUl#iInvln8+ z2~~AnA>nl3Yu~XGha#Ll11N*_jZRtf^8-U;LNr0t<8KEP{yl>xf7_B|>Wp6p#8Nwz z&Z>0v??j@k0yf{iiTG$=j0UVIp25UfL5RzU6~n3nlZ3B2>Tsd0I$X5sP}UYDnuwEg z%hXi`<8x4SWmUlm@D_s2Jq)m6(J{KrlHwpix>m$fmJ|)WxrW}XkU5Ey>Brz#r?cRo zq{Icp;hg<#E$Fa)EUP zW=+?Pb@S^|C7^Y0*1uKH8)4zxA546E;_gYQXTRLDAJ3$QUKwFouUyuvr$Ilk6`{H& zWv6~2<}L%{gjQ}6G0E5Gj@wovUzFI>NnJLeMAyEYhck62FoJ+V5+ZSshva`HK>f>5tssC;FwGv6j;aC+f=OmXKt(i?nR>k;8eV@7;I!5^ zD^h8!x6EV0*!xPO5f25-S&or)q}z8fBEd5$p-5yb>w4r=FZfu(ib@16srXFh^Vr2- zDobI0bC_l@v05;L*IKIU(!-gyg_64+xvE~Ns#mV+P5JWfijUp(_uTcFe#zY`v$b+Q zSeJ9xalll<*WX3T(MVGj9MGkTLWB>4&$vjmlm>Z;N+Pn1&JX_*fi^waT90TdOj1jX?^|Ok@~eO<~-t z`gt5==$L6I&&M=FGnm^%#dFgnAdg4l=O?GfU^5p}*JON1#hD6MG?E}&?_xHQE}rs= z(1VSZU#qI$-xDCfCm0X^E3pREKqJ^Us{c_l5j2Q&kShYNG729BMlHaj^nnmXV8ANC zC`LWWiAkOoeX3-tj@CgdAkMqw#ob915d~1V_CU2yA~1 zaR9a-w}dKEagbFeLTfQl5(1Tl;Aa%19E%}KdDVP<$_3kASo4N!$@Z;@1*tw#@Mz0c ze#f5mOTl$=a2+%j0!^Hon7HAe_owmqfS8LJM>;@%d0&tzf`G*P>hWvGGkuc3MfNL7 zAt@h24jQOOQ7r^K8720+xG*VyJW>ZuuwJA%7O`EhEw6$A*$-NSA4Wh-8k5C$koMTW zY}<(s4No1lYGksDbk0On5gZ#A(Kvx-KxjZr1u?S~2jhAlWAY2ABQas=38W(uO>Wjx zWBlwHFZFg0Q)GLKdaoB>GWnZ7NOFX^J=gbSqW65wIbU*<>?AVVL2&xEO+#bX*_xG+i-Sgl`BKcAU!=Ao3@HllV_4 zcnLwl3tewTA(%=2X-aZY!a2Ow_vAa&lds_+<{|9x!z3xV=WEINTJASKcBe*a+%7k6 zPaVrQcI6tn4P98nV3|RcF$YIfI33cXz9ZM$~O$Tc6ham)J4O2*&duWJ9!6h7tfnhhyY;?)=7lx{E z`2tcxRm0|5*DzgYQXI2n`30n|GzRYYvZNEh@vr7 zoQ4=Lc*75+r@hqEyfnwe{}!*nz+|09WiZIU%!T@Z3RR7-SfL=q-$#G*=Sf{Rg+JDM zY@iqlsWJZu=$l}b0jgj)Ym-Aiv~le~RCeH68{W9qh*=P~AboYrLQFR{u#a)1g+5Y! z44C-5P>-bLBq1P%DLc+iCzw_Tbt8vU#DQlm*4ZO6R93>V*oufsRjs6PUht3-<`8p? zLj9#qf`a$#Sajkd^x&p0&jcA%D?a##)ZBaU^%cvH!!>z-Sso~7Z9ZHxe+1f<^Dpu% z$kyEK7My@e;sjI@C!o@s@_-W%s?E7;mJVvIM+ohidPE21(Z0WQe;_U`McA>VZ>ZO4 zvBD0BpS5eK+SwG4NMOl6)2#I#H4zcoY;CWu0eN>E>-6ycpr&4V1;u8cI^h2qJ~s^b zNj#YGux_C2{**d^=n$m?Le~dAe-|{bx^*$-k=-?!GWwI;_4#0p+ACadtQ%PjYa<*t zTL1hFZV1_kQ${Uw6KZiJp(=L~-=g|XFwku?xB|klU$G?}&~AfnhVHGMy@k$O(!sUd z;x3>P+eOqC@zDcJb(Y=HljSJ|y|N-4$LLX(V~Ix#6L-j1dY~fYNdKMo=nS&m$G9I+ zzLL^&L6kKYsala6BsLfnFGxiibtzl@QR^*@jb| zic^#m-1aHw^T_)0|$F^#-tCSZ>llV$8*Y6l^#i1EJ1{FoviY$=*c+gQ&d^6o(NE@X@g4MnEoZ z@niBCA^szLpx9SXAAsNTFK9*)&;bU4o*6tw_&ojA`;|4B@Qu^+r=ckhzc`BGSW~w0 z9ViUsgXO8$@>LCKJFe1CUwb9>3hpxT8)Nh&oN--yBlSjh)k5VryR+Sls0I;z{qV>B zrhERTcN5wE?`&GQbSEx#?U1{6+&v{V_sY$^lD|*(_vO^zVl@?m7luPi{cQB2ybQ_y zuee~d@#X)&%|<9JYtWWF1AWf<2q^!d2I&p+@sEGW`N(;h#B~`PBj$<9oIM+Z;UX9& zOuWq|CKd%_&>#>l6LU8Xp35)AJNd73nXlE0;AH7sF1P^bV$d7XrnC6pVMLo|Ev&)# zTpi+lHB-Uxq4D9rqj`MGIFAqhEzaZ2%kQ^kr=f1T`tB;JXSdw5`y;2+dO&VHAo-t^ z{ZHo9AI;>0Y$hMHE}hAm{Nf92ChKQ$acyfB4nzO(5jc=AZPIR*een4MTy{>II~r}N zaHk0l|B}dzk}|V=nC=WzjhVS8`(She(`=kM$SID9zkhg3lNx}c)3DJo5Z=w`-vXDl zQF|~<1hmGMIm9+Ee$B{5(-aWDk53eGyvUvUe`w5az#DKHsw`zy^TDh`3bo6jb})e4 z{;&G4`O~Me?F%PTe#yN-c5le3KQ<5x?(=ZK1|L~V9Z~s^sA9O9v|h1|S|%VXC3$HU zFP0vH4GO-tEQ+)AFs|}f)@y+1?GXc8k4$t+FOw;nnT%u3u5Mi+FuckkvZ7UT%BhbB*CbeyO_mXbCIXnfPB z?1NqGT}SJA7@1E(4k*IpymQ%4dnPA3hG7$QaaZf5(by|JiOF-|P<5NZYt`o29yuJlj64MrJ^(2KO9CN|jJ}FCW75yoy{$xysGU0Ag+oj#qZNS{uh&N{UhY{Egx@0y;%l0H^& zk{wN)K>_X}jF@=p`kcW72@ebfE7&F{W=fO-!H~-mCvG#y)+S3;UHXNTm=d#zl!GR| z@0yS2eAoR?OaG))+ImpldJs>f@F5wYdq8#%UWvZKFnJ2i)G6cIY`V15jvBrsF zWkbb{jAD2tB3SRl6Dun@Dc_S?9}#UlHbx`d4I@F_@B=TAu}<7ryu@h+aHnmwG*K7u z1?n~QjYZ)plF}TdGQ=~PDQEp>c-Bl^*@r0TO1}jwh3y~vn&9p;b4l{8mVL|~vr}Qi z!<(n;ox`^dOa2bo-;q;)i*~CAMy?1rU@uX`{bCD}W$M(L(gYq9wQ>JFZqRwfrFyxZ z07+Vm&8;osb=vu}cF0kQ>q~WJhcQl;mMKdPBTgW4rU=s^<6X_nFPyWk*%Ij8*$ifI zPQ{5OGlRQcm2|NDOPJjq%1~T1%s}We>$tuq>A>uFM7_WPD(|0B`2-20MW3PMz>=IJ zDvM?v3|k6fRb`5f*Gc{h{}>oH$`xsD08TQ1udXyywaMa0BD|n3&bb%U<9w;kJzox*n?Di5*lE;q|3ymsD2bXtMXot@aC^#=57nkUn9Vj?kqW@=HT(w?x+_cPr6MhlH5Y48twCIK%z*zP<>kPmunSP2V z4RRaPJiO*eIa2Vd4BKCK(q^Wp^m9?iywu5MvQ)MuhuQ3kXt7tVMb@tD zY&m@6QWHzsm2b2sjEUx)`F?-V9Vzwq57t^d>b255yewV7W~U>`=fd=(E0UZ5al28jg46-kz2 zyenS8BgJ+VtxeyuIjtjOG~?cbG|dj+`%f^>EcT|-V(=hbvuL+;bieoNo$dG5?8>d# zm3G|pz2(askV32E(5hT$)km8b?S?p<&?(`TxJ9Pj31q;9?MzHZXjEPOQ1RL41uw}t zd7p^?GoJEA&`XiXUJgI}`no9Q`T9pYsVe^v5y=Xda4B);cBFQ|*#iItH~Gnfv-kLo z7gAn$M_sgdJni>u8!{)~sl8R38d$U$s-kO%hL%Mq-u;x?=Vuf^o_9E7rN6mji*8Gx z?E1jR{>FR$#>@rD-zob$bAH0vsUz2qptS&RaFN2_13VkJK9E@}`P=9sg+Jb8*z|z) z(GaJx3w|*+bRMpVvBkpqgh*_64TsZ6(pZ3-QEAd&XIK<3_)%mYz$dzHzQe##2MK0N z3~V{8-ie3Fb3j;cgI^S+mNpvWdrm&pk%^ zfYJ2cSzki+;!3HROd!Py#Ir$1-<$O5rHw{v1hdOF>reW>*pT!ky%$-#h*gN`#J`K; zLQ@P-yJ${tj1QRT5EzU@YrC_wN?vjp%bxWw`2Y`$-=HNPpM^nx(vu7r^HXb{^a>6| zq94(fyv|T^`|nwj0b28{T!ZURT>r<6CUQoh17|s?4l$KxAxGyRea}sgMMY50!~%^& zw$ZJ?=5yjC>^{j0GFuU9a55o6e|Zc`8@7;RBY9=2TR*&2)iW{HqwGx54OlO}$k<3r z%MwwH97qPrbm@wO4G|kGb2UlOd?$z+Quj&e<}?vmyHoP2WJ8HWm_XHZedRnTJFG<$ z!{-&w7(5=Zy;ihJQ*Ly;avp4eNOX8OHU$MeLLw|0wFMzNa&ym@xlG@Lier?y7-b%m zq8=11H8|2r&0z(T2&wMw$rYcjlXQ4-SyByt9#?^Ui{*dkSKkSjO9<+bMsxWp8u;1Q!? zekOI0S#df7d#(A#_RRC|4Bi^N;f1|w{QkCmAGLqK`3KFprW2VMOhNk>+V9vGI_0*_ zQqvZ>X-lqY%a3AdAABU_D%LK<@0|MfYYVUC!_Dc#SttHt3n%V$DgF_{d*tw*TzJm| ze_8tJxdG%|)A;q^*Md?_r(DzdaZS&?njWdKnQkZtIB4velzHsXcyinx+ zX8&6|(mS%7Ao<#n-C@k{h1|wNA8kf}pA;F8BLhW;3Q5|T>QV#fd)iK$c7QxJ?IxggjqaTdN3BH)l4iK!7W3f8ktsH z(#~RIo>`Y(&De-Ii$pT{=F^kIAoT4MzJv}T7EvdR$qc9lXkZH=#H{Y?Vm$;Cp~z5! zXV$Br0GPr8eSHe(C$~CmS?s$0c+!Psu`5b;(nS=&nwazUq8tS2z{k>cF#o*c5T-V{ zy(EoKf~n6@M-fcYX3q-n8F3VlOi>xAX5fsVurZo(JS<}m+dsjaZ_;rTtULfn7FB&Mjq8~;Cb-4E($W2@(}QaS%GM%=Vxd&OJ6FH^j^o|^ zw+>-eAHQ`Rx27MXQyD6Nn*is?7<@l)`z#Mvj5MJHR^mk}HiOgNLr)$%{!D-Gz7zcn z52(HY{%`t%0ehO-1vlsdR_216+`3^kFd_boK4B35Khc#2;Fom>P|$&Lme3MV&YoVT z`u_ov11N8`gsX3EeQPVP?_DR(QvGfjVa0B_VmA!*E2`&rz|Rb>LS=0C90Zls^Jnr< z3KZrqEPNr?acsf5VEv2oA2u%9ZB@{ELhv&R$e6#H1*v{$5!N+-z3yvu*?sRc-fARp zo8E*pQU}wg(x>2TVpVops$3^mu9N&dvcD(i?}3sPhs%J>8ppvf*k}ka0Jt9)pM@1` zq&}C?$7?+Ss%na;nna8($GEHm$d{OAMAAV2(#E^hB@ziXwL~k{1Hhu#qVO+%mm0jD zHTVPQiVc2Tx%yt^YN@hAuIzxio;QU*&b@Sy!&(C~#idrUl)-rYEHX1GNvRdSvS;TgRBJ8>QA+;kxr?Sp0aub)rc)j!BlZXI| zVdklbJ*Uy2C8Cm4ir#by*TpRbJvCG;8F*ze?7Vhfq1_k($hqh{(K%4+C9o+Hv$o)) zvZcdUVp1?O2Wf72!U#pplbOnP^zs2Xgla1y)Z&A$(WoTA2@$Fv7E+nE z8>921FpKh4Wx~qlT9uLPX2xs0-@NYQ=FRt-H{Ut=y+NsYuiU&h=Woadn{&ag`>R&x z);#g?nq6R&+>J_W_R4GaN~`wCtM=tWaN7~S8GI}FzCG8r`Ob(G*(FDINuk|xXm?Ki zE&42e?C{kH5E1G|dVDG{jtEy}GE4{>-fYglhYPd1q;a??6N0`58vT*w3joSHI z*qmY~r$I$gAAVQ7_kyjtU@LWC>070lnS}#V^F}GONe*qwsXsWAq2A597V4zPCced5 zF0`5d7CjcY7xgvs{w(3)w|sk!w0~H60%%emDz~ z2Rh!}x$?g3n)lY@^hZOf66}{XzbjX9F#9ByoH+mMtp`(Xng*V?Jb8Zwelm6_64r+fu~u(>3U{Dj39h`VoPb9?OecF*n`$V4c9?R2>r+z>cI4ptv>cL7EsVjza8mw)w2iLEs8EC_yuD*dIY zO2G}e;D+qxx7`@xrSqk@G5uJTAQj=uCAJeN^FM(NMx(Fto#Gl%z0M^Nf>|9hxKK(^ zhS5zN)X?IpP>TIYbq`m77+Mb*A%^z&hg78$(!`<(bV~U84D?Mn_LD*_a;OCivHefx zYLC5J!Mh7S08lj01#9@+01Am;xt0p zq4#-NM5so1aNFd){aQ$mW)o#ryWxGt(f7)v(mOof=^Xm`?ShAY>?@GBew z`qqRp#<+7~!AXR=;DX=J5-E@r|i11#D$KVuxo>z`x~@ccN%P21iQf z8s7FA%SpaVua(V}U4Y1%AG0O6BknIdX5FKfYvpt07lP`OYZZFo*M*SwJSh0|Z$@mX zV5%%to~lTNN1TEm?zcUORqEI12XbBw>lT9$%Fr9&^9>O9jw!i7tTpRrSAp5m+0vv> zB!>m=r49=wpz#H$zQmD1GN1{v$UiALtMVoT`rPrIvoMhIhydm5>4n42SQ z17IE3a#_xv#<5h&{Nnb=Gi;*)T9j~g9V~3IT2?d>UlB(WkfIY~lGeLQC5i<-CO*Ij zV9YQBHX=Awfq%Bc`P)`SNwJFYZlR=@v|_daaui8<<0yveVzr_O05nTHGDQaf>Vss- z!}w@S4@Wg*y}}Jy{|!E!X=b>W*G9(x)btnsJ;q?X3txUh3XIS4-*+$GiQPR3Ueuus z_<-+SkQz3~4I8xAMXZa37vftEtbl?a!+VXcDAOvftF8boP0hb+ISnuIw-Bk*%6NPq zD4Lqxgp5gaWLVpA0)xADT~bMv%lQ+k<9b9@$cn(xT;S*jXBJM~=~LXhw&zMa@XYjM z^)z&)Mp*n(wR#Ih5bLQPB&GQL_4pfeJqB`tfe*SM_6aL~U8i%U?RaMTv3i^oe}}TC zW*El5c4(vXck$?Lr;&}2DglmwvwOWF(wqruo3V#+^v=Q?(;OD6rl(MF`65RC33`i# ztLZJccXL>J5{^-yGE@j^8BoAr(^haYA1`2~LE#)8-rcyO7Ks=9!_ndM z@XyF@3jsp`m^>E#Xdp>rjiz`L8e&ljL0(06Lq6QaO*Bs3s36#SSLon!(y}ELn_0aq zoLTbS|3S5-@dt48z6Ks^E#iCp*Mg5M?o01k+r~(DyV;xJzSfMnkH+1v|CRHndN{J~KMi zS*cTuq!m2&k5g-pdY-Ccc5!DvzGw^Bncj zAOh@TfP)XqpNB2sdawa#FBp*fIK4(*MJn!>!>0&2b<6pi`48%p(0wkWSbn> zCe?43>p|n!6SS^7AAo@ICCz8 zGiL_YcOC(7mjXxSz)|>eE@Qr&55t%9KyKS1gi>HY4h+DRbD84GIXrjz`ss`#6U9J+ zBWL1FkR#{PuX?X}-=4{~WS^F**T~gtQeMg3A-g+r?v4lbjad0WXrD~^;dy2LNXqlz z@vYz@*R|hTp9MU&9q-J2cHbbjyQKL)xEt zUJ9+2L#uP4)$se3dG;Rm2?(y@U6{xoSlE$kdt7dQBDW3gH6U#}B5yk)RUMV9j^;wj z?~}X_N`qEUBwt>a?#OI1j0rw6NI^ZqzF|{Sq{XU%p-rqknw}5;9D^5Iv{;| zYsuo_(!;n)g7U0YFW(V#?j}I5TiM1fc2Md>YhiTrqsR!ws?SzjmldV?;M(Y)Q~B62 z>k=H-JPD1JXt7*#6Xk3y73lo^SLlte#J?EM87*=;C z<+&M@Lm$(~RyF5=R9z`|iZ%{+LS?w5Sl5*?xYhD0rNHXyn&*0A4vKq2+KQ3kZP(0y z7=RB-uKxu4B^dT#xxlQ34DJ#liZX9J21iNJ#H6Sr-IofZ7&|0VR5&2a!<59xSt3_L zAPSxyYfA4-6M_6;>QY{IQ9!XsXP!h934IDg?~@RXWD=B+A~aJ0D@~nayMviklJ|Ha@ET zdZbNM1bBs@AZl*zd25eU(I!{4rQC~-5>Ly!TeAn``mRL_u0JIxw^TRJPsmkWK&e$t z^OJH_H?HvP4Y_(9P%bp_xZAS_;l}i#8;9o)6MhB4L6GXp`>R16(k?juRkD9o&c8|- zv(~_2Y>-f&_GS7r{n^zEtN&=zoy2#yeQ%qzcIRE;2Uz?bk{b?5p#eEGkP8ju{WYm0 z#cnWNJ?LC_yB=ENwWK9pOIqUWDnM5O>UsoF6t8$2J~&Cn3}Q8PfJoeylpDTS^1RNyn2vCQ>qf%ds^JR*JU6J$=GxP8duOC+)@=I{v3 z3X>p0d>V16b=V=ei_1C~y}0%KFTtZ=OWoIOeThAMihNh57Y84~01^Nwq=zRqLtyA; z+9TKnC|jcDr9XqShEe_@{`moXjtwh#S`%JeFUf(moe7)61?g{G|6@JA7fk%j&%O^( zu^rit!djgT+*jQgGL|38Km<_Ok@Q~BC>)F~?Yd}G#Eg4LR&2Ou${(%x2GiodXWxOA4e13w9c(X!Er;jw9fbVe0gg7K!r z{|&Wa_B(tpn*d)BGO6kmz1l;;Us1roD3fOWgl>z{S+*J^2+B?2lwECD690srvUCW$ zV$BWfZY<+SX?1dfJB9pH_JS&m1tjPQ@?rk(DVm62c^x)@WPo0PWVC^@kAm*WMgp&I zV$cD!mcn9`?O?ij7JLT}sMN1h0Vgvx0!HUf0TibKNcKpn4A|owu4~bpWykGNXH{acy@k%v&<(j>4 zi~}+iN%H+t=L*NbS2a2l5S(j~mwA zYgo51A~kH08@A*cw&WW+7oL?GHf4@}@<5+VxGsGlv-!r6`6Frk!6ipo3wD(&uS%c2 zQ8Qn2v+=FQ%&Ssahg{Zyrm1R}A4`9MbkgoaAqdTI0axItMM}Kpr zDf}^*eE{lkB%LqVp`Ic(qHDy{2sBVmM2iN>&*KeQ-9rCDHxZ$!L0>5ciJCR%m^bwz zXT%|dzz*Z&1@HyijxR)IB-{ zBg!y(gA{kN60x$1TLDg;44fKlkgyRNJVBG?BiXK)fEE@Q>hb7$BTo%D3s7s;|96%| zr_tO{_njC9b4MZUnPoV94~$JtoMTc9u==BlO(GMV>Hy7B(4}c|s9PW$jlMcMK0O}M zZR>X)tC?XC)N!msOzQ=roWMpBN5&>!S;n+OeZzerY>%`Ki<48W-I3N2_^rg5ZM`!F zb*cDhe3{*Mx=Ba@w-(TV9vkUV^C^ldD0gx--$A>18{qC!c*+)N9D0-eJPA7#Z7pgo zDBzJ;WCCIlMVG}0pATS1P@TOzy!)J+fN!OO8!(ZTmq|#bY54t5SH8ty@-axWY2t{) ztkvyvSVOlA9&4~y-ItQhE*6KT82GemC7J#gw}zzgKsCj|`Ic^Qkl6@OTk zkN6s(w82u@m<#XAI^GN5^shJU1Bb~M#@1UtC~!sYSCR(H1*x)AuIvQe2IVl%J#2d( zY=L@8)_bo48~d)k-_o;?xIJ@s+ea^df0xv9NNzdwqkgI7X>5~@#m|q`w^B>L+|o}E z8OzKbSf9R>_1vrO%vE>hYg@C=O0`{SSH7kFy}De}4p?hE{=o~lpkL$8v}4|TzqvKL z`MvG$ym9Ld+%oUIiD-f#l= zo@rxCbe*4DorF&_?R^cs{BQ)H(;Cd;u7fVR7WggLzJqP=J#a6$I)`n)Jy@j8Z_Qk| zSJ9EH=%CeUW!muo`|h419Qb~GVLLXzdzEXpe$@8EwNm9#x$-FKfviDv{Mbl4hN`eB zdk*<>zg}b)pz3K--9+j(E=f_>k00T&x?yb5cke4SIccWTBJ#)NlJ8dCjiLFWl$RM> zE!wo&6zj#V{1!Oi^(_YQ9_~l$$o*&?Tx2hUxH(}+Dq(Plsse3;E{Qf-H>pphW=!-she%M!;^QhMjO&*pkc+7y51w;B>bX z0e<99o9(3iXsdjM400{vFX_h~~rzzhBd=DM9)qQ{<~#13sh~ME?&b5d11L20o-KP1p})m%0$t<fD z%!U6>$IPFrvH>~y{ zgWSL;u`JJI2Df5KDl6p3xEV`huzVkt!z0S65N1E!NA1nI6abJa2>*1R1nZ|r2aA4` zc~K_aq((iL31 zY^1MeA$Q+jAo$8yv1}bdqhFjvpjrsNObmPwNc3834AqhEs%~$?grUS+sZ~AQ{zAl(7Z8QFi#oCg1oimZ2o9IBcpiFOmj8P3vKrD-Y)pUUgn| znSixHWkSEqFz=xj59(Fe1(P7=OI8DK(DXKK6|WhVONLyH>u2#RdX;#yQ9M)BhiHZ$ zj}XV0oFrH+hO(KJ4IPHJrnuMOc~I;Id?F<{b}XN#-eL_<$T8>QYXu_*zzEv_1 zIIsLb9B?|}TTOd1@xPl|O$U2TtyV~oUl!%K2I=+}g9(~B%3*dK@g))=YWbj+)}m+! z_Mx9zUvNj9bFMj;q3uk)&RRg1?x(dyQ4F_y8>5UGCwOT~>UyYDt+oD~a;990w>;g( z9$8KGU;nLf!ERnyFU?!uiz~K>sehSgV&}{!`^aq%DVuPT9a~5!y6vCA{RWHIacTmB zrZYsf>U<_)wM>j+dP;;gS28Tp+62d$O5swneV_7zyyY0VyWB~UM*gp$L!-Q6Ea(W_ ze$z66sm~NkFw=2-0vn3z%Q+0jGQ9rsvT`?4RQ_W#8+lRLqJCnM@dIdE3${lp|C%&& zSY1^c0>cu5fW{{LKRkfo(F!7;w#;8%L1d-Heo&8x47wv+ZC&XWO~*#l9{C%>O^ory zRWQNMT?N%j1b;~*?#cnz?$pNv}e1dx^?jJb4FUf_oH?xd{7P_#Cl)(z8JH3 z#qdREsOYYVOFG{~>u_?kj;>BnzyzDjuSXZ%k_fcmeKtBa9qSjxNs;TyG7No?-cKS> z+4RgPjWIr6qF37~U@Q>UD#UnU)WlvzgM@NYbWwS;`~|f^4lT%5MRk@CZ1dl*cwfl+ zq+quk>?SG|4*turmGA+n{7Jc-T<-taSDH%9ZM(khr?^?I%)>r$D!7Hq1NIUFAg*X_EuZkM!fkGyUV6kS%8L(yeb zIn-O&RT*8C(I`dWCgw3J{k}ch_YKc`9x2pGw_rG{TL)@XKl)vxRBoZWui6+R29MR_ z8rUaAk;FCPz-zG?#v&?*9m`Yo#Lu6z&)HX^E)|kNo{MpYIM{b9xhF{whU=iu z6h<;#YPz3A+(%ai#Zw(K>{r8Ne|M-xq^+p5b&Ua^tYQtt86pl>xrqe>)r3^) zArZ3Id;dDrLT=?Ugj53M@JZC3>5|IZv+;#9(wePz+a>>A*}oS^MfsjZG6fu|c)7%f zsmd_e&u|CBB8<_&kctUkD6BJvFNz3)W)&R2Dy%cr_aAk)A}7*S_NRm@$mWfqiZEag zcg#0Neq4gr0XVIm=dHR;m@?Cu>Fk+1U4LQ!sPE4_KlDf&5B+HKUv8J0pOu@RmHf}i z{^xT3=inayy7yyu?L9XP9pG5n-7dS^bMAI}?)%tXch6mCYJ}qLgZ9q%&V1ayjRUirs8RCO$>_}<#TlJq0vc6rRSJ{H>nMxCsng>AY&yuYRCk1TqF#law(CBF zoVzt&q-Rc$H5cQ8A z2y?e-4IEmc6a30|cYbfDw06%&l~M!Dm!6bD2j$SgT<9Rw?V!%P=Em6k82NZ6b>3=H z5Yx?D!+fQ=%I0eyE{yXvi#A(&fQ--{n#l-ejcuFx-Co*;k_|%OOmTAj5qP;c9F`fC zdMvunxRfHyIc&TU_7~Z<_&sS{UGZ6Hd$?PVZ5p;G>kexuUA) zsC&{(J>H6l=y6zJ1yraDeS{s7dyVW~lT&{j{Xhv1%?MAi*kR|DA+~QREbBCNPHP@VV&IJ|hRwF-qdFOJ*l+Ky> zCE!!r#QsNdn#pyk9#|IDo()emAU9`9eQt?bx3M(Ffi>%xI4;-|I!;O=q}JJDsnsr- zVHM}A_~B!mT2MJ4(1fx#sVHQ1Pt~^;82-XJ4Q`8y5yld%%yofgq&?m_=USc`HrHJY zLm^$`b`{HD_Q4JGM5+<4sDwdqVrmRK$B+*t&YK|>zDaDGJQ0g`^F0AYGRssZ-HPyD z8+=PSEho4}15#$LULx3KC}NO~zVO0?i9f$Y!+9AszC&CKnhAr8xlhC@{Bw&&@PM2kGNKVW%Jai{$&x=5!mIPc?O+8v@JX| z?9(=`)_Ml|ix6>OaluOg6i$_#glJ!Y?lGY({hM^yCO%8dR$;4WLm|Ad6~;E%g7Xk@fI8w1Nw?Ry9Y?m$G96J(1(GK(M| zX-_-J;noe`ybnG{mB;LzDc}NvCHDWMkj(1(4{)LK#q@0FBCTk6sx6Yun^(X;0N#D5 zy$8kEGE1VtWx;^4PqvqjUR=7SofpL_x3%X+xL9hfk69VI4YlUyzJvP7lb?*k5K##x-xa9kDeW+;I9xs zlYVka^X_8@l17E|Ur4;%XFrhg7 z7A(!wsdvA#>vsJgJ@dWOcP~p@4#``vrj$CLk~^PbvlAYHBd`TSfU8Qnsw_?Q!zZxU z5omgU>vwwJ+Xb`w00zZM0i2XpV%4cOZ}AGs!oOet&H9BG7he2e==PA*vP*8+#rgr+ z)lqhJhK#Y|4As-ZxF(bM`s~+cA;D~Z0(Rc)5u6Tx_0Y9LbBC`VP91)rxg9Q)C<>_> z{e*@ta_{~S)BI}X)vBx2S8J};nx&0K98YFxaId8U3;+`v;GksH!w4ppp`3Jzkk@MU z6wzF*DNnd%f_;JQo7N<`nsVrYnqfgpwihs;(;JZ)0h=jZEHR4`tZUFwDDwWURpE{( zOm9yB})b7U3NAw0oPT@&_zs6%z6GCSF`>J>x9Rg^7VDt_avmGVNaIM zmQ8F+2HrR6>3vOOwji#u0(`d49GW zwJ%>%pM%@oq)iV9Ao_+W`EAR$FnB&>1Bkj!!N1LXO%A-vn4c%{ zhFP~9V|u~hkuY>z)C>L-`at`NM`DBvK@5}~Zg&i9UM@D|ZMF=pNPZpSXAxC1I#(6s ze_CoOt0x}sVt{dYNjP;XvnhRgKA5kn&(}2PYg^#!BmfkF;Aa#p+SSN9s{u{VetD{; z0(n1Njo>Ey@4*DW)JU-u=}D+e2NjiRl~2H!#NS3-1BHAA4-`*kORBBeIb5Q8(NOMAkp;7cF_Ap6`y)I*UTVJvCJ(dwla#@^%NQDSBkT-@m{<8l|A z*zySGW9<}UC*F3}aW2Pi;{luiDI-xNd1s-NmtK8X@X@3iVhO|x9@_Ve&9Xv(ofWS@ z@q(9q#+2(BFRh?%uox8+@CpPQQSxez)Fxkn^MvyAf&)z*Nuiq!t@0aWMOI5vcRd31%?W%dW_hBB6Qzay1MaImwY>?jd(5AdKhoqWAa?PPs zfOfX5mnz%k%67%T@v`DR+*m9(@Iop9fh;o%{^^YHf zYx6DL3$H;;eiy!&_ND_+HAABC;t;BVQX5y|Z|X|>(!K}X+j608aG-E8-_()zA@{Og zYrgC8JFm%Iy;8U%J&<+7PeT?qz}>m(?)>TvclLc_GULnm0C2Jg@6~qaYV}Va)HLQ- z_1vkKR_*+#OlsYqK8(DPBs?HBv}7Ca`0hr(8E8b2Yg*`d_< zenWHCicLGc(yHxJ!w$J&N7{40t}$~SF4~(m-Ff~aue4=Asyi Y)-Wy3FZ&6{~X< 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 F{{k3pe-How diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc deleted file mode 100755 index 36cf78d37caae611f749b312896ad28eb40d24f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 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 Kh8nis`Tqfdl5Hyh diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc deleted file mode 100755 index c106ccfde7c0541fa26de5ef4339ad8772ca6dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12862 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 diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py deleted file mode 100755 index 608ae3a..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py +++ /dev/null @@ -1,454 +0,0 @@ -# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = [ - (0, 0, 0), - (1, 31, -1), - (127, 159, -1), - (173, 173, 0), - (768, 879, 0), - (1155, 1161, 0), - (1425, 1469, 0), - (1471, 1471, 0), - (1473, 1474, 0), - (1476, 1477, 0), - (1479, 1479, 0), - (1536, 1541, 0), - (1552, 1562, 0), - (1564, 1564, 0), - (1611, 1631, 0), - (1648, 1648, 0), - (1750, 1757, 0), - (1759, 1764, 0), - (1767, 1768, 0), - (1770, 1773, 0), - (1807, 1807, 0), - (1809, 1809, 0), - (1840, 1866, 0), - (1958, 1968, 0), - (2027, 2035, 0), - (2045, 2045, 0), - (2070, 2073, 0), - (2075, 2083, 0), - (2085, 2087, 0), - (2089, 2093, 0), - (2137, 2139, 0), - (2192, 2193, 0), - (2200, 2207, 0), - (2250, 2307, 0), - (2362, 2364, 0), - (2366, 2383, 0), - (2385, 2391, 0), - (2402, 2403, 0), - (2433, 2435, 0), - (2492, 2492, 0), - (2494, 2500, 0), - (2503, 2504, 0), - (2507, 2509, 0), - (2519, 2519, 0), - (2530, 2531, 0), - (2558, 2558, 0), - (2561, 2563, 0), - (2620, 2620, 0), - (2622, 2626, 0), - (2631, 2632, 0), - (2635, 2637, 0), - (2641, 2641, 0), - (2672, 2673, 0), - (2677, 2677, 0), - (2689, 2691, 0), - (2748, 2748, 0), - (2750, 2757, 0), - (2759, 2761, 0), - (2763, 2765, 0), - (2786, 2787, 0), - (2810, 2815, 0), - (2817, 2819, 0), - (2876, 2876, 0), - (2878, 2884, 0), - (2887, 2888, 0), - (2891, 2893, 0), - (2901, 2903, 0), - (2914, 2915, 0), - (2946, 2946, 0), - (3006, 3010, 0), - (3014, 3016, 0), - (3018, 3021, 0), - (3031, 3031, 0), - (3072, 3076, 0), - (3132, 3132, 0), - (3134, 3140, 0), - (3142, 3144, 0), - (3146, 3149, 0), - (3157, 3158, 0), - (3170, 3171, 0), - (3201, 3203, 0), - (3260, 3260, 0), - (3262, 3268, 0), - (3270, 3272, 0), - (3274, 3277, 0), - (3285, 3286, 0), - (3298, 3299, 0), - (3315, 3315, 0), - (3328, 3331, 0), - (3387, 3388, 0), - (3390, 3396, 0), - (3398, 3400, 0), - (3402, 3405, 0), - (3415, 3415, 0), - (3426, 3427, 0), - (3457, 3459, 0), - (3530, 3530, 0), - (3535, 3540, 0), - (3542, 3542, 0), - (3544, 3551, 0), - (3570, 3571, 0), - (3633, 3633, 0), - (3636, 3642, 0), - (3655, 3662, 0), - (3761, 3761, 0), - (3764, 3772, 0), - (3784, 3790, 0), - (3864, 3865, 0), - (3893, 3893, 0), - (3895, 3895, 0), - (3897, 3897, 0), - (3902, 3903, 0), - (3953, 3972, 0), - (3974, 3975, 0), - (3981, 3991, 0), - (3993, 4028, 0), - (4038, 4038, 0), - (4139, 4158, 0), - (4182, 4185, 0), - (4190, 4192, 0), - (4194, 4196, 0), - (4199, 4205, 0), - (4209, 4212, 0), - (4226, 4237, 0), - (4239, 4239, 0), - (4250, 4253, 0), - (4352, 4447, 2), - (4448, 4607, 0), - (4957, 4959, 0), - (5906, 5909, 0), - (5938, 5940, 0), - (5970, 5971, 0), - (6002, 6003, 0), - (6068, 6099, 0), - (6109, 6109, 0), - (6155, 6159, 0), - (6277, 6278, 0), - (6313, 6313, 0), - (6432, 6443, 0), - (6448, 6459, 0), - (6679, 6683, 0), - (6741, 6750, 0), - (6752, 6780, 0), - (6783, 6783, 0), - (6832, 6862, 0), - (6912, 6916, 0), - (6964, 6980, 0), - (7019, 7027, 0), - (7040, 7042, 0), - (7073, 7085, 0), - (7142, 7155, 0), - (7204, 7223, 0), - (7376, 7378, 0), - (7380, 7400, 0), - (7405, 7405, 0), - (7412, 7412, 0), - (7415, 7417, 0), - (7616, 7679, 0), - (8203, 8207, 0), - (8232, 8238, 0), - (8288, 8292, 0), - (8294, 8303, 0), - (8400, 8432, 0), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11503, 11505, 0), - (11647, 11647, 0), - (11744, 11775, 0), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 2), - (12272, 12329, 2), - (12330, 12335, 0), - (12336, 12350, 2), - (12353, 12438, 2), - (12441, 12442, 0), - (12443, 12543, 2), - (12549, 12591, 2), - (12593, 12686, 2), - (12688, 12771, 2), - (12783, 12830, 2), - (12832, 12871, 2), - (12880, 19903, 2), - (19968, 42124, 2), - (42128, 42182, 2), - (42607, 42610, 0), - (42612, 42621, 0), - (42654, 42655, 0), - (42736, 42737, 0), - (43010, 43010, 0), - (43014, 43014, 0), - (43019, 43019, 0), - (43043, 43047, 0), - (43052, 43052, 0), - (43136, 43137, 0), - (43188, 43205, 0), - (43232, 43249, 0), - (43263, 43263, 0), - (43302, 43309, 0), - (43335, 43347, 0), - (43360, 43388, 2), - (43392, 43395, 0), - (43443, 43456, 0), - (43493, 43493, 0), - (43561, 43574, 0), - (43587, 43587, 0), - (43596, 43597, 0), - (43643, 43645, 0), - (43696, 43696, 0), - (43698, 43700, 0), - (43703, 43704, 0), - (43710, 43711, 0), - (43713, 43713, 0), - (43755, 43759, 0), - (43765, 43766, 0), - (44003, 44010, 0), - (44012, 44013, 0), - (44032, 55203, 2), - (55216, 55295, 0), - (63744, 64255, 2), - (64286, 64286, 0), - (65024, 65039, 0), - (65040, 65049, 2), - (65056, 65071, 0), - (65072, 65106, 2), - (65108, 65126, 2), - (65128, 65131, 2), - (65279, 65279, 0), - (65281, 65376, 2), - (65504, 65510, 2), - (65529, 65531, 0), - (66045, 66045, 0), - (66272, 66272, 0), - (66422, 66426, 0), - (68097, 68099, 0), - (68101, 68102, 0), - (68108, 68111, 0), - (68152, 68154, 0), - (68159, 68159, 0), - (68325, 68326, 0), - (68900, 68903, 0), - (69291, 69292, 0), - (69373, 69375, 0), - (69446, 69456, 0), - (69506, 69509, 0), - (69632, 69634, 0), - (69688, 69702, 0), - (69744, 69744, 0), - (69747, 69748, 0), - (69759, 69762, 0), - (69808, 69818, 0), - (69821, 69821, 0), - (69826, 69826, 0), - (69837, 69837, 0), - (69888, 69890, 0), - (69927, 69940, 0), - (69957, 69958, 0), - (70003, 70003, 0), - (70016, 70018, 0), - (70067, 70080, 0), - (70089, 70092, 0), - (70094, 70095, 0), - (70188, 70199, 0), - (70206, 70206, 0), - (70209, 70209, 0), - (70367, 70378, 0), - (70400, 70403, 0), - (70459, 70460, 0), - (70462, 70468, 0), - (70471, 70472, 0), - (70475, 70477, 0), - (70487, 70487, 0), - (70498, 70499, 0), - (70502, 70508, 0), - (70512, 70516, 0), - (70709, 70726, 0), - (70750, 70750, 0), - (70832, 70851, 0), - (71087, 71093, 0), - (71096, 71104, 0), - (71132, 71133, 0), - (71216, 71232, 0), - (71339, 71351, 0), - (71453, 71467, 0), - (71724, 71738, 0), - (71984, 71989, 0), - (71991, 71992, 0), - (71995, 71998, 0), - (72000, 72000, 0), - (72002, 72003, 0), - (72145, 72151, 0), - (72154, 72160, 0), - (72164, 72164, 0), - (72193, 72202, 0), - (72243, 72249, 0), - (72251, 72254, 0), - (72263, 72263, 0), - (72273, 72283, 0), - (72330, 72345, 0), - (72751, 72758, 0), - (72760, 72767, 0), - (72850, 72871, 0), - (72873, 72886, 0), - (73009, 73014, 0), - (73018, 73018, 0), - (73020, 73021, 0), - (73023, 73029, 0), - (73031, 73031, 0), - (73098, 73102, 0), - (73104, 73105, 0), - (73107, 73111, 0), - (73459, 73462, 0), - (73472, 73473, 0), - (73475, 73475, 0), - (73524, 73530, 0), - (73534, 73538, 0), - (78896, 78912, 0), - (78919, 78933, 0), - (92912, 92916, 0), - (92976, 92982, 0), - (94031, 94031, 0), - (94033, 94087, 0), - (94095, 94098, 0), - (94176, 94179, 2), - (94180, 94180, 0), - (94192, 94193, 0), - (94208, 100343, 2), - (100352, 101589, 2), - (101632, 101640, 2), - (110576, 110579, 2), - (110581, 110587, 2), - (110589, 110590, 2), - (110592, 110882, 2), - (110898, 110898, 2), - (110928, 110930, 2), - (110933, 110933, 2), - (110948, 110951, 2), - (110960, 111355, 2), - (113821, 113822, 0), - (113824, 113827, 0), - (118528, 118573, 0), - (118576, 118598, 0), - (119141, 119145, 0), - (119149, 119170, 0), - (119173, 119179, 0), - (119210, 119213, 0), - (119362, 119364, 0), - (121344, 121398, 0), - (121403, 121452, 0), - (121461, 121461, 0), - (121476, 121476, 0), - (121499, 121503, 0), - (121505, 121519, 0), - (122880, 122886, 0), - (122888, 122904, 0), - (122907, 122913, 0), - (122915, 122916, 0), - (122918, 122922, 0), - (123023, 123023, 0), - (123184, 123190, 0), - (123566, 123566, 0), - (123628, 123631, 0), - (124140, 124143, 0), - (125136, 125142, 0), - (125252, 125258, 0), - (126980, 126980, 2), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 127994, 2), - (127995, 127999, 0), - (128000, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (128716, 128716, 2), - (128720, 128722, 2), - (128725, 128727, 2), - (128732, 128735, 2), - (128747, 128748, 2), - (128756, 128764, 2), - (128992, 129003, 2), - (129008, 129008, 2), - (129292, 129338, 2), - (129340, 129349, 2), - (129351, 129535, 2), - (129648, 129660, 2), - (129664, 129672, 2), - (129680, 129725, 2), - (129727, 129733, 2), - (129742, 129755, 2), - (129760, 129768, 2), - (129776, 129784, 2), - (131072, 196605, 2), - (196608, 262141, 2), - (917505, 917505, 0), - (917536, 917631, 0), - (917760, 917999, 0), -] diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py deleted file mode 100755 index 1f2877b..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py +++ /dev/null @@ -1,3610 +0,0 @@ -EMOJI = { - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "ab_button_(blood_type)": "🆎", - "atm_sign": "🏧", - "a_button_(blood_type)": "🅰", - "afghanistan": "🇦🇫", - "albania": "🇦🇱", - "algeria": "🇩🇿", - "american_samoa": "🇦🇸", - "andorra": "🇦🇩", - "angola": "🇦🇴", - "anguilla": "🇦🇮", - "antarctica": "🇦🇶", - "antigua_&_barbuda": "🇦🇬", - "aquarius": "♒", - "argentina": "🇦🇷", - "aries": "♈", - "armenia": "🇦🇲", - "aruba": "🇦🇼", - "ascension_island": "🇦🇨", - "australia": "🇦🇺", - "austria": "🇦🇹", - "azerbaijan": "🇦🇿", - "back_arrow": "🔙", - "b_button_(blood_type)": "🅱", - "bahamas": "🇧🇸", - "bahrain": "🇧🇭", - "bangladesh": "🇧🇩", - "barbados": "🇧🇧", - "belarus": "🇧🇾", - "belgium": "🇧🇪", - "belize": "🇧🇿", - "benin": "🇧🇯", - "bermuda": "🇧🇲", - "bhutan": "🇧🇹", - "bolivia": "🇧🇴", - "bosnia_&_herzegovina": "🇧🇦", - "botswana": "🇧🇼", - "bouvet_island": "🇧🇻", - "brazil": "🇧🇷", - "british_indian_ocean_territory": "🇮🇴", - "british_virgin_islands": "🇻🇬", - "brunei": "🇧🇳", - "bulgaria": "🇧🇬", - "burkina_faso": "🇧🇫", - "burundi": "🇧🇮", - "cl_button": "🆑", - "cool_button": "🆒", - "cambodia": "🇰🇭", - "cameroon": "🇨🇲", - "canada": "🇨🇦", - "canary_islands": "🇮🇨", - "cancer": "♋", - "cape_verde": "🇨🇻", - "capricorn": "♑", - "caribbean_netherlands": "🇧🇶", - "cayman_islands": "🇰🇾", - "central_african_republic": "🇨🇫", - "ceuta_&_melilla": "🇪🇦", - "chad": "🇹🇩", - "chile": "🇨🇱", - "china": "🇨🇳", - "christmas_island": "🇨🇽", - "christmas_tree": "🎄", - "clipperton_island": "🇨🇵", - "cocos_(keeling)_islands": "🇨🇨", - "colombia": "🇨🇴", - "comoros": "🇰🇲", - "congo_-_brazzaville": "🇨🇬", - "congo_-_kinshasa": "🇨🇩", - "cook_islands": "🇨🇰", - "costa_rica": "🇨🇷", - "croatia": "🇭🇷", - "cuba": "🇨🇺", - "curaçao": "🇨🇼", - "cyprus": "🇨🇾", - "czechia": "🇨🇿", - "côte_d’ivoire": "🇨🇮", - "denmark": "🇩🇰", - "diego_garcia": "🇩🇬", - "djibouti": "🇩🇯", - "dominica": "🇩🇲", - "dominican_republic": "🇩🇴", - "end_arrow": "🔚", - "ecuador": "🇪🇨", - "egypt": "🇪🇬", - "el_salvador": "🇸🇻", - "england": "🏴\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", - "equatorial_guinea": "🇬🇶", - "eritrea": "🇪🇷", - "estonia": "🇪🇪", - "ethiopia": "🇪🇹", - "european_union": "🇪🇺", - "free_button": "🆓", - "falkland_islands": "🇫🇰", - "faroe_islands": "🇫🇴", - "fiji": "🇫🇯", - "finland": "🇫🇮", - "france": "🇫🇷", - "french_guiana": "🇬🇫", - "french_polynesia": "🇵🇫", - "french_southern_territories": "🇹🇫", - "gabon": "🇬🇦", - "gambia": "🇬🇲", - "gemini": "♊", - "georgia": "🇬🇪", - "germany": "🇩🇪", - "ghana": "🇬🇭", - "gibraltar": "🇬🇮", - "greece": "🇬🇷", - "greenland": "🇬🇱", - "grenada": "🇬🇩", - "guadeloupe": "🇬🇵", - "guam": "🇬🇺", - "guatemala": "🇬🇹", - "guernsey": "🇬🇬", - "guinea": "🇬🇳", - "guinea-bissau": "🇬🇼", - "guyana": "🇬🇾", - "haiti": "🇭🇹", - "heard_&_mcdonald_islands": "🇭🇲", - "honduras": "🇭🇳", - "hong_kong_sar_china": "🇭🇰", - "hungary": "🇭🇺", - "id_button": "🆔", - "iceland": "🇮🇸", - "india": "🇮🇳", - "indonesia": "🇮🇩", - "iran": "🇮🇷", - "iraq": "🇮🇶", - "ireland": "🇮🇪", - "isle_of_man": "🇮🇲", - "israel": "🇮🇱", - "italy": "🇮🇹", - "jamaica": "🇯🇲", - "japan": "🗾", - "japanese_acceptable_button": "🉑", - "japanese_application_button": "🈸", - "japanese_bargain_button": "🉐", - "japanese_castle": "🏯", - "japanese_congratulations_button": "㊗", - "japanese_discount_button": "🈹", - "japanese_dolls": "🎎", - "japanese_free_of_charge_button": "🈚", - "japanese_here_button": "🈁", - "japanese_monthly_amount_button": "🈷", - "japanese_no_vacancy_button": "🈵", - "japanese_not_free_of_charge_button": "🈶", - "japanese_open_for_business_button": "🈺", - "japanese_passing_grade_button": "🈴", - "japanese_post_office": "🏣", - "japanese_prohibited_button": "🈲", - "japanese_reserved_button": "🈯", - "japanese_secret_button": "㊙", - "japanese_service_charge_button": "🈂", - "japanese_symbol_for_beginner": "🔰", - "japanese_vacancy_button": "🈳", - "jersey": "🇯🇪", - "jordan": "🇯🇴", - "kazakhstan": "🇰🇿", - "kenya": "🇰🇪", - "kiribati": "🇰🇮", - "kosovo": "🇽🇰", - "kuwait": "🇰🇼", - "kyrgyzstan": "🇰🇬", - "laos": "🇱🇦", - "latvia": "🇱🇻", - "lebanon": "🇱🇧", - "leo": "♌", - "lesotho": "🇱🇸", - "liberia": "🇱🇷", - "libra": "♎", - "libya": "🇱🇾", - "liechtenstein": "🇱🇮", - "lithuania": "🇱🇹", - "luxembourg": "🇱🇺", - "macau_sar_china": "🇲🇴", - "macedonia": "🇲🇰", - "madagascar": "🇲🇬", - "malawi": "🇲🇼", - "malaysia": "🇲🇾", - "maldives": "🇲🇻", - "mali": "🇲🇱", - "malta": "🇲🇹", - "marshall_islands": "🇲🇭", - "martinique": "🇲🇶", - "mauritania": "🇲🇷", - "mauritius": "🇲🇺", - "mayotte": "🇾🇹", - "mexico": "🇲🇽", - "micronesia": "🇫🇲", - "moldova": "🇲🇩", - "monaco": "🇲🇨", - "mongolia": "🇲🇳", - "montenegro": "🇲🇪", - "montserrat": "🇲🇸", - "morocco": "🇲🇦", - "mozambique": "🇲🇿", - "mrs._claus": "🤶", - "mrs._claus_dark_skin_tone": "🤶🏿", - "mrs._claus_light_skin_tone": "🤶🏻", - "mrs._claus_medium-dark_skin_tone": "🤶🏾", - "mrs._claus_medium-light_skin_tone": "🤶🏼", - "mrs._claus_medium_skin_tone": "🤶🏽", - "myanmar_(burma)": "🇲🇲", - "new_button": "🆕", - "ng_button": "🆖", - "namibia": "🇳🇦", - "nauru": "🇳🇷", - "nepal": "🇳🇵", - "netherlands": "🇳🇱", - "new_caledonia": "🇳🇨", - "new_zealand": "🇳🇿", - "nicaragua": "🇳🇮", - "niger": "🇳🇪", - "nigeria": "🇳🇬", - "niue": "🇳🇺", - "norfolk_island": "🇳🇫", - "north_korea": "🇰🇵", - "northern_mariana_islands": "🇲🇵", - "norway": "🇳🇴", - "ok_button": "🆗", - "ok_hand": "👌", - "ok_hand_dark_skin_tone": "👌🏿", - "ok_hand_light_skin_tone": "👌🏻", - "ok_hand_medium-dark_skin_tone": "👌🏾", - "ok_hand_medium-light_skin_tone": "👌🏼", - "ok_hand_medium_skin_tone": "👌🏽", - "on!_arrow": "🔛", - "o_button_(blood_type)": "🅾", - "oman": "🇴🇲", - "ophiuchus": "⛎", - "p_button": "🅿", - "pakistan": "🇵🇰", - "palau": "🇵🇼", - "palestinian_territories": "🇵🇸", - "panama": "🇵🇦", - "papua_new_guinea": "🇵🇬", - "paraguay": "🇵🇾", - "peru": "🇵🇪", - "philippines": "🇵🇭", - "pisces": "♓", - "pitcairn_islands": "🇵🇳", - "poland": "🇵🇱", - "portugal": "🇵🇹", - "puerto_rico": "🇵🇷", - "qatar": "🇶🇦", - "romania": "🇷🇴", - "russia": "🇷🇺", - "rwanda": "🇷🇼", - "réunion": "🇷🇪", - "soon_arrow": "🔜", - "sos_button": "🆘", - "sagittarius": "♐", - "samoa": "🇼🇸", - "san_marino": "🇸🇲", - "santa_claus": "🎅", - "santa_claus_dark_skin_tone": "🎅🏿", - "santa_claus_light_skin_tone": "🎅🏻", - "santa_claus_medium-dark_skin_tone": "🎅🏾", - "santa_claus_medium-light_skin_tone": "🎅🏼", - "santa_claus_medium_skin_tone": "🎅🏽", - "saudi_arabia": "🇸🇦", - "scorpio": "♏", - "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", - "senegal": "🇸🇳", - "serbia": "🇷🇸", - "seychelles": "🇸🇨", - "sierra_leone": "🇸🇱", - "singapore": "🇸🇬", - "sint_maarten": "🇸🇽", - "slovakia": "🇸🇰", - "slovenia": "🇸🇮", - "solomon_islands": "🇸🇧", - "somalia": "🇸🇴", - "south_africa": "🇿🇦", - "south_georgia_&_south_sandwich_islands": "🇬🇸", - "south_korea": "🇰🇷", - "south_sudan": "🇸🇸", - "spain": "🇪🇸", - "sri_lanka": "🇱🇰", - "st._barthélemy": "🇧🇱", - "st._helena": "🇸🇭", - "st._kitts_&_nevis": "🇰🇳", - "st._lucia": "🇱🇨", - "st._martin": "🇲🇫", - "st._pierre_&_miquelon": "🇵🇲", - "st._vincent_&_grenadines": "🇻🇨", - "statue_of_liberty": "🗽", - "sudan": "🇸🇩", - "suriname": "🇸🇷", - "svalbard_&_jan_mayen": "🇸🇯", - "swaziland": "🇸🇿", - "sweden": "🇸🇪", - "switzerland": "🇨🇭", - "syria": "🇸🇾", - "são_tomé_&_príncipe": "🇸🇹", - "t-rex": "🦖", - "top_arrow": "🔝", - "taiwan": "🇹🇼", - "tajikistan": "🇹🇯", - "tanzania": "🇹🇿", - "taurus": "♉", - "thailand": "🇹🇭", - "timor-leste": "🇹🇱", - "togo": "🇹🇬", - "tokelau": "🇹🇰", - "tokyo_tower": "🗼", - "tonga": "🇹🇴", - "trinidad_&_tobago": "🇹🇹", - "tristan_da_cunha": "🇹🇦", - "tunisia": "🇹🇳", - "turkey": "🦃", - "turkmenistan": "🇹🇲", - "turks_&_caicos_islands": "🇹🇨", - "tuvalu": "🇹🇻", - "u.s._outlying_islands": "🇺🇲", - "u.s._virgin_islands": "🇻🇮", - "up!_button": "🆙", - "uganda": "🇺🇬", - "ukraine": "🇺🇦", - "united_arab_emirates": "🇦🇪", - "united_kingdom": "🇬🇧", - "united_nations": "🇺🇳", - "united_states": "🇺🇸", - "uruguay": "🇺🇾", - "uzbekistan": "🇺🇿", - "vs_button": "🆚", - "vanuatu": "🇻🇺", - "vatican_city": "🇻🇦", - "venezuela": "🇻🇪", - "vietnam": "🇻🇳", - "virgo": "♍", - "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", - "wallis_&_futuna": "🇼🇫", - "western_sahara": "🇪🇭", - "yemen": "🇾🇪", - "zambia": "🇿🇲", - "zimbabwe": "🇿🇼", - "abacus": "🧮", - "adhesive_bandage": "🩹", - "admission_tickets": "🎟", - "adult": "🧑", - "adult_dark_skin_tone": "🧑🏿", - "adult_light_skin_tone": "🧑🏻", - "adult_medium-dark_skin_tone": "🧑🏾", - "adult_medium-light_skin_tone": "🧑🏼", - "adult_medium_skin_tone": "🧑🏽", - "aerial_tramway": "🚡", - "airplane": "✈", - "airplane_arrival": "🛬", - "airplane_departure": "🛫", - "alarm_clock": "⏰", - "alembic": "⚗", - "alien": "👽", - "alien_monster": "👾", - "ambulance": "🚑", - "american_football": "🏈", - "amphora": "🏺", - "anchor": "⚓", - "anger_symbol": "💢", - "angry_face": "😠", - "angry_face_with_horns": "👿", - "anguished_face": "😧", - "ant": "🐜", - "antenna_bars": "📶", - "anxious_face_with_sweat": "😰", - "articulated_lorry": "🚛", - "artist_palette": "🎨", - "astonished_face": "😲", - "atom_symbol": "⚛", - "auto_rickshaw": "🛺", - "automobile": "🚗", - "avocado": "🥑", - "axe": "🪓", - "baby": "👶", - "baby_angel": "👼", - "baby_angel_dark_skin_tone": "👼🏿", - "baby_angel_light_skin_tone": "👼🏻", - "baby_angel_medium-dark_skin_tone": "👼🏾", - "baby_angel_medium-light_skin_tone": "👼🏼", - "baby_angel_medium_skin_tone": "👼🏽", - "baby_bottle": "🍼", - "baby_chick": "🐤", - "baby_dark_skin_tone": "👶🏿", - "baby_light_skin_tone": "👶🏻", - "baby_medium-dark_skin_tone": "👶🏾", - "baby_medium-light_skin_tone": "👶🏼", - "baby_medium_skin_tone": "👶🏽", - "baby_symbol": "🚼", - "backhand_index_pointing_down": "👇", - "backhand_index_pointing_down_dark_skin_tone": "👇🏿", - "backhand_index_pointing_down_light_skin_tone": "👇🏻", - "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾", - "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼", - "backhand_index_pointing_down_medium_skin_tone": "👇🏽", - "backhand_index_pointing_left": "👈", - "backhand_index_pointing_left_dark_skin_tone": "👈🏿", - "backhand_index_pointing_left_light_skin_tone": "👈🏻", - "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾", - "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼", - "backhand_index_pointing_left_medium_skin_tone": "👈🏽", - "backhand_index_pointing_right": "👉", - "backhand_index_pointing_right_dark_skin_tone": "👉🏿", - "backhand_index_pointing_right_light_skin_tone": "👉🏻", - "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾", - "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼", - "backhand_index_pointing_right_medium_skin_tone": "👉🏽", - "backhand_index_pointing_up": "👆", - "backhand_index_pointing_up_dark_skin_tone": "👆🏿", - "backhand_index_pointing_up_light_skin_tone": "👆🏻", - "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾", - "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼", - "backhand_index_pointing_up_medium_skin_tone": "👆🏽", - "bacon": "🥓", - "badger": "🦡", - "badminton": "🏸", - "bagel": "🥯", - "baggage_claim": "🛄", - "baguette_bread": "🥖", - "balance_scale": "⚖", - "bald": "🦲", - "bald_man": "👨\u200d🦲", - "bald_woman": "👩\u200d🦲", - "ballet_shoes": "🩰", - "balloon": "🎈", - "ballot_box_with_ballot": "🗳", - "ballot_box_with_check": "☑", - "banana": "🍌", - "banjo": "🪕", - "bank": "🏦", - "bar_chart": "📊", - "barber_pole": "💈", - "baseball": "⚾", - "basket": "🧺", - "basketball": "🏀", - "bat": "🦇", - "bathtub": "🛁", - "battery": "🔋", - "beach_with_umbrella": "🏖", - "beaming_face_with_smiling_eyes": "😁", - "bear_face": "🐻", - "bearded_person": "🧔", - "bearded_person_dark_skin_tone": "🧔🏿", - "bearded_person_light_skin_tone": "🧔🏻", - "bearded_person_medium-dark_skin_tone": "🧔🏾", - "bearded_person_medium-light_skin_tone": "🧔🏼", - "bearded_person_medium_skin_tone": "🧔🏽", - "beating_heart": "💓", - "bed": "🛏", - "beer_mug": "🍺", - "bell": "🔔", - "bell_with_slash": "🔕", - "bellhop_bell": "🛎", - "bento_box": "🍱", - "beverage_box": "🧃", - "bicycle": "🚲", - "bikini": "👙", - "billed_cap": "🧢", - "biohazard": "☣", - "bird": "🐦", - "birthday_cake": "🎂", - "black_circle": "⚫", - "black_flag": "🏴", - "black_heart": "🖤", - "black_large_square": "⬛", - "black_medium-small_square": "◾", - "black_medium_square": "◼", - "black_nib": "✒", - "black_small_square": "▪", - "black_square_button": "🔲", - "blond-haired_man": "👱\u200d♂️", - "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️", - "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️", - "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️", - "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️", - "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️", - "blond-haired_person": "👱", - "blond-haired_person_dark_skin_tone": "👱🏿", - "blond-haired_person_light_skin_tone": "👱🏻", - "blond-haired_person_medium-dark_skin_tone": "👱🏾", - "blond-haired_person_medium-light_skin_tone": "👱🏼", - "blond-haired_person_medium_skin_tone": "👱🏽", - "blond-haired_woman": "👱\u200d♀️", - "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️", - "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️", - "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️", - "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️", - "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️", - "blossom": "🌼", - "blowfish": "🐡", - "blue_book": "📘", - "blue_circle": "🔵", - "blue_heart": "💙", - "blue_square": "🟦", - "boar": "🐗", - "bomb": "💣", - "bone": "🦴", - "bookmark": "🔖", - "bookmark_tabs": "📑", - "books": "📚", - "bottle_with_popping_cork": "🍾", - "bouquet": "💐", - "bow_and_arrow": "🏹", - "bowl_with_spoon": "🥣", - "bowling": "🎳", - "boxing_glove": "🥊", - "boy": "👦", - "boy_dark_skin_tone": "👦🏿", - "boy_light_skin_tone": "👦🏻", - "boy_medium-dark_skin_tone": "👦🏾", - "boy_medium-light_skin_tone": "👦🏼", - "boy_medium_skin_tone": "👦🏽", - "brain": "🧠", - "bread": "🍞", - "breast-feeding": "🤱", - "breast-feeding_dark_skin_tone": "🤱🏿", - "breast-feeding_light_skin_tone": "🤱🏻", - "breast-feeding_medium-dark_skin_tone": "🤱🏾", - "breast-feeding_medium-light_skin_tone": "🤱🏼", - "breast-feeding_medium_skin_tone": "🤱🏽", - "brick": "🧱", - "bride_with_veil": "👰", - "bride_with_veil_dark_skin_tone": "👰🏿", - "bride_with_veil_light_skin_tone": "👰🏻", - "bride_with_veil_medium-dark_skin_tone": "👰🏾", - "bride_with_veil_medium-light_skin_tone": "👰🏼", - "bride_with_veil_medium_skin_tone": "👰🏽", - "bridge_at_night": "🌉", - "briefcase": "💼", - "briefs": "🩲", - "bright_button": "🔆", - "broccoli": "🥦", - "broken_heart": "💔", - "broom": "🧹", - "brown_circle": "🟤", - "brown_heart": "🤎", - "brown_square": "🟫", - "bug": "🐛", - "building_construction": "🏗", - "bullet_train": "🚅", - "burrito": "🌯", - "bus": "🚌", - "bus_stop": "🚏", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "butter": "🧈", - "butterfly": "🦋", - "cactus": "🌵", - "calendar": "📆", - "call_me_hand": "🤙", - "call_me_hand_dark_skin_tone": "🤙🏿", - "call_me_hand_light_skin_tone": "🤙🏻", - "call_me_hand_medium-dark_skin_tone": "🤙🏾", - "call_me_hand_medium-light_skin_tone": "🤙🏼", - "call_me_hand_medium_skin_tone": "🤙🏽", - "camel": "🐫", - "camera": "📷", - "camera_with_flash": "📸", - "camping": "🏕", - "candle": "🕯", - "candy": "🍬", - "canned_food": "🥫", - "canoe": "🛶", - "card_file_box": "🗃", - "card_index": "📇", - "card_index_dividers": "🗂", - "carousel_horse": "🎠", - "carp_streamer": "🎏", - "carrot": "🥕", - "castle": "🏰", - "cat": "🐱", - "cat_face": "🐱", - "cat_face_with_tears_of_joy": "😹", - "cat_face_with_wry_smile": "😼", - "chains": "⛓", - "chair": "🪑", - "chart_decreasing": "📉", - "chart_increasing": "📈", - "chart_increasing_with_yen": "💹", - "cheese_wedge": "🧀", - "chequered_flag": "🏁", - "cherries": "🍒", - "cherry_blossom": "🌸", - "chess_pawn": "♟", - "chestnut": "🌰", - "chicken": "🐔", - "child": "🧒", - "child_dark_skin_tone": "🧒🏿", - "child_light_skin_tone": "🧒🏻", - "child_medium-dark_skin_tone": "🧒🏾", - "child_medium-light_skin_tone": "🧒🏼", - "child_medium_skin_tone": "🧒🏽", - "children_crossing": "🚸", - "chipmunk": "🐿", - "chocolate_bar": "🍫", - "chopsticks": "🥢", - "church": "⛪", - "cigarette": "🚬", - "cinema": "🎦", - "circled_m": "Ⓜ", - "circus_tent": "🎪", - "cityscape": "🏙", - "cityscape_at_dusk": "🌆", - "clamp": "🗜", - "clapper_board": "🎬", - "clapping_hands": "👏", - "clapping_hands_dark_skin_tone": "👏🏿", - "clapping_hands_light_skin_tone": "👏🏻", - "clapping_hands_medium-dark_skin_tone": "👏🏾", - "clapping_hands_medium-light_skin_tone": "👏🏼", - "clapping_hands_medium_skin_tone": "👏🏽", - "classical_building": "🏛", - "clinking_beer_mugs": "🍻", - "clinking_glasses": "🥂", - "clipboard": "📋", - "clockwise_vertical_arrows": "🔃", - "closed_book": "📕", - "closed_mailbox_with_lowered_flag": "📪", - "closed_mailbox_with_raised_flag": "📫", - "closed_umbrella": "🌂", - "cloud": "☁", - "cloud_with_lightning": "🌩", - "cloud_with_lightning_and_rain": "⛈", - "cloud_with_rain": "🌧", - "cloud_with_snow": "🌨", - "clown_face": "🤡", - "club_suit": "♣", - "clutch_bag": "👝", - "coat": "🧥", - "cocktail_glass": "🍸", - "coconut": "🥥", - "coffin": "⚰", - "cold_face": "🥶", - "collision": "💥", - "comet": "☄", - "compass": "🧭", - "computer_disk": "💽", - "computer_mouse": "🖱", - "confetti_ball": "🎊", - "confounded_face": "😖", - "confused_face": "😕", - "construction": "🚧", - "construction_worker": "👷", - "construction_worker_dark_skin_tone": "👷🏿", - "construction_worker_light_skin_tone": "👷🏻", - "construction_worker_medium-dark_skin_tone": "👷🏾", - "construction_worker_medium-light_skin_tone": "👷🏼", - "construction_worker_medium_skin_tone": "👷🏽", - "control_knobs": "🎛", - "convenience_store": "🏪", - "cooked_rice": "🍚", - "cookie": "🍪", - "cooking": "🍳", - "copyright": "©", - "couch_and_lamp": "🛋", - "counterclockwise_arrows_button": "🔄", - "couple_with_heart": "💑", - "couple_with_heart_man_man": "👨\u200d❤️\u200d👨", - "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨", - "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩", - "cow": "🐮", - "cow_face": "🐮", - "cowboy_hat_face": "🤠", - "crab": "🦀", - "crayon": "🖍", - "credit_card": "💳", - "crescent_moon": "🌙", - "cricket": "🦗", - "cricket_game": "🏏", - "crocodile": "🐊", - "croissant": "🥐", - "cross_mark": "❌", - "cross_mark_button": "❎", - "crossed_fingers": "🤞", - "crossed_fingers_dark_skin_tone": "🤞🏿", - "crossed_fingers_light_skin_tone": "🤞🏻", - "crossed_fingers_medium-dark_skin_tone": "🤞🏾", - "crossed_fingers_medium-light_skin_tone": "🤞🏼", - "crossed_fingers_medium_skin_tone": "🤞🏽", - "crossed_flags": "🎌", - "crossed_swords": "⚔", - "crown": "👑", - "crying_cat_face": "😿", - "crying_face": "😢", - "crystal_ball": "🔮", - "cucumber": "🥒", - "cupcake": "🧁", - "cup_with_straw": "🥤", - "curling_stone": "🥌", - "curly_hair": "🦱", - "curly-haired_man": "👨\u200d🦱", - "curly-haired_woman": "👩\u200d🦱", - "curly_loop": "➰", - "currency_exchange": "💱", - "curry_rice": "🍛", - "custard": "🍮", - "customs": "🛃", - "cut_of_meat": "🥩", - "cyclone": "🌀", - "dagger": "🗡", - "dango": "🍡", - "dashing_away": "💨", - "deaf_person": "🧏", - "deciduous_tree": "🌳", - "deer": "🦌", - "delivery_truck": "🚚", - "department_store": "🏬", - "derelict_house": "🏚", - "desert": "🏜", - "desert_island": "🏝", - "desktop_computer": "🖥", - "detective": "🕵", - "detective_dark_skin_tone": "🕵🏿", - "detective_light_skin_tone": "🕵🏻", - "detective_medium-dark_skin_tone": "🕵🏾", - "detective_medium-light_skin_tone": "🕵🏼", - "detective_medium_skin_tone": "🕵🏽", - "diamond_suit": "♦", - "diamond_with_a_dot": "💠", - "dim_button": "🔅", - "direct_hit": "🎯", - "disappointed_face": "😞", - "diving_mask": "🤿", - "diya_lamp": "🪔", - "dizzy": "💫", - "dizzy_face": "😵", - "dna": "🧬", - "dog": "🐶", - "dog_face": "🐶", - "dollar_banknote": "💵", - "dolphin": "🐬", - "door": "🚪", - "dotted_six-pointed_star": "🔯", - "double_curly_loop": "➿", - "double_exclamation_mark": "‼", - "doughnut": "🍩", - "dove": "🕊", - "down-left_arrow": "↙", - "down-right_arrow": "↘", - "down_arrow": "⬇", - "downcast_face_with_sweat": "😓", - "downwards_button": "🔽", - "dragon": "🐉", - "dragon_face": "🐲", - "dress": "👗", - "drooling_face": "🤤", - "drop_of_blood": "🩸", - "droplet": "💧", - "drum": "🥁", - "duck": "🦆", - "dumpling": "🥟", - "dvd": "📀", - "e-mail": "📧", - "eagle": "🦅", - "ear": "👂", - "ear_dark_skin_tone": "👂🏿", - "ear_light_skin_tone": "👂🏻", - "ear_medium-dark_skin_tone": "👂🏾", - "ear_medium-light_skin_tone": "👂🏼", - "ear_medium_skin_tone": "👂🏽", - "ear_of_corn": "🌽", - "ear_with_hearing_aid": "🦻", - "egg": "🍳", - "eggplant": "🍆", - "eight-pointed_star": "✴", - "eight-spoked_asterisk": "✳", - "eight-thirty": "🕣", - "eight_o’clock": "🕗", - "eject_button": "⏏", - "electric_plug": "🔌", - "elephant": "🐘", - "eleven-thirty": "🕦", - "eleven_o’clock": "🕚", - "elf": "🧝", - "elf_dark_skin_tone": "🧝🏿", - "elf_light_skin_tone": "🧝🏻", - "elf_medium-dark_skin_tone": "🧝🏾", - "elf_medium-light_skin_tone": "🧝🏼", - "elf_medium_skin_tone": "🧝🏽", - "envelope": "✉", - "envelope_with_arrow": "📩", - "euro_banknote": "💶", - "evergreen_tree": "🌲", - "ewe": "🐑", - "exclamation_mark": "❗", - "exclamation_question_mark": "⁉", - "exploding_head": "🤯", - "expressionless_face": "😑", - "eye": "👁", - "eye_in_speech_bubble": "👁️\u200d🗨️", - "eyes": "👀", - "face_blowing_a_kiss": "😘", - "face_savoring_food": "😋", - "face_screaming_in_fear": "😱", - "face_vomiting": "🤮", - "face_with_hand_over_mouth": "🤭", - "face_with_head-bandage": "🤕", - "face_with_medical_mask": "😷", - "face_with_monocle": "🧐", - "face_with_open_mouth": "😮", - "face_with_raised_eyebrow": "🤨", - "face_with_rolling_eyes": "🙄", - "face_with_steam_from_nose": "😤", - "face_with_symbols_on_mouth": "🤬", - "face_with_tears_of_joy": "😂", - "face_with_thermometer": "🤒", - "face_with_tongue": "😛", - "face_without_mouth": "😶", - "factory": "🏭", - "fairy": "🧚", - "fairy_dark_skin_tone": "🧚🏿", - "fairy_light_skin_tone": "🧚🏻", - "fairy_medium-dark_skin_tone": "🧚🏾", - "fairy_medium-light_skin_tone": "🧚🏼", - "fairy_medium_skin_tone": "🧚🏽", - "falafel": "🧆", - "fallen_leaf": "🍂", - "family": "👪", - "family_man_boy": "👨\u200d👦", - "family_man_boy_boy": "👨\u200d👦\u200d👦", - "family_man_girl": "👨\u200d👧", - "family_man_girl_boy": "👨\u200d👧\u200d👦", - "family_man_girl_girl": "👨\u200d👧\u200d👧", - "family_man_man_boy": "👨\u200d👨\u200d👦", - "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", - "family_man_man_girl": "👨\u200d👨\u200d👧", - "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", - "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", - "family_man_woman_boy": "👨\u200d👩\u200d👦", - "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", - "family_man_woman_girl": "👨\u200d👩\u200d👧", - "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", - "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", - "family_woman_boy": "👩\u200d👦", - "family_woman_boy_boy": "👩\u200d👦\u200d👦", - "family_woman_girl": "👩\u200d👧", - "family_woman_girl_boy": "👩\u200d👧\u200d👦", - "family_woman_girl_girl": "👩\u200d👧\u200d👧", - "family_woman_woman_boy": "👩\u200d👩\u200d👦", - "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", - "family_woman_woman_girl": "👩\u200d👩\u200d👧", - "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", - "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", - "fast-forward_button": "⏩", - "fast_down_button": "⏬", - "fast_reverse_button": "⏪", - "fast_up_button": "⏫", - "fax_machine": "📠", - "fearful_face": "😨", - "female_sign": "♀", - "ferris_wheel": "🎡", - "ferry": "⛴", - "field_hockey": "🏑", - "file_cabinet": "🗄", - "file_folder": "📁", - "film_frames": "🎞", - "film_projector": "📽", - "fire": "🔥", - "fire_extinguisher": "🧯", - "firecracker": "🧨", - "fire_engine": "🚒", - "fireworks": "🎆", - "first_quarter_moon": "🌓", - "first_quarter_moon_face": "🌛", - "fish": "🐟", - "fish_cake_with_swirl": "🍥", - "fishing_pole": "🎣", - "five-thirty": "🕠", - "five_o’clock": "🕔", - "flag_in_hole": "⛳", - "flamingo": "🦩", - "flashlight": "🔦", - "flat_shoe": "🥿", - "fleur-de-lis": "⚜", - "flexed_biceps": "💪", - "flexed_biceps_dark_skin_tone": "💪🏿", - "flexed_biceps_light_skin_tone": "💪🏻", - "flexed_biceps_medium-dark_skin_tone": "💪🏾", - "flexed_biceps_medium-light_skin_tone": "💪🏼", - "flexed_biceps_medium_skin_tone": "💪🏽", - "floppy_disk": "💾", - "flower_playing_cards": "🎴", - "flushed_face": "😳", - "flying_disc": "🥏", - "flying_saucer": "🛸", - "fog": "🌫", - "foggy": "🌁", - "folded_hands": "🙏", - "folded_hands_dark_skin_tone": "🙏🏿", - "folded_hands_light_skin_tone": "🙏🏻", - "folded_hands_medium-dark_skin_tone": "🙏🏾", - "folded_hands_medium-light_skin_tone": "🙏🏼", - "folded_hands_medium_skin_tone": "🙏🏽", - "foot": "🦶", - "footprints": "👣", - "fork_and_knife": "🍴", - "fork_and_knife_with_plate": "🍽", - "fortune_cookie": "🥠", - "fountain": "⛲", - "fountain_pen": "🖋", - "four-thirty": "🕟", - "four_leaf_clover": "🍀", - "four_o’clock": "🕓", - "fox_face": "🦊", - "framed_picture": "🖼", - "french_fries": "🍟", - "fried_shrimp": "🍤", - "frog_face": "🐸", - "front-facing_baby_chick": "🐥", - "frowning_face": "☹", - "frowning_face_with_open_mouth": "😦", - "fuel_pump": "⛽", - "full_moon": "🌕", - "full_moon_face": "🌝", - "funeral_urn": "⚱", - "game_die": "🎲", - "garlic": "🧄", - "gear": "⚙", - "gem_stone": "💎", - "genie": "🧞", - "ghost": "👻", - "giraffe": "🦒", - "girl": "👧", - "girl_dark_skin_tone": "👧🏿", - "girl_light_skin_tone": "👧🏻", - "girl_medium-dark_skin_tone": "👧🏾", - "girl_medium-light_skin_tone": "👧🏼", - "girl_medium_skin_tone": "👧🏽", - "glass_of_milk": "🥛", - "glasses": "👓", - "globe_showing_americas": "🌎", - "globe_showing_asia-australia": "🌏", - "globe_showing_europe-africa": "🌍", - "globe_with_meridians": "🌐", - "gloves": "🧤", - "glowing_star": "🌟", - "goal_net": "🥅", - "goat": "🐐", - "goblin": "👺", - "goggles": "🥽", - "gorilla": "🦍", - "graduation_cap": "🎓", - "grapes": "🍇", - "green_apple": "🍏", - "green_book": "📗", - "green_circle": "🟢", - "green_heart": "💚", - "green_salad": "🥗", - "green_square": "🟩", - "grimacing_face": "😬", - "grinning_cat_face": "😺", - "grinning_cat_face_with_smiling_eyes": "😸", - "grinning_face": "😀", - "grinning_face_with_big_eyes": "😃", - "grinning_face_with_smiling_eyes": "😄", - "grinning_face_with_sweat": "😅", - "grinning_squinting_face": "😆", - "growing_heart": "💗", - "guard": "💂", - "guard_dark_skin_tone": "💂🏿", - "guard_light_skin_tone": "💂🏻", - "guard_medium-dark_skin_tone": "💂🏾", - "guard_medium-light_skin_tone": "💂🏼", - "guard_medium_skin_tone": "💂🏽", - "guide_dog": "🦮", - "guitar": "🎸", - "hamburger": "🍔", - "hammer": "🔨", - "hammer_and_pick": "⚒", - "hammer_and_wrench": "🛠", - "hamster_face": "🐹", - "hand_with_fingers_splayed": "🖐", - "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿", - "hand_with_fingers_splayed_light_skin_tone": "🖐🏻", - "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾", - "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼", - "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽", - "handbag": "👜", - "handshake": "🤝", - "hatching_chick": "🐣", - "headphone": "🎧", - "hear-no-evil_monkey": "🙉", - "heart_decoration": "💟", - "heart_suit": "♥", - "heart_with_arrow": "💘", - "heart_with_ribbon": "💝", - "heavy_check_mark": "✔", - "heavy_division_sign": "➗", - "heavy_dollar_sign": "💲", - "heavy_heart_exclamation": "❣", - "heavy_large_circle": "⭕", - "heavy_minus_sign": "➖", - "heavy_multiplication_x": "✖", - "heavy_plus_sign": "➕", - "hedgehog": "🦔", - "helicopter": "🚁", - "herb": "🌿", - "hibiscus": "🌺", - "high-heeled_shoe": "👠", - "high-speed_train": "🚄", - "high_voltage": "⚡", - "hiking_boot": "🥾", - "hindu_temple": "🛕", - "hippopotamus": "🦛", - "hole": "🕳", - "honey_pot": "🍯", - "honeybee": "🐝", - "horizontal_traffic_light": "🚥", - "horse": "🐴", - "horse_face": "🐴", - "horse_racing": "🏇", - "horse_racing_dark_skin_tone": "🏇🏿", - "horse_racing_light_skin_tone": "🏇🏻", - "horse_racing_medium-dark_skin_tone": "🏇🏾", - "horse_racing_medium-light_skin_tone": "🏇🏼", - "horse_racing_medium_skin_tone": "🏇🏽", - "hospital": "🏥", - "hot_beverage": "☕", - "hot_dog": "🌭", - "hot_face": "🥵", - "hot_pepper": "🌶", - "hot_springs": "♨", - "hotel": "🏨", - "hourglass_done": "⌛", - "hourglass_not_done": "⏳", - "house": "🏠", - "house_with_garden": "🏡", - "houses": "🏘", - "hugging_face": "🤗", - "hundred_points": "💯", - "hushed_face": "😯", - "ice": "🧊", - "ice_cream": "🍨", - "ice_hockey": "🏒", - "ice_skate": "⛸", - "inbox_tray": "📥", - "incoming_envelope": "📨", - "index_pointing_up": "☝", - "index_pointing_up_dark_skin_tone": "☝🏿", - "index_pointing_up_light_skin_tone": "☝🏻", - "index_pointing_up_medium-dark_skin_tone": "☝🏾", - "index_pointing_up_medium-light_skin_tone": "☝🏼", - "index_pointing_up_medium_skin_tone": "☝🏽", - "infinity": "♾", - "information": "ℹ", - "input_latin_letters": "🔤", - "input_latin_lowercase": "🔡", - "input_latin_uppercase": "🔠", - "input_numbers": "🔢", - "input_symbols": "🔣", - "jack-o-lantern": "🎃", - "jeans": "👖", - "jigsaw": "🧩", - "joker": "🃏", - "joystick": "🕹", - "kaaba": "🕋", - "kangaroo": "🦘", - "key": "🔑", - "keyboard": "⌨", - "keycap_#": "#️⃣", - "keycap_*": "*️⃣", - "keycap_0": "0️⃣", - "keycap_1": "1️⃣", - "keycap_10": "🔟", - "keycap_2": "2️⃣", - "keycap_3": "3️⃣", - "keycap_4": "4️⃣", - "keycap_5": "5️⃣", - "keycap_6": "6️⃣", - "keycap_7": "7️⃣", - "keycap_8": "8️⃣", - "keycap_9": "9️⃣", - "kick_scooter": "🛴", - "kimono": "👘", - "kiss": "💋", - "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨", - "kiss_mark": "💋", - "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨", - "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩", - "kissing_cat_face": "😽", - "kissing_face": "😗", - "kissing_face_with_closed_eyes": "😚", - "kissing_face_with_smiling_eyes": "😙", - "kitchen_knife": "🔪", - "kite": "🪁", - "kiwi_fruit": "🥝", - "koala": "🐨", - "lab_coat": "🥼", - "label": "🏷", - "lacrosse": "🥍", - "lady_beetle": "🐞", - "laptop_computer": "💻", - "large_blue_diamond": "🔷", - "large_orange_diamond": "🔶", - "last_quarter_moon": "🌗", - "last_quarter_moon_face": "🌜", - "last_track_button": "⏮", - "latin_cross": "✝", - "leaf_fluttering_in_wind": "🍃", - "leafy_green": "🥬", - "ledger": "📒", - "left-facing_fist": "🤛", - "left-facing_fist_dark_skin_tone": "🤛🏿", - "left-facing_fist_light_skin_tone": "🤛🏻", - "left-facing_fist_medium-dark_skin_tone": "🤛🏾", - "left-facing_fist_medium-light_skin_tone": "🤛🏼", - "left-facing_fist_medium_skin_tone": "🤛🏽", - "left-right_arrow": "↔", - "left_arrow": "⬅", - "left_arrow_curving_right": "↪", - "left_luggage": "🛅", - "left_speech_bubble": "🗨", - "leg": "🦵", - "lemon": "🍋", - "leopard": "🐆", - "level_slider": "🎚", - "light_bulb": "💡", - "light_rail": "🚈", - "link": "🔗", - "linked_paperclips": "🖇", - "lion_face": "🦁", - "lipstick": "💄", - "litter_in_bin_sign": "🚮", - "lizard": "🦎", - "llama": "🦙", - "lobster": "🦞", - "locked": "🔒", - "locked_with_key": "🔐", - "locked_with_pen": "🔏", - "locomotive": "🚂", - "lollipop": "🍭", - "lotion_bottle": "🧴", - "loudly_crying_face": "😭", - "loudspeaker": "📢", - "love-you_gesture": "🤟", - "love-you_gesture_dark_skin_tone": "🤟🏿", - "love-you_gesture_light_skin_tone": "🤟🏻", - "love-you_gesture_medium-dark_skin_tone": "🤟🏾", - "love-you_gesture_medium-light_skin_tone": "🤟🏼", - "love-you_gesture_medium_skin_tone": "🤟🏽", - "love_hotel": "🏩", - "love_letter": "💌", - "luggage": "🧳", - "lying_face": "🤥", - "mage": "🧙", - "mage_dark_skin_tone": "🧙🏿", - "mage_light_skin_tone": "🧙🏻", - "mage_medium-dark_skin_tone": "🧙🏾", - "mage_medium-light_skin_tone": "🧙🏼", - "mage_medium_skin_tone": "🧙🏽", - "magnet": "🧲", - "magnifying_glass_tilted_left": "🔍", - "magnifying_glass_tilted_right": "🔎", - "mahjong_red_dragon": "🀄", - "male_sign": "♂", - "man": "👨", - "man_and_woman_holding_hands": "👫", - "man_artist": "👨\u200d🎨", - "man_artist_dark_skin_tone": "👨🏿\u200d🎨", - "man_artist_light_skin_tone": "👨🏻\u200d🎨", - "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨", - "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨", - "man_artist_medium_skin_tone": "👨🏽\u200d🎨", - "man_astronaut": "👨\u200d🚀", - "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀", - "man_astronaut_light_skin_tone": "👨🏻\u200d🚀", - "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀", - "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀", - "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀", - "man_biking": "🚴\u200d♂️", - "man_biking_dark_skin_tone": "🚴🏿\u200d♂️", - "man_biking_light_skin_tone": "🚴🏻\u200d♂️", - "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️", - "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️", - "man_biking_medium_skin_tone": "🚴🏽\u200d♂️", - "man_bouncing_ball": "⛹️\u200d♂️", - "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️", - "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️", - "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️", - "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️", - "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️", - "man_bowing": "🙇\u200d♂️", - "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️", - "man_bowing_light_skin_tone": "🙇🏻\u200d♂️", - "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️", - "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️", - "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️", - "man_cartwheeling": "🤸\u200d♂️", - "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️", - "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️", - "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️", - "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️", - "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️", - "man_climbing": "🧗\u200d♂️", - "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️", - "man_climbing_light_skin_tone": "🧗🏻\u200d♂️", - "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️", - "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️", - "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️", - "man_construction_worker": "👷\u200d♂️", - "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️", - "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️", - "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️", - "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️", - "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️", - "man_cook": "👨\u200d🍳", - "man_cook_dark_skin_tone": "👨🏿\u200d🍳", - "man_cook_light_skin_tone": "👨🏻\u200d🍳", - "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳", - "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳", - "man_cook_medium_skin_tone": "👨🏽\u200d🍳", - "man_dancing": "🕺", - "man_dancing_dark_skin_tone": "🕺🏿", - "man_dancing_light_skin_tone": "🕺🏻", - "man_dancing_medium-dark_skin_tone": "🕺🏾", - "man_dancing_medium-light_skin_tone": "🕺🏼", - "man_dancing_medium_skin_tone": "🕺🏽", - "man_dark_skin_tone": "👨🏿", - "man_detective": "🕵️\u200d♂️", - "man_detective_dark_skin_tone": "🕵🏿\u200d♂️", - "man_detective_light_skin_tone": "🕵🏻\u200d♂️", - "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️", - "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️", - "man_detective_medium_skin_tone": "🕵🏽\u200d♂️", - "man_elf": "🧝\u200d♂️", - "man_elf_dark_skin_tone": "🧝🏿\u200d♂️", - "man_elf_light_skin_tone": "🧝🏻\u200d♂️", - "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️", - "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️", - "man_elf_medium_skin_tone": "🧝🏽\u200d♂️", - "man_facepalming": "🤦\u200d♂️", - "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️", - "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️", - "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️", - "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️", - "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️", - "man_factory_worker": "👨\u200d🏭", - "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭", - "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭", - "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭", - "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭", - "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭", - "man_fairy": "🧚\u200d♂️", - "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️", - "man_fairy_light_skin_tone": "🧚🏻\u200d♂️", - "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️", - "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️", - "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️", - "man_farmer": "👨\u200d🌾", - "man_farmer_dark_skin_tone": "👨🏿\u200d🌾", - "man_farmer_light_skin_tone": "👨🏻\u200d🌾", - "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾", - "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾", - "man_farmer_medium_skin_tone": "👨🏽\u200d🌾", - "man_firefighter": "👨\u200d🚒", - "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒", - "man_firefighter_light_skin_tone": "👨🏻\u200d🚒", - "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒", - "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒", - "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒", - "man_frowning": "🙍\u200d♂️", - "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️", - "man_frowning_light_skin_tone": "🙍🏻\u200d♂️", - "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️", - "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️", - "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️", - "man_genie": "🧞\u200d♂️", - "man_gesturing_no": "🙅\u200d♂️", - "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️", - "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️", - "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️", - "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️", - "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️", - "man_gesturing_ok": "🙆\u200d♂️", - "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️", - "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️", - "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️", - "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️", - "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️", - "man_getting_haircut": "💇\u200d♂️", - "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️", - "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️", - "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️", - "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️", - "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️", - "man_getting_massage": "💆\u200d♂️", - "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️", - "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️", - "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️", - "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️", - "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️", - "man_golfing": "🏌️\u200d♂️", - "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️", - "man_golfing_light_skin_tone": "🏌🏻\u200d♂️", - "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️", - "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️", - "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️", - "man_guard": "💂\u200d♂️", - "man_guard_dark_skin_tone": "💂🏿\u200d♂️", - "man_guard_light_skin_tone": "💂🏻\u200d♂️", - "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️", - "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️", - "man_guard_medium_skin_tone": "💂🏽\u200d♂️", - "man_health_worker": "👨\u200d⚕️", - "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️", - "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️", - "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️", - "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️", - "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️", - "man_in_lotus_position": "🧘\u200d♂️", - "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️", - "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️", - "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️", - "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️", - "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️", - "man_in_manual_wheelchair": "👨\u200d🦽", - "man_in_motorized_wheelchair": "👨\u200d🦼", - "man_in_steamy_room": "🧖\u200d♂️", - "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️", - "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️", - "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️", - "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️", - "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️", - "man_in_suit_levitating": "🕴", - "man_in_suit_levitating_dark_skin_tone": "🕴🏿", - "man_in_suit_levitating_light_skin_tone": "🕴🏻", - "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾", - "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼", - "man_in_suit_levitating_medium_skin_tone": "🕴🏽", - "man_in_tuxedo": "🤵", - "man_in_tuxedo_dark_skin_tone": "🤵🏿", - "man_in_tuxedo_light_skin_tone": "🤵🏻", - "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾", - "man_in_tuxedo_medium-light_skin_tone": "🤵🏼", - "man_in_tuxedo_medium_skin_tone": "🤵🏽", - "man_judge": "👨\u200d⚖️", - "man_judge_dark_skin_tone": "👨🏿\u200d⚖️", - "man_judge_light_skin_tone": "👨🏻\u200d⚖️", - "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️", - "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️", - "man_judge_medium_skin_tone": "👨🏽\u200d⚖️", - "man_juggling": "🤹\u200d♂️", - "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️", - "man_juggling_light_skin_tone": "🤹🏻\u200d♂️", - "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️", - "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️", - "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️", - "man_lifting_weights": "🏋️\u200d♂️", - "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️", - "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️", - "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️", - "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️", - "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️", - "man_light_skin_tone": "👨🏻", - "man_mage": "🧙\u200d♂️", - "man_mage_dark_skin_tone": "🧙🏿\u200d♂️", - "man_mage_light_skin_tone": "🧙🏻\u200d♂️", - "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️", - "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️", - "man_mage_medium_skin_tone": "🧙🏽\u200d♂️", - "man_mechanic": "👨\u200d🔧", - "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧", - "man_mechanic_light_skin_tone": "👨🏻\u200d🔧", - "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧", - "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧", - "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧", - "man_medium-dark_skin_tone": "👨🏾", - "man_medium-light_skin_tone": "👨🏼", - "man_medium_skin_tone": "👨🏽", - "man_mountain_biking": "🚵\u200d♂️", - "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️", - "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️", - "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️", - "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️", - "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️", - "man_office_worker": "👨\u200d💼", - "man_office_worker_dark_skin_tone": "👨🏿\u200d💼", - "man_office_worker_light_skin_tone": "👨🏻\u200d💼", - "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼", - "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼", - "man_office_worker_medium_skin_tone": "👨🏽\u200d💼", - "man_pilot": "👨\u200d✈️", - "man_pilot_dark_skin_tone": "👨🏿\u200d✈️", - "man_pilot_light_skin_tone": "👨🏻\u200d✈️", - "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️", - "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️", - "man_pilot_medium_skin_tone": "👨🏽\u200d✈️", - "man_playing_handball": "🤾\u200d♂️", - "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️", - "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️", - "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️", - "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️", - "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️", - "man_playing_water_polo": "🤽\u200d♂️", - "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️", - "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️", - "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️", - "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️", - "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️", - "man_police_officer": "👮\u200d♂️", - "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️", - "man_police_officer_light_skin_tone": "👮🏻\u200d♂️", - "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️", - "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️", - "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️", - "man_pouting": "🙎\u200d♂️", - "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️", - "man_pouting_light_skin_tone": "🙎🏻\u200d♂️", - "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️", - "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️", - "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️", - "man_raising_hand": "🙋\u200d♂️", - "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️", - "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️", - "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️", - "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️", - "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️", - "man_rowing_boat": "🚣\u200d♂️", - "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️", - "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️", - "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️", - "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️", - "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️", - "man_running": "🏃\u200d♂️", - "man_running_dark_skin_tone": "🏃🏿\u200d♂️", - "man_running_light_skin_tone": "🏃🏻\u200d♂️", - "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️", - "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️", - "man_running_medium_skin_tone": "🏃🏽\u200d♂️", - "man_scientist": "👨\u200d🔬", - "man_scientist_dark_skin_tone": "👨🏿\u200d🔬", - "man_scientist_light_skin_tone": "👨🏻\u200d🔬", - "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬", - "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬", - "man_scientist_medium_skin_tone": "👨🏽\u200d🔬", - "man_shrugging": "🤷\u200d♂️", - "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️", - "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️", - "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️", - "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️", - "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️", - "man_singer": "👨\u200d🎤", - "man_singer_dark_skin_tone": "👨🏿\u200d🎤", - "man_singer_light_skin_tone": "👨🏻\u200d🎤", - "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤", - "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤", - "man_singer_medium_skin_tone": "👨🏽\u200d🎤", - "man_student": "👨\u200d🎓", - "man_student_dark_skin_tone": "👨🏿\u200d🎓", - "man_student_light_skin_tone": "👨🏻\u200d🎓", - "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓", - "man_student_medium-light_skin_tone": "👨🏼\u200d🎓", - "man_student_medium_skin_tone": "👨🏽\u200d🎓", - "man_surfing": "🏄\u200d♂️", - "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️", - "man_surfing_light_skin_tone": "🏄🏻\u200d♂️", - "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️", - "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️", - "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️", - "man_swimming": "🏊\u200d♂️", - "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️", - "man_swimming_light_skin_tone": "🏊🏻\u200d♂️", - "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️", - "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️", - "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️", - "man_teacher": "👨\u200d🏫", - "man_teacher_dark_skin_tone": "👨🏿\u200d🏫", - "man_teacher_light_skin_tone": "👨🏻\u200d🏫", - "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫", - "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫", - "man_teacher_medium_skin_tone": "👨🏽\u200d🏫", - "man_technologist": "👨\u200d💻", - "man_technologist_dark_skin_tone": "👨🏿\u200d💻", - "man_technologist_light_skin_tone": "👨🏻\u200d💻", - "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻", - "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻", - "man_technologist_medium_skin_tone": "👨🏽\u200d💻", - "man_tipping_hand": "💁\u200d♂️", - "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️", - "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️", - "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️", - "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️", - "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️", - "man_vampire": "🧛\u200d♂️", - "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️", - "man_vampire_light_skin_tone": "🧛🏻\u200d♂️", - "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️", - "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️", - "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️", - "man_walking": "🚶\u200d♂️", - "man_walking_dark_skin_tone": "🚶🏿\u200d♂️", - "man_walking_light_skin_tone": "🚶🏻\u200d♂️", - "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️", - "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️", - "man_walking_medium_skin_tone": "🚶🏽\u200d♂️", - "man_wearing_turban": "👳\u200d♂️", - "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️", - "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️", - "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️", - "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️", - "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️", - "man_with_probing_cane": "👨\u200d🦯", - "man_with_chinese_cap": "👲", - "man_with_chinese_cap_dark_skin_tone": "👲🏿", - "man_with_chinese_cap_light_skin_tone": "👲🏻", - "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾", - "man_with_chinese_cap_medium-light_skin_tone": "👲🏼", - "man_with_chinese_cap_medium_skin_tone": "👲🏽", - "man_zombie": "🧟\u200d♂️", - "mango": "🥭", - "mantelpiece_clock": "🕰", - "manual_wheelchair": "🦽", - "man’s_shoe": "👞", - "map_of_japan": "🗾", - "maple_leaf": "🍁", - "martial_arts_uniform": "🥋", - "mate": "🧉", - "meat_on_bone": "🍖", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "medical_symbol": "⚕", - "megaphone": "📣", - "melon": "🍈", - "memo": "📝", - "men_with_bunny_ears": "👯\u200d♂️", - "men_wrestling": "🤼\u200d♂️", - "menorah": "🕎", - "men’s_room": "🚹", - "mermaid": "🧜\u200d♀️", - "mermaid_dark_skin_tone": "🧜🏿\u200d♀️", - "mermaid_light_skin_tone": "🧜🏻\u200d♀️", - "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️", - "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️", - "mermaid_medium_skin_tone": "🧜🏽\u200d♀️", - "merman": "🧜\u200d♂️", - "merman_dark_skin_tone": "🧜🏿\u200d♂️", - "merman_light_skin_tone": "🧜🏻\u200d♂️", - "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️", - "merman_medium-light_skin_tone": "🧜🏼\u200d♂️", - "merman_medium_skin_tone": "🧜🏽\u200d♂️", - "merperson": "🧜", - "merperson_dark_skin_tone": "🧜🏿", - "merperson_light_skin_tone": "🧜🏻", - "merperson_medium-dark_skin_tone": "🧜🏾", - "merperson_medium-light_skin_tone": "🧜🏼", - "merperson_medium_skin_tone": "🧜🏽", - "metro": "🚇", - "microbe": "🦠", - "microphone": "🎤", - "microscope": "🔬", - "middle_finger": "🖕", - "middle_finger_dark_skin_tone": "🖕🏿", - "middle_finger_light_skin_tone": "🖕🏻", - "middle_finger_medium-dark_skin_tone": "🖕🏾", - "middle_finger_medium-light_skin_tone": "🖕🏼", - "middle_finger_medium_skin_tone": "🖕🏽", - "military_medal": "🎖", - "milky_way": "🌌", - "minibus": "🚐", - "moai": "🗿", - "mobile_phone": "📱", - "mobile_phone_off": "📴", - "mobile_phone_with_arrow": "📲", - "money-mouth_face": "🤑", - "money_bag": "💰", - "money_with_wings": "💸", - "monkey": "🐒", - "monkey_face": "🐵", - "monorail": "🚝", - "moon_cake": "🥮", - "moon_viewing_ceremony": "🎑", - "mosque": "🕌", - "mosquito": "🦟", - "motor_boat": "🛥", - "motor_scooter": "🛵", - "motorcycle": "🏍", - "motorized_wheelchair": "🦼", - "motorway": "🛣", - "mount_fuji": "🗻", - "mountain": "⛰", - "mountain_cableway": "🚠", - "mountain_railway": "🚞", - "mouse": "🐭", - "mouse_face": "🐭", - "mouth": "👄", - "movie_camera": "🎥", - "mushroom": "🍄", - "musical_keyboard": "🎹", - "musical_note": "🎵", - "musical_notes": "🎶", - "musical_score": "🎼", - "muted_speaker": "🔇", - "nail_polish": "💅", - "nail_polish_dark_skin_tone": "💅🏿", - "nail_polish_light_skin_tone": "💅🏻", - "nail_polish_medium-dark_skin_tone": "💅🏾", - "nail_polish_medium-light_skin_tone": "💅🏼", - "nail_polish_medium_skin_tone": "💅🏽", - "name_badge": "📛", - "national_park": "🏞", - "nauseated_face": "🤢", - "nazar_amulet": "🧿", - "necktie": "👔", - "nerd_face": "🤓", - "neutral_face": "😐", - "new_moon": "🌑", - "new_moon_face": "🌚", - "newspaper": "📰", - "next_track_button": "⏭", - "night_with_stars": "🌃", - "nine-thirty": "🕤", - "nine_o’clock": "🕘", - "no_bicycles": "🚳", - "no_entry": "⛔", - "no_littering": "🚯", - "no_mobile_phones": "📵", - "no_one_under_eighteen": "🔞", - "no_pedestrians": "🚷", - "no_smoking": "🚭", - "non-potable_water": "🚱", - "nose": "👃", - "nose_dark_skin_tone": "👃🏿", - "nose_light_skin_tone": "👃🏻", - "nose_medium-dark_skin_tone": "👃🏾", - "nose_medium-light_skin_tone": "👃🏼", - "nose_medium_skin_tone": "👃🏽", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "nut_and_bolt": "🔩", - "octopus": "🐙", - "oden": "🍢", - "office_building": "🏢", - "ogre": "👹", - "oil_drum": "🛢", - "old_key": "🗝", - "old_man": "👴", - "old_man_dark_skin_tone": "👴🏿", - "old_man_light_skin_tone": "👴🏻", - "old_man_medium-dark_skin_tone": "👴🏾", - "old_man_medium-light_skin_tone": "👴🏼", - "old_man_medium_skin_tone": "👴🏽", - "old_woman": "👵", - "old_woman_dark_skin_tone": "👵🏿", - "old_woman_light_skin_tone": "👵🏻", - "old_woman_medium-dark_skin_tone": "👵🏾", - "old_woman_medium-light_skin_tone": "👵🏼", - "old_woman_medium_skin_tone": "👵🏽", - "older_adult": "🧓", - "older_adult_dark_skin_tone": "🧓🏿", - "older_adult_light_skin_tone": "🧓🏻", - "older_adult_medium-dark_skin_tone": "🧓🏾", - "older_adult_medium-light_skin_tone": "🧓🏼", - "older_adult_medium_skin_tone": "🧓🏽", - "om": "🕉", - "oncoming_automobile": "🚘", - "oncoming_bus": "🚍", - "oncoming_fist": "👊", - "oncoming_fist_dark_skin_tone": "👊🏿", - "oncoming_fist_light_skin_tone": "👊🏻", - "oncoming_fist_medium-dark_skin_tone": "👊🏾", - "oncoming_fist_medium-light_skin_tone": "👊🏼", - "oncoming_fist_medium_skin_tone": "👊🏽", - "oncoming_police_car": "🚔", - "oncoming_taxi": "🚖", - "one-piece_swimsuit": "🩱", - "one-thirty": "🕜", - "one_o’clock": "🕐", - "onion": "🧅", - "open_book": "📖", - "open_file_folder": "📂", - "open_hands": "👐", - "open_hands_dark_skin_tone": "👐🏿", - "open_hands_light_skin_tone": "👐🏻", - "open_hands_medium-dark_skin_tone": "👐🏾", - "open_hands_medium-light_skin_tone": "👐🏼", - "open_hands_medium_skin_tone": "👐🏽", - "open_mailbox_with_lowered_flag": "📭", - "open_mailbox_with_raised_flag": "📬", - "optical_disk": "💿", - "orange_book": "📙", - "orange_circle": "🟠", - "orange_heart": "🧡", - "orange_square": "🟧", - "orangutan": "🦧", - "orthodox_cross": "☦", - "otter": "🦦", - "outbox_tray": "📤", - "owl": "🦉", - "ox": "🐂", - "oyster": "🦪", - "package": "📦", - "page_facing_up": "📄", - "page_with_curl": "📃", - "pager": "📟", - "paintbrush": "🖌", - "palm_tree": "🌴", - "palms_up_together": "🤲", - "palms_up_together_dark_skin_tone": "🤲🏿", - "palms_up_together_light_skin_tone": "🤲🏻", - "palms_up_together_medium-dark_skin_tone": "🤲🏾", - "palms_up_together_medium-light_skin_tone": "🤲🏼", - "palms_up_together_medium_skin_tone": "🤲🏽", - "pancakes": "🥞", - "panda_face": "🐼", - "paperclip": "📎", - "parrot": "🦜", - "part_alternation_mark": "〽", - "party_popper": "🎉", - "partying_face": "🥳", - "passenger_ship": "🛳", - "passport_control": "🛂", - "pause_button": "⏸", - "paw_prints": "🐾", - "peace_symbol": "☮", - "peach": "🍑", - "peacock": "🦚", - "peanuts": "🥜", - "pear": "🍐", - "pen": "🖊", - "pencil": "📝", - "penguin": "🐧", - "pensive_face": "😔", - "people_holding_hands": "🧑\u200d🤝\u200d🧑", - "people_with_bunny_ears": "👯", - "people_wrestling": "🤼", - "performing_arts": "🎭", - "persevering_face": "😣", - "person_biking": "🚴", - "person_biking_dark_skin_tone": "🚴🏿", - "person_biking_light_skin_tone": "🚴🏻", - "person_biking_medium-dark_skin_tone": "🚴🏾", - "person_biking_medium-light_skin_tone": "🚴🏼", - "person_biking_medium_skin_tone": "🚴🏽", - "person_bouncing_ball": "⛹", - "person_bouncing_ball_dark_skin_tone": "⛹🏿", - "person_bouncing_ball_light_skin_tone": "⛹🏻", - "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾", - "person_bouncing_ball_medium-light_skin_tone": "⛹🏼", - "person_bouncing_ball_medium_skin_tone": "⛹🏽", - "person_bowing": "🙇", - "person_bowing_dark_skin_tone": "🙇🏿", - "person_bowing_light_skin_tone": "🙇🏻", - "person_bowing_medium-dark_skin_tone": "🙇🏾", - "person_bowing_medium-light_skin_tone": "🙇🏼", - "person_bowing_medium_skin_tone": "🙇🏽", - "person_cartwheeling": "🤸", - "person_cartwheeling_dark_skin_tone": "🤸🏿", - "person_cartwheeling_light_skin_tone": "🤸🏻", - "person_cartwheeling_medium-dark_skin_tone": "🤸🏾", - "person_cartwheeling_medium-light_skin_tone": "🤸🏼", - "person_cartwheeling_medium_skin_tone": "🤸🏽", - "person_climbing": "🧗", - "person_climbing_dark_skin_tone": "🧗🏿", - "person_climbing_light_skin_tone": "🧗🏻", - "person_climbing_medium-dark_skin_tone": "🧗🏾", - "person_climbing_medium-light_skin_tone": "🧗🏼", - "person_climbing_medium_skin_tone": "🧗🏽", - "person_facepalming": "🤦", - "person_facepalming_dark_skin_tone": "🤦🏿", - "person_facepalming_light_skin_tone": "🤦🏻", - "person_facepalming_medium-dark_skin_tone": "🤦🏾", - "person_facepalming_medium-light_skin_tone": "🤦🏼", - "person_facepalming_medium_skin_tone": "🤦🏽", - "person_fencing": "🤺", - "person_frowning": "🙍", - "person_frowning_dark_skin_tone": "🙍🏿", - "person_frowning_light_skin_tone": "🙍🏻", - "person_frowning_medium-dark_skin_tone": "🙍🏾", - "person_frowning_medium-light_skin_tone": "🙍🏼", - "person_frowning_medium_skin_tone": "🙍🏽", - "person_gesturing_no": "🙅", - "person_gesturing_no_dark_skin_tone": "🙅🏿", - "person_gesturing_no_light_skin_tone": "🙅🏻", - "person_gesturing_no_medium-dark_skin_tone": "🙅🏾", - "person_gesturing_no_medium-light_skin_tone": "🙅🏼", - "person_gesturing_no_medium_skin_tone": "🙅🏽", - "person_gesturing_ok": "🙆", - "person_gesturing_ok_dark_skin_tone": "🙆🏿", - "person_gesturing_ok_light_skin_tone": "🙆🏻", - "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾", - "person_gesturing_ok_medium-light_skin_tone": "🙆🏼", - "person_gesturing_ok_medium_skin_tone": "🙆🏽", - "person_getting_haircut": "💇", - "person_getting_haircut_dark_skin_tone": "💇🏿", - "person_getting_haircut_light_skin_tone": "💇🏻", - "person_getting_haircut_medium-dark_skin_tone": "💇🏾", - "person_getting_haircut_medium-light_skin_tone": "💇🏼", - "person_getting_haircut_medium_skin_tone": "💇🏽", - "person_getting_massage": "💆", - "person_getting_massage_dark_skin_tone": "💆🏿", - "person_getting_massage_light_skin_tone": "💆🏻", - "person_getting_massage_medium-dark_skin_tone": "💆🏾", - "person_getting_massage_medium-light_skin_tone": "💆🏼", - "person_getting_massage_medium_skin_tone": "💆🏽", - "person_golfing": "🏌", - "person_golfing_dark_skin_tone": "🏌🏿", - "person_golfing_light_skin_tone": "🏌🏻", - "person_golfing_medium-dark_skin_tone": "🏌🏾", - "person_golfing_medium-light_skin_tone": "🏌🏼", - "person_golfing_medium_skin_tone": "🏌🏽", - "person_in_bed": "🛌", - "person_in_bed_dark_skin_tone": "🛌🏿", - "person_in_bed_light_skin_tone": "🛌🏻", - "person_in_bed_medium-dark_skin_tone": "🛌🏾", - "person_in_bed_medium-light_skin_tone": "🛌🏼", - "person_in_bed_medium_skin_tone": "🛌🏽", - "person_in_lotus_position": "🧘", - "person_in_lotus_position_dark_skin_tone": "🧘🏿", - "person_in_lotus_position_light_skin_tone": "🧘🏻", - "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾", - "person_in_lotus_position_medium-light_skin_tone": "🧘🏼", - "person_in_lotus_position_medium_skin_tone": "🧘🏽", - "person_in_steamy_room": "🧖", - "person_in_steamy_room_dark_skin_tone": "🧖🏿", - "person_in_steamy_room_light_skin_tone": "🧖🏻", - "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾", - "person_in_steamy_room_medium-light_skin_tone": "🧖🏼", - "person_in_steamy_room_medium_skin_tone": "🧖🏽", - "person_juggling": "🤹", - "person_juggling_dark_skin_tone": "🤹🏿", - "person_juggling_light_skin_tone": "🤹🏻", - "person_juggling_medium-dark_skin_tone": "🤹🏾", - "person_juggling_medium-light_skin_tone": "🤹🏼", - "person_juggling_medium_skin_tone": "🤹🏽", - "person_kneeling": "🧎", - "person_lifting_weights": "🏋", - "person_lifting_weights_dark_skin_tone": "🏋🏿", - "person_lifting_weights_light_skin_tone": "🏋🏻", - "person_lifting_weights_medium-dark_skin_tone": "🏋🏾", - "person_lifting_weights_medium-light_skin_tone": "🏋🏼", - "person_lifting_weights_medium_skin_tone": "🏋🏽", - "person_mountain_biking": "🚵", - "person_mountain_biking_dark_skin_tone": "🚵🏿", - "person_mountain_biking_light_skin_tone": "🚵🏻", - "person_mountain_biking_medium-dark_skin_tone": "🚵🏾", - "person_mountain_biking_medium-light_skin_tone": "🚵🏼", - "person_mountain_biking_medium_skin_tone": "🚵🏽", - "person_playing_handball": "🤾", - "person_playing_handball_dark_skin_tone": "🤾🏿", - "person_playing_handball_light_skin_tone": "🤾🏻", - "person_playing_handball_medium-dark_skin_tone": "🤾🏾", - "person_playing_handball_medium-light_skin_tone": "🤾🏼", - "person_playing_handball_medium_skin_tone": "🤾🏽", - "person_playing_water_polo": "🤽", - "person_playing_water_polo_dark_skin_tone": "🤽🏿", - "person_playing_water_polo_light_skin_tone": "🤽🏻", - "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾", - "person_playing_water_polo_medium-light_skin_tone": "🤽🏼", - "person_playing_water_polo_medium_skin_tone": "🤽🏽", - "person_pouting": "🙎", - "person_pouting_dark_skin_tone": "🙎🏿", - "person_pouting_light_skin_tone": "🙎🏻", - "person_pouting_medium-dark_skin_tone": "🙎🏾", - "person_pouting_medium-light_skin_tone": "🙎🏼", - "person_pouting_medium_skin_tone": "🙎🏽", - "person_raising_hand": "🙋", - "person_raising_hand_dark_skin_tone": "🙋🏿", - "person_raising_hand_light_skin_tone": "🙋🏻", - "person_raising_hand_medium-dark_skin_tone": "🙋🏾", - "person_raising_hand_medium-light_skin_tone": "🙋🏼", - "person_raising_hand_medium_skin_tone": "🙋🏽", - "person_rowing_boat": "🚣", - "person_rowing_boat_dark_skin_tone": "🚣🏿", - "person_rowing_boat_light_skin_tone": "🚣🏻", - "person_rowing_boat_medium-dark_skin_tone": "🚣🏾", - "person_rowing_boat_medium-light_skin_tone": "🚣🏼", - "person_rowing_boat_medium_skin_tone": "🚣🏽", - "person_running": "🏃", - "person_running_dark_skin_tone": "🏃🏿", - "person_running_light_skin_tone": "🏃🏻", - "person_running_medium-dark_skin_tone": "🏃🏾", - "person_running_medium-light_skin_tone": "🏃🏼", - "person_running_medium_skin_tone": "🏃🏽", - "person_shrugging": "🤷", - "person_shrugging_dark_skin_tone": "🤷🏿", - "person_shrugging_light_skin_tone": "🤷🏻", - "person_shrugging_medium-dark_skin_tone": "🤷🏾", - "person_shrugging_medium-light_skin_tone": "🤷🏼", - "person_shrugging_medium_skin_tone": "🤷🏽", - "person_standing": "🧍", - "person_surfing": "🏄", - "person_surfing_dark_skin_tone": "🏄🏿", - "person_surfing_light_skin_tone": "🏄🏻", - "person_surfing_medium-dark_skin_tone": "🏄🏾", - "person_surfing_medium-light_skin_tone": "🏄🏼", - "person_surfing_medium_skin_tone": "🏄🏽", - "person_swimming": "🏊", - "person_swimming_dark_skin_tone": "🏊🏿", - "person_swimming_light_skin_tone": "🏊🏻", - "person_swimming_medium-dark_skin_tone": "🏊🏾", - "person_swimming_medium-light_skin_tone": "🏊🏼", - "person_swimming_medium_skin_tone": "🏊🏽", - "person_taking_bath": "🛀", - "person_taking_bath_dark_skin_tone": "🛀🏿", - "person_taking_bath_light_skin_tone": "🛀🏻", - "person_taking_bath_medium-dark_skin_tone": "🛀🏾", - "person_taking_bath_medium-light_skin_tone": "🛀🏼", - "person_taking_bath_medium_skin_tone": "🛀🏽", - "person_tipping_hand": "💁", - "person_tipping_hand_dark_skin_tone": "💁🏿", - "person_tipping_hand_light_skin_tone": "💁🏻", - "person_tipping_hand_medium-dark_skin_tone": "💁🏾", - "person_tipping_hand_medium-light_skin_tone": "💁🏼", - "person_tipping_hand_medium_skin_tone": "💁🏽", - "person_walking": "🚶", - "person_walking_dark_skin_tone": "🚶🏿", - "person_walking_light_skin_tone": "🚶🏻", - "person_walking_medium-dark_skin_tone": "🚶🏾", - "person_walking_medium-light_skin_tone": "🚶🏼", - "person_walking_medium_skin_tone": "🚶🏽", - "person_wearing_turban": "👳", - "person_wearing_turban_dark_skin_tone": "👳🏿", - "person_wearing_turban_light_skin_tone": "👳🏻", - "person_wearing_turban_medium-dark_skin_tone": "👳🏾", - "person_wearing_turban_medium-light_skin_tone": "👳🏼", - "person_wearing_turban_medium_skin_tone": "👳🏽", - "petri_dish": "🧫", - "pick": "⛏", - "pie": "🥧", - "pig": "🐷", - "pig_face": "🐷", - "pig_nose": "🐽", - "pile_of_poo": "💩", - "pill": "💊", - "pinching_hand": "🤏", - "pine_decoration": "🎍", - "pineapple": "🍍", - "ping_pong": "🏓", - "pirate_flag": "🏴\u200d☠️", - "pistol": "🔫", - "pizza": "🍕", - "place_of_worship": "🛐", - "play_button": "▶", - "play_or_pause_button": "⏯", - "pleading_face": "🥺", - "police_car": "🚓", - "police_car_light": "🚨", - "police_officer": "👮", - "police_officer_dark_skin_tone": "👮🏿", - "police_officer_light_skin_tone": "👮🏻", - "police_officer_medium-dark_skin_tone": "👮🏾", - "police_officer_medium-light_skin_tone": "👮🏼", - "police_officer_medium_skin_tone": "👮🏽", - "poodle": "🐩", - "pool_8_ball": "🎱", - "popcorn": "🍿", - "post_office": "🏣", - "postal_horn": "📯", - "postbox": "📮", - "pot_of_food": "🍲", - "potable_water": "🚰", - "potato": "🥔", - "poultry_leg": "🍗", - "pound_banknote": "💷", - "pouting_cat_face": "😾", - "pouting_face": "😡", - "prayer_beads": "📿", - "pregnant_woman": "🤰", - "pregnant_woman_dark_skin_tone": "🤰🏿", - "pregnant_woman_light_skin_tone": "🤰🏻", - "pregnant_woman_medium-dark_skin_tone": "🤰🏾", - "pregnant_woman_medium-light_skin_tone": "🤰🏼", - "pregnant_woman_medium_skin_tone": "🤰🏽", - "pretzel": "🥨", - "probing_cane": "🦯", - "prince": "🤴", - "prince_dark_skin_tone": "🤴🏿", - "prince_light_skin_tone": "🤴🏻", - "prince_medium-dark_skin_tone": "🤴🏾", - "prince_medium-light_skin_tone": "🤴🏼", - "prince_medium_skin_tone": "🤴🏽", - "princess": "👸", - "princess_dark_skin_tone": "👸🏿", - "princess_light_skin_tone": "👸🏻", - "princess_medium-dark_skin_tone": "👸🏾", - "princess_medium-light_skin_tone": "👸🏼", - "princess_medium_skin_tone": "👸🏽", - "printer": "🖨", - "prohibited": "🚫", - "purple_circle": "🟣", - "purple_heart": "💜", - "purple_square": "🟪", - "purse": "👛", - "pushpin": "📌", - "question_mark": "❓", - "rabbit": "🐰", - "rabbit_face": "🐰", - "raccoon": "🦝", - "racing_car": "🏎", - "radio": "📻", - "radio_button": "🔘", - "radioactive": "☢", - "railway_car": "🚃", - "railway_track": "🛤", - "rainbow": "🌈", - "rainbow_flag": "🏳️\u200d🌈", - "raised_back_of_hand": "🤚", - "raised_back_of_hand_dark_skin_tone": "🤚🏿", - "raised_back_of_hand_light_skin_tone": "🤚🏻", - "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾", - "raised_back_of_hand_medium-light_skin_tone": "🤚🏼", - "raised_back_of_hand_medium_skin_tone": "🤚🏽", - "raised_fist": "✊", - "raised_fist_dark_skin_tone": "✊🏿", - "raised_fist_light_skin_tone": "✊🏻", - "raised_fist_medium-dark_skin_tone": "✊🏾", - "raised_fist_medium-light_skin_tone": "✊🏼", - "raised_fist_medium_skin_tone": "✊🏽", - "raised_hand": "✋", - "raised_hand_dark_skin_tone": "✋🏿", - "raised_hand_light_skin_tone": "✋🏻", - "raised_hand_medium-dark_skin_tone": "✋🏾", - "raised_hand_medium-light_skin_tone": "✋🏼", - "raised_hand_medium_skin_tone": "✋🏽", - "raising_hands": "🙌", - "raising_hands_dark_skin_tone": "🙌🏿", - "raising_hands_light_skin_tone": "🙌🏻", - "raising_hands_medium-dark_skin_tone": "🙌🏾", - "raising_hands_medium-light_skin_tone": "🙌🏼", - "raising_hands_medium_skin_tone": "🙌🏽", - "ram": "🐏", - "rat": "🐀", - "razor": "🪒", - "ringed_planet": "🪐", - "receipt": "🧾", - "record_button": "⏺", - "recycling_symbol": "♻", - "red_apple": "🍎", - "red_circle": "🔴", - "red_envelope": "🧧", - "red_hair": "🦰", - "red-haired_man": "👨\u200d🦰", - "red-haired_woman": "👩\u200d🦰", - "red_heart": "❤", - "red_paper_lantern": "🏮", - "red_square": "🟥", - "red_triangle_pointed_down": "🔻", - "red_triangle_pointed_up": "🔺", - "registered": "®", - "relieved_face": "😌", - "reminder_ribbon": "🎗", - "repeat_button": "🔁", - "repeat_single_button": "🔂", - "rescue_worker’s_helmet": "⛑", - "restroom": "🚻", - "reverse_button": "◀", - "revolving_hearts": "💞", - "rhinoceros": "🦏", - "ribbon": "🎀", - "rice_ball": "🍙", - "rice_cracker": "🍘", - "right-facing_fist": "🤜", - "right-facing_fist_dark_skin_tone": "🤜🏿", - "right-facing_fist_light_skin_tone": "🤜🏻", - "right-facing_fist_medium-dark_skin_tone": "🤜🏾", - "right-facing_fist_medium-light_skin_tone": "🤜🏼", - "right-facing_fist_medium_skin_tone": "🤜🏽", - "right_anger_bubble": "🗯", - "right_arrow": "➡", - "right_arrow_curving_down": "⤵", - "right_arrow_curving_left": "↩", - "right_arrow_curving_up": "⤴", - "ring": "💍", - "roasted_sweet_potato": "🍠", - "robot_face": "🤖", - "rocket": "🚀", - "roll_of_paper": "🧻", - "rolled-up_newspaper": "🗞", - "roller_coaster": "🎢", - "rolling_on_the_floor_laughing": "🤣", - "rooster": "🐓", - "rose": "🌹", - "rosette": "🏵", - "round_pushpin": "📍", - "rugby_football": "🏉", - "running_shirt": "🎽", - "running_shoe": "👟", - "sad_but_relieved_face": "😥", - "safety_pin": "🧷", - "safety_vest": "🦺", - "salt": "🧂", - "sailboat": "⛵", - "sake": "🍶", - "sandwich": "🥪", - "sari": "🥻", - "satellite": "📡", - "satellite_antenna": "📡", - "sauropod": "🦕", - "saxophone": "🎷", - "scarf": "🧣", - "school": "🏫", - "school_backpack": "🎒", - "scissors": "✂", - "scorpion": "🦂", - "scroll": "📜", - "seat": "💺", - "see-no-evil_monkey": "🙈", - "seedling": "🌱", - "selfie": "🤳", - "selfie_dark_skin_tone": "🤳🏿", - "selfie_light_skin_tone": "🤳🏻", - "selfie_medium-dark_skin_tone": "🤳🏾", - "selfie_medium-light_skin_tone": "🤳🏼", - "selfie_medium_skin_tone": "🤳🏽", - "service_dog": "🐕\u200d🦺", - "seven-thirty": "🕢", - "seven_o’clock": "🕖", - "shallow_pan_of_food": "🥘", - "shamrock": "☘", - "shark": "🦈", - "shaved_ice": "🍧", - "sheaf_of_rice": "🌾", - "shield": "🛡", - "shinto_shrine": "⛩", - "ship": "🚢", - "shooting_star": "🌠", - "shopping_bags": "🛍", - "shopping_cart": "🛒", - "shortcake": "🍰", - "shorts": "🩳", - "shower": "🚿", - "shrimp": "🦐", - "shuffle_tracks_button": "🔀", - "shushing_face": "🤫", - "sign_of_the_horns": "🤘", - "sign_of_the_horns_dark_skin_tone": "🤘🏿", - "sign_of_the_horns_light_skin_tone": "🤘🏻", - "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾", - "sign_of_the_horns_medium-light_skin_tone": "🤘🏼", - "sign_of_the_horns_medium_skin_tone": "🤘🏽", - "six-thirty": "🕡", - "six_o’clock": "🕕", - "skateboard": "🛹", - "skier": "⛷", - "skis": "🎿", - "skull": "💀", - "skull_and_crossbones": "☠", - "skunk": "🦨", - "sled": "🛷", - "sleeping_face": "😴", - "sleepy_face": "😪", - "slightly_frowning_face": "🙁", - "slightly_smiling_face": "🙂", - "slot_machine": "🎰", - "sloth": "🦥", - "small_airplane": "🛩", - "small_blue_diamond": "🔹", - "small_orange_diamond": "🔸", - "smiling_cat_face_with_heart-eyes": "😻", - "smiling_face": "☺", - "smiling_face_with_halo": "😇", - "smiling_face_with_3_hearts": "🥰", - "smiling_face_with_heart-eyes": "😍", - "smiling_face_with_horns": "😈", - "smiling_face_with_smiling_eyes": "😊", - "smiling_face_with_sunglasses": "😎", - "smirking_face": "😏", - "snail": "🐌", - "snake": "🐍", - "sneezing_face": "🤧", - "snow-capped_mountain": "🏔", - "snowboarder": "🏂", - "snowboarder_dark_skin_tone": "🏂🏿", - "snowboarder_light_skin_tone": "🏂🏻", - "snowboarder_medium-dark_skin_tone": "🏂🏾", - "snowboarder_medium-light_skin_tone": "🏂🏼", - "snowboarder_medium_skin_tone": "🏂🏽", - "snowflake": "❄", - "snowman": "☃", - "snowman_without_snow": "⛄", - "soap": "🧼", - "soccer_ball": "⚽", - "socks": "🧦", - "softball": "🥎", - "soft_ice_cream": "🍦", - "spade_suit": "♠", - "spaghetti": "🍝", - "sparkle": "❇", - "sparkler": "🎇", - "sparkles": "✨", - "sparkling_heart": "💖", - "speak-no-evil_monkey": "🙊", - "speaker_high_volume": "🔊", - "speaker_low_volume": "🔈", - "speaker_medium_volume": "🔉", - "speaking_head": "🗣", - "speech_balloon": "💬", - "speedboat": "🚤", - "spider": "🕷", - "spider_web": "🕸", - "spiral_calendar": "🗓", - "spiral_notepad": "🗒", - "spiral_shell": "🐚", - "spoon": "🥄", - "sponge": "🧽", - "sport_utility_vehicle": "🚙", - "sports_medal": "🏅", - "spouting_whale": "🐳", - "squid": "🦑", - "squinting_face_with_tongue": "😝", - "stadium": "🏟", - "star-struck": "🤩", - "star_and_crescent": "☪", - "star_of_david": "✡", - "station": "🚉", - "steaming_bowl": "🍜", - "stethoscope": "🩺", - "stop_button": "⏹", - "stop_sign": "🛑", - "stopwatch": "⏱", - "straight_ruler": "📏", - "strawberry": "🍓", - "studio_microphone": "🎙", - "stuffed_flatbread": "🥙", - "sun": "☀", - "sun_behind_cloud": "⛅", - "sun_behind_large_cloud": "🌥", - "sun_behind_rain_cloud": "🌦", - "sun_behind_small_cloud": "🌤", - "sun_with_face": "🌞", - "sunflower": "🌻", - "sunglasses": "😎", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "sunset": "🌇", - "superhero": "🦸", - "supervillain": "🦹", - "sushi": "🍣", - "suspension_railway": "🚟", - "swan": "🦢", - "sweat_droplets": "💦", - "synagogue": "🕍", - "syringe": "💉", - "t-shirt": "👕", - "taco": "🌮", - "takeout_box": "🥡", - "tanabata_tree": "🎋", - "tangerine": "🍊", - "taxi": "🚕", - "teacup_without_handle": "🍵", - "tear-off_calendar": "📆", - "teddy_bear": "🧸", - "telephone": "☎", - "telephone_receiver": "📞", - "telescope": "🔭", - "television": "📺", - "ten-thirty": "🕥", - "ten_o’clock": "🕙", - "tennis": "🎾", - "tent": "⛺", - "test_tube": "🧪", - "thermometer": "🌡", - "thinking_face": "🤔", - "thought_balloon": "💭", - "thread": "🧵", - "three-thirty": "🕞", - "three_o’clock": "🕒", - "thumbs_down": "👎", - "thumbs_down_dark_skin_tone": "👎🏿", - "thumbs_down_light_skin_tone": "👎🏻", - "thumbs_down_medium-dark_skin_tone": "👎🏾", - "thumbs_down_medium-light_skin_tone": "👎🏼", - "thumbs_down_medium_skin_tone": "👎🏽", - "thumbs_up": "👍", - "thumbs_up_dark_skin_tone": "👍🏿", - "thumbs_up_light_skin_tone": "👍🏻", - "thumbs_up_medium-dark_skin_tone": "👍🏾", - "thumbs_up_medium-light_skin_tone": "👍🏼", - "thumbs_up_medium_skin_tone": "👍🏽", - "ticket": "🎫", - "tiger": "🐯", - "tiger_face": "🐯", - "timer_clock": "⏲", - "tired_face": "😫", - "toolbox": "🧰", - "toilet": "🚽", - "tomato": "🍅", - "tongue": "👅", - "tooth": "🦷", - "top_hat": "🎩", - "tornado": "🌪", - "trackball": "🖲", - "tractor": "🚜", - "trade_mark": "™", - "train": "🚋", - "tram": "🚊", - "tram_car": "🚋", - "triangular_flag": "🚩", - "triangular_ruler": "📐", - "trident_emblem": "🔱", - "trolleybus": "🚎", - "trophy": "🏆", - "tropical_drink": "🍹", - "tropical_fish": "🐠", - "trumpet": "🎺", - "tulip": "🌷", - "tumbler_glass": "🥃", - "turtle": "🐢", - "twelve-thirty": "🕧", - "twelve_o’clock": "🕛", - "two-hump_camel": "🐫", - "two-thirty": "🕝", - "two_hearts": "💕", - "two_men_holding_hands": "👬", - "two_o’clock": "🕑", - "two_women_holding_hands": "👭", - "umbrella": "☂", - "umbrella_on_ground": "⛱", - "umbrella_with_rain_drops": "☔", - "unamused_face": "😒", - "unicorn_face": "🦄", - "unlocked": "🔓", - "up-down_arrow": "↕", - "up-left_arrow": "↖", - "up-right_arrow": "↗", - "up_arrow": "⬆", - "upside-down_face": "🙃", - "upwards_button": "🔼", - "vampire": "🧛", - "vampire_dark_skin_tone": "🧛🏿", - "vampire_light_skin_tone": "🧛🏻", - "vampire_medium-dark_skin_tone": "🧛🏾", - "vampire_medium-light_skin_tone": "🧛🏼", - "vampire_medium_skin_tone": "🧛🏽", - "vertical_traffic_light": "🚦", - "vibration_mode": "📳", - "victory_hand": "✌", - "victory_hand_dark_skin_tone": "✌🏿", - "victory_hand_light_skin_tone": "✌🏻", - "victory_hand_medium-dark_skin_tone": "✌🏾", - "victory_hand_medium-light_skin_tone": "✌🏼", - "victory_hand_medium_skin_tone": "✌🏽", - "video_camera": "📹", - "video_game": "🎮", - "videocassette": "📼", - "violin": "🎻", - "volcano": "🌋", - "volleyball": "🏐", - "vulcan_salute": "🖖", - "vulcan_salute_dark_skin_tone": "🖖🏿", - "vulcan_salute_light_skin_tone": "🖖🏻", - "vulcan_salute_medium-dark_skin_tone": "🖖🏾", - "vulcan_salute_medium-light_skin_tone": "🖖🏼", - "vulcan_salute_medium_skin_tone": "🖖🏽", - "waffle": "🧇", - "waning_crescent_moon": "🌘", - "waning_gibbous_moon": "🌖", - "warning": "⚠", - "wastebasket": "🗑", - "watch": "⌚", - "water_buffalo": "🐃", - "water_closet": "🚾", - "water_wave": "🌊", - "watermelon": "🍉", - "waving_hand": "👋", - "waving_hand_dark_skin_tone": "👋🏿", - "waving_hand_light_skin_tone": "👋🏻", - "waving_hand_medium-dark_skin_tone": "👋🏾", - "waving_hand_medium-light_skin_tone": "👋🏼", - "waving_hand_medium_skin_tone": "👋🏽", - "wavy_dash": "〰", - "waxing_crescent_moon": "🌒", - "waxing_gibbous_moon": "🌔", - "weary_cat_face": "🙀", - "weary_face": "😩", - "wedding": "💒", - "whale": "🐳", - "wheel_of_dharma": "☸", - "wheelchair_symbol": "♿", - "white_circle": "⚪", - "white_exclamation_mark": "❕", - "white_flag": "🏳", - "white_flower": "💮", - "white_hair": "🦳", - "white-haired_man": "👨\u200d🦳", - "white-haired_woman": "👩\u200d🦳", - "white_heart": "🤍", - "white_heavy_check_mark": "✅", - "white_large_square": "⬜", - "white_medium-small_square": "◽", - "white_medium_square": "◻", - "white_medium_star": "⭐", - "white_question_mark": "❔", - "white_small_square": "▫", - "white_square_button": "🔳", - "wilted_flower": "🥀", - "wind_chime": "🎐", - "wind_face": "🌬", - "wine_glass": "🍷", - "winking_face": "😉", - "winking_face_with_tongue": "😜", - "wolf_face": "🐺", - "woman": "👩", - "woman_artist": "👩\u200d🎨", - "woman_artist_dark_skin_tone": "👩🏿\u200d🎨", - "woman_artist_light_skin_tone": "👩🏻\u200d🎨", - "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨", - "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨", - "woman_artist_medium_skin_tone": "👩🏽\u200d🎨", - "woman_astronaut": "👩\u200d🚀", - "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀", - "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀", - "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀", - "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀", - "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀", - "woman_biking": "🚴\u200d♀️", - "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️", - "woman_biking_light_skin_tone": "🚴🏻\u200d♀️", - "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️", - "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️", - "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️", - "woman_bouncing_ball": "⛹️\u200d♀️", - "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️", - "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️", - "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️", - "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️", - "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️", - "woman_bowing": "🙇\u200d♀️", - "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️", - "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️", - "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️", - "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️", - "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️", - "woman_cartwheeling": "🤸\u200d♀️", - "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️", - "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️", - "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️", - "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️", - "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️", - "woman_climbing": "🧗\u200d♀️", - "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️", - "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️", - "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️", - "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️", - "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️", - "woman_construction_worker": "👷\u200d♀️", - "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️", - "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️", - "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️", - "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️", - "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️", - "woman_cook": "👩\u200d🍳", - "woman_cook_dark_skin_tone": "👩🏿\u200d🍳", - "woman_cook_light_skin_tone": "👩🏻\u200d🍳", - "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳", - "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳", - "woman_cook_medium_skin_tone": "👩🏽\u200d🍳", - "woman_dancing": "💃", - "woman_dancing_dark_skin_tone": "💃🏿", - "woman_dancing_light_skin_tone": "💃🏻", - "woman_dancing_medium-dark_skin_tone": "💃🏾", - "woman_dancing_medium-light_skin_tone": "💃🏼", - "woman_dancing_medium_skin_tone": "💃🏽", - "woman_dark_skin_tone": "👩🏿", - "woman_detective": "🕵️\u200d♀️", - "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️", - "woman_detective_light_skin_tone": "🕵🏻\u200d♀️", - "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️", - "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️", - "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️", - "woman_elf": "🧝\u200d♀️", - "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️", - "woman_elf_light_skin_tone": "🧝🏻\u200d♀️", - "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️", - "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️", - "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️", - "woman_facepalming": "🤦\u200d♀️", - "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️", - "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️", - "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️", - "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️", - "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️", - "woman_factory_worker": "👩\u200d🏭", - "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭", - "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭", - "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭", - "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭", - "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭", - "woman_fairy": "🧚\u200d♀️", - "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️", - "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️", - "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️", - "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️", - "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️", - "woman_farmer": "👩\u200d🌾", - "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾", - "woman_farmer_light_skin_tone": "👩🏻\u200d🌾", - "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾", - "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾", - "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾", - "woman_firefighter": "👩\u200d🚒", - "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒", - "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒", - "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒", - "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒", - "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒", - "woman_frowning": "🙍\u200d♀️", - "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️", - "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️", - "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️", - "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️", - "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️", - "woman_genie": "🧞\u200d♀️", - "woman_gesturing_no": "🙅\u200d♀️", - "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️", - "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️", - "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️", - "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️", - "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️", - "woman_gesturing_ok": "🙆\u200d♀️", - "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️", - "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️", - "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️", - "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️", - "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️", - "woman_getting_haircut": "💇\u200d♀️", - "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️", - "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️", - "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️", - "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️", - "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️", - "woman_getting_massage": "💆\u200d♀️", - "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️", - "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️", - "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️", - "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️", - "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️", - "woman_golfing": "🏌️\u200d♀️", - "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️", - "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️", - "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️", - "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️", - "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️", - "woman_guard": "💂\u200d♀️", - "woman_guard_dark_skin_tone": "💂🏿\u200d♀️", - "woman_guard_light_skin_tone": "💂🏻\u200d♀️", - "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️", - "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️", - "woman_guard_medium_skin_tone": "💂🏽\u200d♀️", - "woman_health_worker": "👩\u200d⚕️", - "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️", - "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️", - "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️", - "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️", - "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️", - "woman_in_lotus_position": "🧘\u200d♀️", - "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️", - "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️", - "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️", - "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️", - "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️", - "woman_in_manual_wheelchair": "👩\u200d🦽", - "woman_in_motorized_wheelchair": "👩\u200d🦼", - "woman_in_steamy_room": "🧖\u200d♀️", - "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️", - "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️", - "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️", - "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️", - "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️", - "woman_judge": "👩\u200d⚖️", - "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️", - "woman_judge_light_skin_tone": "👩🏻\u200d⚖️", - "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️", - "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️", - "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️", - "woman_juggling": "🤹\u200d♀️", - "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️", - "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️", - "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️", - "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️", - "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️", - "woman_lifting_weights": "🏋️\u200d♀️", - "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️", - "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️", - "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️", - "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️", - "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️", - "woman_light_skin_tone": "👩🏻", - "woman_mage": "🧙\u200d♀️", - "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️", - "woman_mage_light_skin_tone": "🧙🏻\u200d♀️", - "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️", - "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️", - "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️", - "woman_mechanic": "👩\u200d🔧", - "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧", - "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧", - "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧", - "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧", - "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧", - "woman_medium-dark_skin_tone": "👩🏾", - "woman_medium-light_skin_tone": "👩🏼", - "woman_medium_skin_tone": "👩🏽", - "woman_mountain_biking": "🚵\u200d♀️", - "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️", - "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️", - "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️", - "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️", - "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️", - "woman_office_worker": "👩\u200d💼", - "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼", - "woman_office_worker_light_skin_tone": "👩🏻\u200d💼", - "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼", - "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼", - "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼", - "woman_pilot": "👩\u200d✈️", - "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️", - "woman_pilot_light_skin_tone": "👩🏻\u200d✈️", - "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️", - "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️", - "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️", - "woman_playing_handball": "🤾\u200d♀️", - "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️", - "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️", - "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️", - "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️", - "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️", - "woman_playing_water_polo": "🤽\u200d♀️", - "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️", - "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️", - "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️", - "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️", - "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️", - "woman_police_officer": "👮\u200d♀️", - "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️", - "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️", - "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️", - "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️", - "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️", - "woman_pouting": "🙎\u200d♀️", - "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️", - "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️", - "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️", - "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️", - "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️", - "woman_raising_hand": "🙋\u200d♀️", - "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️", - "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️", - "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️", - "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️", - "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️", - "woman_rowing_boat": "🚣\u200d♀️", - "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️", - "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️", - "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️", - "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️", - "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️", - "woman_running": "🏃\u200d♀️", - "woman_running_dark_skin_tone": "🏃🏿\u200d♀️", - "woman_running_light_skin_tone": "🏃🏻\u200d♀️", - "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️", - "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️", - "woman_running_medium_skin_tone": "🏃🏽\u200d♀️", - "woman_scientist": "👩\u200d🔬", - "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬", - "woman_scientist_light_skin_tone": "👩🏻\u200d🔬", - "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬", - "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬", - "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬", - "woman_shrugging": "🤷\u200d♀️", - "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️", - "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️", - "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️", - "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️", - "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️", - "woman_singer": "👩\u200d🎤", - "woman_singer_dark_skin_tone": "👩🏿\u200d🎤", - "woman_singer_light_skin_tone": "👩🏻\u200d🎤", - "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤", - "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤", - "woman_singer_medium_skin_tone": "👩🏽\u200d🎤", - "woman_student": "👩\u200d🎓", - "woman_student_dark_skin_tone": "👩🏿\u200d🎓", - "woman_student_light_skin_tone": "👩🏻\u200d🎓", - "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓", - "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓", - "woman_student_medium_skin_tone": "👩🏽\u200d🎓", - "woman_surfing": "🏄\u200d♀️", - "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️", - "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️", - "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️", - "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️", - "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️", - "woman_swimming": "🏊\u200d♀️", - "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️", - "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️", - "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️", - "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️", - "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️", - "woman_teacher": "👩\u200d🏫", - "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫", - "woman_teacher_light_skin_tone": "👩🏻\u200d🏫", - "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫", - "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫", - "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫", - "woman_technologist": "👩\u200d💻", - "woman_technologist_dark_skin_tone": "👩🏿\u200d💻", - "woman_technologist_light_skin_tone": "👩🏻\u200d💻", - "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻", - "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻", - "woman_technologist_medium_skin_tone": "👩🏽\u200d💻", - "woman_tipping_hand": "💁\u200d♀️", - "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️", - "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️", - "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️", - "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️", - "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️", - "woman_vampire": "🧛\u200d♀️", - "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️", - "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️", - "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️", - "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️", - "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️", - "woman_walking": "🚶\u200d♀️", - "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️", - "woman_walking_light_skin_tone": "🚶🏻\u200d♀️", - "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️", - "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️", - "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️", - "woman_wearing_turban": "👳\u200d♀️", - "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️", - "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️", - "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️", - "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️", - "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️", - "woman_with_headscarf": "🧕", - "woman_with_headscarf_dark_skin_tone": "🧕🏿", - "woman_with_headscarf_light_skin_tone": "🧕🏻", - "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾", - "woman_with_headscarf_medium-light_skin_tone": "🧕🏼", - "woman_with_headscarf_medium_skin_tone": "🧕🏽", - "woman_with_probing_cane": "👩\u200d🦯", - "woman_zombie": "🧟\u200d♀️", - "woman’s_boot": "👢", - "woman’s_clothes": "👚", - "woman’s_hat": "👒", - "woman’s_sandal": "👡", - "women_with_bunny_ears": "👯\u200d♀️", - "women_wrestling": "🤼\u200d♀️", - "women’s_room": "🚺", - "woozy_face": "🥴", - "world_map": "🗺", - "worried_face": "😟", - "wrapped_gift": "🎁", - "wrench": "🔧", - "writing_hand": "✍", - "writing_hand_dark_skin_tone": "✍🏿", - "writing_hand_light_skin_tone": "✍🏻", - "writing_hand_medium-dark_skin_tone": "✍🏾", - "writing_hand_medium-light_skin_tone": "✍🏼", - "writing_hand_medium_skin_tone": "✍🏽", - "yarn": "🧶", - "yawning_face": "🥱", - "yellow_circle": "🟡", - "yellow_heart": "💛", - "yellow_square": "🟨", - "yen_banknote": "💴", - "yo-yo": "🪀", - "yin_yang": "☯", - "zany_face": "🤪", - "zebra": "🦓", - "zipper-mouth_face": "🤐", - "zombie": "🧟", - "zzz": "💤", - "åland_islands": "🇦🇽", - "keycap_asterisk": "*⃣", - "keycap_digit_eight": "8⃣", - "keycap_digit_five": "5⃣", - "keycap_digit_four": "4⃣", - "keycap_digit_nine": "9⃣", - "keycap_digit_one": "1⃣", - "keycap_digit_seven": "7⃣", - "keycap_digit_six": "6⃣", - "keycap_digit_three": "3⃣", - "keycap_digit_two": "2⃣", - "keycap_digit_zero": "0⃣", - "keycap_number_sign": "#⃣", - "light_skin_tone": "🏻", - "medium_light_skin_tone": "🏼", - "medium_skin_tone": "🏽", - "medium_dark_skin_tone": "🏾", - "dark_skin_tone": "🏿", - "regional_indicator_symbol_letter_a": "🇦", - "regional_indicator_symbol_letter_b": "🇧", - "regional_indicator_symbol_letter_c": "🇨", - "regional_indicator_symbol_letter_d": "🇩", - "regional_indicator_symbol_letter_e": "🇪", - "regional_indicator_symbol_letter_f": "🇫", - "regional_indicator_symbol_letter_g": "🇬", - "regional_indicator_symbol_letter_h": "🇭", - "regional_indicator_symbol_letter_i": "🇮", - "regional_indicator_symbol_letter_j": "🇯", - "regional_indicator_symbol_letter_k": "🇰", - "regional_indicator_symbol_letter_l": "🇱", - "regional_indicator_symbol_letter_m": "🇲", - "regional_indicator_symbol_letter_n": "🇳", - "regional_indicator_symbol_letter_o": "🇴", - "regional_indicator_symbol_letter_p": "🇵", - "regional_indicator_symbol_letter_q": "🇶", - "regional_indicator_symbol_letter_r": "🇷", - "regional_indicator_symbol_letter_s": "🇸", - "regional_indicator_symbol_letter_t": "🇹", - "regional_indicator_symbol_letter_u": "🇺", - "regional_indicator_symbol_letter_v": "🇻", - "regional_indicator_symbol_letter_w": "🇼", - "regional_indicator_symbol_letter_x": "🇽", - "regional_indicator_symbol_letter_y": "🇾", - "regional_indicator_symbol_letter_z": "🇿", - "airplane_arriving": "🛬", - "space_invader": "👾", - "football": "🏈", - "anger": "💢", - "angry": "😠", - "anguished": "😧", - "signal_strength": "📶", - "arrows_counterclockwise": "🔄", - "arrow_heading_down": "⤵", - "arrow_heading_up": "⤴", - "art": "🎨", - "astonished": "😲", - "athletic_shoe": "👟", - "atm": "🏧", - "car": "🚗", - "red_car": "🚗", - "angel": "👼", - "back": "🔙", - "badminton_racquet_and_shuttlecock": "🏸", - "dollar": "💵", - "euro": "💶", - "pound": "💷", - "yen": "💴", - "barber": "💈", - "bath": "🛀", - "bear": "🐻", - "heartbeat": "💓", - "beer": "🍺", - "no_bell": "🔕", - "bento": "🍱", - "bike": "🚲", - "bicyclist": "🚴", - "8ball": "🎱", - "biohazard_sign": "☣", - "birthday": "🎂", - "black_circle_for_record": "⏺", - "clubs": "♣", - "diamonds": "♦", - "arrow_double_down": "⏬", - "hearts": "♥", - "rewind": "⏪", - "black_left__pointing_double_triangle_with_vertical_bar": "⏮", - "arrow_backward": "◀", - "black_medium_small_square": "◾", - "question": "❓", - "fast_forward": "⏩", - "black_right__pointing_double_triangle_with_vertical_bar": "⏭", - "arrow_forward": "▶", - "black_right__pointing_triangle_with_double_vertical_bar": "⏯", - "arrow_right": "➡", - "spades": "♠", - "black_square_for_stop": "⏹", - "sunny": "☀", - "phone": "☎", - "recycle": "♻", - "arrow_double_up": "⏫", - "busstop": "🚏", - "date": "📅", - "flags": "🎏", - "cat2": "🐈", - "joy_cat": "😹", - "smirk_cat": "😼", - "chart_with_downwards_trend": "📉", - "chart_with_upwards_trend": "📈", - "chart": "💹", - "mega": "📣", - "checkered_flag": "🏁", - "accept": "🉑", - "ideograph_advantage": "🉐", - "congratulations": "㊗", - "secret": "㊙", - "m": "Ⓜ", - "city_sunset": "🌆", - "clapper": "🎬", - "clap": "👏", - "beers": "🍻", - "clock830": "🕣", - "clock8": "🕗", - "clock1130": "🕦", - "clock11": "🕚", - "clock530": "🕠", - "clock5": "🕔", - "clock430": "🕟", - "clock4": "🕓", - "clock930": "🕤", - "clock9": "🕘", - "clock130": "🕜", - "clock1": "🕐", - "clock730": "🕢", - "clock7": "🕖", - "clock630": "🕡", - "clock6": "🕕", - "clock1030": "🕥", - "clock10": "🕙", - "clock330": "🕞", - "clock3": "🕒", - "clock1230": "🕧", - "clock12": "🕛", - "clock230": "🕝", - "clock2": "🕑", - "arrows_clockwise": "🔃", - "repeat": "🔁", - "repeat_one": "🔂", - "closed_lock_with_key": "🔐", - "mailbox_closed": "📪", - "mailbox": "📫", - "cloud_with_tornado": "🌪", - "cocktail": "🍸", - "boom": "💥", - "compression": "🗜", - "confounded": "😖", - "confused": "😕", - "rice": "🍚", - "cow2": "🐄", - "cricket_bat_and_ball": "🏏", - "x": "❌", - "cry": "😢", - "curry": "🍛", - "dagger_knife": "🗡", - "dancer": "💃", - "dark_sunglasses": "🕶", - "dash": "💨", - "truck": "🚚", - "derelict_house_building": "🏚", - "diamond_shape_with_a_dot_inside": "💠", - "dart": "🎯", - "disappointed_relieved": "😥", - "disappointed": "😞", - "do_not_litter": "🚯", - "dog2": "🐕", - "flipper": "🐬", - "loop": "➿", - "bangbang": "‼", - "double_vertical_bar": "⏸", - "dove_of_peace": "🕊", - "small_red_triangle_down": "🔻", - "arrow_down_small": "🔽", - "arrow_down": "⬇", - "dromedary_camel": "🐪", - "e__mail": "📧", - "corn": "🌽", - "ear_of_rice": "🌾", - "earth_americas": "🌎", - "earth_asia": "🌏", - "earth_africa": "🌍", - "eight_pointed_black_star": "✴", - "eight_spoked_asterisk": "✳", - "eject_symbol": "⏏", - "bulb": "💡", - "emoji_modifier_fitzpatrick_type__1__2": "🏻", - "emoji_modifier_fitzpatrick_type__3": "🏼", - "emoji_modifier_fitzpatrick_type__4": "🏽", - "emoji_modifier_fitzpatrick_type__5": "🏾", - "emoji_modifier_fitzpatrick_type__6": "🏿", - "end": "🔚", - "email": "✉", - "european_castle": "🏰", - "european_post_office": "🏤", - "interrobang": "⁉", - "expressionless": "😑", - "eyeglasses": "👓", - "massage": "💆", - "yum": "😋", - "scream": "😱", - "kissing_heart": "😘", - "sweat": "😓", - "face_with_head__bandage": "🤕", - "triumph": "😤", - "mask": "😷", - "no_good": "🙅", - "ok_woman": "🙆", - "open_mouth": "😮", - "cold_sweat": "😰", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "😝", - "stuck_out_tongue_winking_eye": "😜", - "joy": "😂", - "no_mouth": "😶", - "santa": "🎅", - "fax": "📠", - "fearful": "😨", - "field_hockey_stick_and_ball": "🏑", - "first_quarter_moon_with_face": "🌛", - "fish_cake": "🍥", - "fishing_pole_and_fish": "🎣", - "facepunch": "👊", - "punch": "👊", - "flag_for_afghanistan": "🇦🇫", - "flag_for_albania": "🇦🇱", - "flag_for_algeria": "🇩🇿", - "flag_for_american_samoa": "🇦🇸", - "flag_for_andorra": "🇦🇩", - "flag_for_angola": "🇦🇴", - "flag_for_anguilla": "🇦🇮", - "flag_for_antarctica": "🇦🇶", - "flag_for_antigua_&_barbuda": "🇦🇬", - "flag_for_argentina": "🇦🇷", - "flag_for_armenia": "🇦🇲", - "flag_for_aruba": "🇦🇼", - "flag_for_ascension_island": "🇦🇨", - "flag_for_australia": "🇦🇺", - "flag_for_austria": "🇦🇹", - "flag_for_azerbaijan": "🇦🇿", - "flag_for_bahamas": "🇧🇸", - "flag_for_bahrain": "🇧🇭", - "flag_for_bangladesh": "🇧🇩", - "flag_for_barbados": "🇧🇧", - "flag_for_belarus": "🇧🇾", - "flag_for_belgium": "🇧🇪", - "flag_for_belize": "🇧🇿", - "flag_for_benin": "🇧🇯", - "flag_for_bermuda": "🇧🇲", - "flag_for_bhutan": "🇧🇹", - "flag_for_bolivia": "🇧🇴", - "flag_for_bosnia_&_herzegovina": "🇧🇦", - "flag_for_botswana": "🇧🇼", - "flag_for_bouvet_island": "🇧🇻", - "flag_for_brazil": "🇧🇷", - "flag_for_british_indian_ocean_territory": "🇮🇴", - "flag_for_british_virgin_islands": "🇻🇬", - "flag_for_brunei": "🇧🇳", - "flag_for_bulgaria": "🇧🇬", - "flag_for_burkina_faso": "🇧🇫", - "flag_for_burundi": "🇧🇮", - "flag_for_cambodia": "🇰🇭", - "flag_for_cameroon": "🇨🇲", - "flag_for_canada": "🇨🇦", - "flag_for_canary_islands": "🇮🇨", - "flag_for_cape_verde": "🇨🇻", - "flag_for_caribbean_netherlands": "🇧🇶", - "flag_for_cayman_islands": "🇰🇾", - "flag_for_central_african_republic": "🇨🇫", - "flag_for_ceuta_&_melilla": "🇪🇦", - "flag_for_chad": "🇹🇩", - "flag_for_chile": "🇨🇱", - "flag_for_china": "🇨🇳", - "flag_for_christmas_island": "🇨🇽", - "flag_for_clipperton_island": "🇨🇵", - "flag_for_cocos__islands": "🇨🇨", - "flag_for_colombia": "🇨🇴", - "flag_for_comoros": "🇰🇲", - "flag_for_congo____brazzaville": "🇨🇬", - "flag_for_congo____kinshasa": "🇨🇩", - "flag_for_cook_islands": "🇨🇰", - "flag_for_costa_rica": "🇨🇷", - "flag_for_croatia": "🇭🇷", - "flag_for_cuba": "🇨🇺", - "flag_for_curaçao": "🇨🇼", - "flag_for_cyprus": "🇨🇾", - "flag_for_czech_republic": "🇨🇿", - "flag_for_côte_d’ivoire": "🇨🇮", - "flag_for_denmark": "🇩🇰", - "flag_for_diego_garcia": "🇩🇬", - "flag_for_djibouti": "🇩🇯", - "flag_for_dominica": "🇩🇲", - "flag_for_dominican_republic": "🇩🇴", - "flag_for_ecuador": "🇪🇨", - "flag_for_egypt": "🇪🇬", - "flag_for_el_salvador": "🇸🇻", - "flag_for_equatorial_guinea": "🇬🇶", - "flag_for_eritrea": "🇪🇷", - "flag_for_estonia": "🇪🇪", - "flag_for_ethiopia": "🇪🇹", - "flag_for_european_union": "🇪🇺", - "flag_for_falkland_islands": "🇫🇰", - "flag_for_faroe_islands": "🇫🇴", - "flag_for_fiji": "🇫🇯", - "flag_for_finland": "🇫🇮", - "flag_for_france": "🇫🇷", - "flag_for_french_guiana": "🇬🇫", - "flag_for_french_polynesia": "🇵🇫", - "flag_for_french_southern_territories": "🇹🇫", - "flag_for_gabon": "🇬🇦", - "flag_for_gambia": "🇬🇲", - "flag_for_georgia": "🇬🇪", - "flag_for_germany": "🇩🇪", - "flag_for_ghana": "🇬🇭", - "flag_for_gibraltar": "🇬🇮", - "flag_for_greece": "🇬🇷", - "flag_for_greenland": "🇬🇱", - "flag_for_grenada": "🇬🇩", - "flag_for_guadeloupe": "🇬🇵", - "flag_for_guam": "🇬🇺", - "flag_for_guatemala": "🇬🇹", - "flag_for_guernsey": "🇬🇬", - "flag_for_guinea": "🇬🇳", - "flag_for_guinea__bissau": "🇬🇼", - "flag_for_guyana": "🇬🇾", - "flag_for_haiti": "🇭🇹", - "flag_for_heard_&_mcdonald_islands": "🇭🇲", - "flag_for_honduras": "🇭🇳", - "flag_for_hong_kong": "🇭🇰", - "flag_for_hungary": "🇭🇺", - "flag_for_iceland": "🇮🇸", - "flag_for_india": "🇮🇳", - "flag_for_indonesia": "🇮🇩", - "flag_for_iran": "🇮🇷", - "flag_for_iraq": "🇮🇶", - "flag_for_ireland": "🇮🇪", - "flag_for_isle_of_man": "🇮🇲", - "flag_for_israel": "🇮🇱", - "flag_for_italy": "🇮🇹", - "flag_for_jamaica": "🇯🇲", - "flag_for_japan": "🇯🇵", - "flag_for_jersey": "🇯🇪", - "flag_for_jordan": "🇯🇴", - "flag_for_kazakhstan": "🇰🇿", - "flag_for_kenya": "🇰🇪", - "flag_for_kiribati": "🇰🇮", - "flag_for_kosovo": "🇽🇰", - "flag_for_kuwait": "🇰🇼", - "flag_for_kyrgyzstan": "🇰🇬", - "flag_for_laos": "🇱🇦", - "flag_for_latvia": "🇱🇻", - "flag_for_lebanon": "🇱🇧", - "flag_for_lesotho": "🇱🇸", - "flag_for_liberia": "🇱🇷", - "flag_for_libya": "🇱🇾", - "flag_for_liechtenstein": "🇱🇮", - "flag_for_lithuania": "🇱🇹", - "flag_for_luxembourg": "🇱🇺", - "flag_for_macau": "🇲🇴", - "flag_for_macedonia": "🇲🇰", - "flag_for_madagascar": "🇲🇬", - "flag_for_malawi": "🇲🇼", - "flag_for_malaysia": "🇲🇾", - "flag_for_maldives": "🇲🇻", - "flag_for_mali": "🇲🇱", - "flag_for_malta": "🇲🇹", - "flag_for_marshall_islands": "🇲🇭", - "flag_for_martinique": "🇲🇶", - "flag_for_mauritania": "🇲🇷", - "flag_for_mauritius": "🇲🇺", - "flag_for_mayotte": "🇾🇹", - "flag_for_mexico": "🇲🇽", - "flag_for_micronesia": "🇫🇲", - "flag_for_moldova": "🇲🇩", - "flag_for_monaco": "🇲🇨", - "flag_for_mongolia": "🇲🇳", - "flag_for_montenegro": "🇲🇪", - "flag_for_montserrat": "🇲🇸", - "flag_for_morocco": "🇲🇦", - "flag_for_mozambique": "🇲🇿", - "flag_for_myanmar": "🇲🇲", - "flag_for_namibia": "🇳🇦", - "flag_for_nauru": "🇳🇷", - "flag_for_nepal": "🇳🇵", - "flag_for_netherlands": "🇳🇱", - "flag_for_new_caledonia": "🇳🇨", - "flag_for_new_zealand": "🇳🇿", - "flag_for_nicaragua": "🇳🇮", - "flag_for_niger": "🇳🇪", - "flag_for_nigeria": "🇳🇬", - "flag_for_niue": "🇳🇺", - "flag_for_norfolk_island": "🇳🇫", - "flag_for_north_korea": "🇰🇵", - "flag_for_northern_mariana_islands": "🇲🇵", - "flag_for_norway": "🇳🇴", - "flag_for_oman": "🇴🇲", - "flag_for_pakistan": "🇵🇰", - "flag_for_palau": "🇵🇼", - "flag_for_palestinian_territories": "🇵🇸", - "flag_for_panama": "🇵🇦", - "flag_for_papua_new_guinea": "🇵🇬", - "flag_for_paraguay": "🇵🇾", - "flag_for_peru": "🇵🇪", - "flag_for_philippines": "🇵🇭", - "flag_for_pitcairn_islands": "🇵🇳", - "flag_for_poland": "🇵🇱", - "flag_for_portugal": "🇵🇹", - "flag_for_puerto_rico": "🇵🇷", - "flag_for_qatar": "🇶🇦", - "flag_for_romania": "🇷🇴", - "flag_for_russia": "🇷🇺", - "flag_for_rwanda": "🇷🇼", - "flag_for_réunion": "🇷🇪", - "flag_for_samoa": "🇼🇸", - "flag_for_san_marino": "🇸🇲", - "flag_for_saudi_arabia": "🇸🇦", - "flag_for_senegal": "🇸🇳", - "flag_for_serbia": "🇷🇸", - "flag_for_seychelles": "🇸🇨", - "flag_for_sierra_leone": "🇸🇱", - "flag_for_singapore": "🇸🇬", - "flag_for_sint_maarten": "🇸🇽", - "flag_for_slovakia": "🇸🇰", - "flag_for_slovenia": "🇸🇮", - "flag_for_solomon_islands": "🇸🇧", - "flag_for_somalia": "🇸🇴", - "flag_for_south_africa": "🇿🇦", - "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", - "flag_for_south_korea": "🇰🇷", - "flag_for_south_sudan": "🇸🇸", - "flag_for_spain": "🇪🇸", - "flag_for_sri_lanka": "🇱🇰", - "flag_for_st._barthélemy": "🇧🇱", - "flag_for_st._helena": "🇸🇭", - "flag_for_st._kitts_&_nevis": "🇰🇳", - "flag_for_st._lucia": "🇱🇨", - "flag_for_st._martin": "🇲🇫", - "flag_for_st._pierre_&_miquelon": "🇵🇲", - "flag_for_st._vincent_&_grenadines": "🇻🇨", - "flag_for_sudan": "🇸🇩", - "flag_for_suriname": "🇸🇷", - "flag_for_svalbard_&_jan_mayen": "🇸🇯", - "flag_for_swaziland": "🇸🇿", - "flag_for_sweden": "🇸🇪", - "flag_for_switzerland": "🇨🇭", - "flag_for_syria": "🇸🇾", - "flag_for_são_tomé_&_príncipe": "🇸🇹", - "flag_for_taiwan": "🇹🇼", - "flag_for_tajikistan": "🇹🇯", - "flag_for_tanzania": "🇹🇿", - "flag_for_thailand": "🇹🇭", - "flag_for_timor__leste": "🇹🇱", - "flag_for_togo": "🇹🇬", - "flag_for_tokelau": "🇹🇰", - "flag_for_tonga": "🇹🇴", - "flag_for_trinidad_&_tobago": "🇹🇹", - "flag_for_tristan_da_cunha": "🇹🇦", - "flag_for_tunisia": "🇹🇳", - "flag_for_turkey": "🇹🇷", - "flag_for_turkmenistan": "🇹🇲", - "flag_for_turks_&_caicos_islands": "🇹🇨", - "flag_for_tuvalu": "🇹🇻", - "flag_for_u.s._outlying_islands": "🇺🇲", - "flag_for_u.s._virgin_islands": "🇻🇮", - "flag_for_uganda": "🇺🇬", - "flag_for_ukraine": "🇺🇦", - "flag_for_united_arab_emirates": "🇦🇪", - "flag_for_united_kingdom": "🇬🇧", - "flag_for_united_states": "🇺🇸", - "flag_for_uruguay": "🇺🇾", - "flag_for_uzbekistan": "🇺🇿", - "flag_for_vanuatu": "🇻🇺", - "flag_for_vatican_city": "🇻🇦", - "flag_for_venezuela": "🇻🇪", - "flag_for_vietnam": "🇻🇳", - "flag_for_wallis_&_futuna": "🇼🇫", - "flag_for_western_sahara": "🇪🇭", - "flag_for_yemen": "🇾🇪", - "flag_for_zambia": "🇿🇲", - "flag_for_zimbabwe": "🇿🇼", - "flag_for_åland_islands": "🇦🇽", - "golf": "⛳", - "fleur__de__lis": "⚜", - "muscle": "💪", - "flushed": "😳", - "frame_with_picture": "🖼", - "fries": "🍟", - "frog": "🐸", - "hatched_chick": "🐥", - "frowning": "😦", - "fuelpump": "⛽", - "full_moon_with_face": "🌝", - "gem": "💎", - "star2": "🌟", - "golfer": "🏌", - "mortar_board": "🎓", - "grimacing": "😬", - "smile_cat": "😸", - "grinning": "😀", - "grin": "😁", - "heartpulse": "💗", - "guardsman": "💂", - "haircut": "💇", - "hamster": "🐹", - "raising_hand": "🙋", - "headphones": "🎧", - "hear_no_evil": "🙉", - "cupid": "💘", - "gift_heart": "💝", - "heart": "❤", - "exclamation": "❗", - "heavy_exclamation_mark": "❗", - "heavy_heart_exclamation_mark_ornament": "❣", - "o": "⭕", - "helm_symbol": "⎈", - "helmet_with_white_cross": "⛑", - "high_heel": "👠", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "high_brightness": "🔆", - "zap": "⚡", - "hocho": "🔪", - "knife": "🔪", - "bee": "🐝", - "traffic_light": "🚥", - "racehorse": "🐎", - "coffee": "☕", - "hotsprings": "♨", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "house_buildings": "🏘", - "100": "💯", - "hushed": "😯", - "ice_hockey_stick_and_puck": "🏒", - "imp": "👿", - "information_desk_person": "💁", - "information_source": "ℹ", - "capital_abcd": "🔠", - "abc": "🔤", - "abcd": "🔡", - "1234": "🔢", - "symbols": "🔣", - "izakaya_lantern": "🏮", - "lantern": "🏮", - "jack_o_lantern": "🎃", - "dolls": "🎎", - "japanese_goblin": "👺", - "japanese_ogre": "👹", - "beginner": "🔰", - "zero": "0️⃣", - "one": "1️⃣", - "ten": "🔟", - "two": "2️⃣", - "three": "3️⃣", - "four": "4️⃣", - "five": "5️⃣", - "six": "6️⃣", - "seven": "7️⃣", - "eight": "8️⃣", - "nine": "9️⃣", - "couplekiss": "💏", - "kissing_cat": "😽", - "kissing": "😗", - "kissing_closed_eyes": "😚", - "kissing_smiling_eyes": "😙", - "beetle": "🐞", - "large_blue_circle": "🔵", - "last_quarter_moon_with_face": "🌜", - "leaves": "🍃", - "mag": "🔍", - "left_right_arrow": "↔", - "leftwards_arrow_with_hook": "↩", - "arrow_left": "⬅", - "lock": "🔒", - "lock_with_ink_pen": "🔏", - "sob": "😭", - "low_brightness": "🔅", - "lower_left_ballpoint_pen": "🖊", - "lower_left_crayon": "🖍", - "lower_left_fountain_pen": "🖋", - "lower_left_paintbrush": "🖌", - "mahjong": "🀄", - "couple": "👫", - "man_in_business_suit_levitating": "🕴", - "man_with_gua_pi_mao": "👲", - "man_with_turban": "👳", - "mans_shoe": "👞", - "shoe": "👞", - "menorah_with_nine_branches": "🕎", - "mens": "🚹", - "minidisc": "💽", - "iphone": "📱", - "calling": "📲", - "money__mouth_face": "🤑", - "moneybag": "💰", - "rice_scene": "🎑", - "mountain_bicyclist": "🚵", - "mouse2": "🐁", - "lips": "👄", - "moyai": "🗿", - "notes": "🎶", - "nail_care": "💅", - "ab": "🆎", - "negative_squared_cross_mark": "❎", - "a": "🅰", - "b": "🅱", - "o2": "🅾", - "parking": "🅿", - "new_moon_with_face": "🌚", - "no_entry_sign": "🚫", - "underage": "🔞", - "non__potable_water": "🚱", - "arrow_upper_right": "↗", - "arrow_upper_left": "↖", - "office": "🏢", - "older_man": "👴", - "older_woman": "👵", - "om_symbol": "🕉", - "on": "🔛", - "book": "📖", - "unlock": "🔓", - "mailbox_with_no_mail": "📭", - "mailbox_with_mail": "📬", - "cd": "💿", - "tada": "🎉", - "feet": "🐾", - "walking": "🚶", - "pencil2": "✏", - "pensive": "😔", - "persevere": "😣", - "bow": "🙇", - "raised_hands": "🙌", - "person_with_ball": "⛹", - "person_with_blond_hair": "👱", - "pray": "🙏", - "person_with_pouting_face": "🙎", - "computer": "💻", - "pig2": "🐖", - "hankey": "💩", - "poop": "💩", - "shit": "💩", - "bamboo": "🎍", - "gun": "🔫", - "black_joker": "🃏", - "rotating_light": "🚨", - "cop": "👮", - "stew": "🍲", - "pouch": "👝", - "pouting_cat": "😾", - "rage": "😡", - "put_litter_in_its_place": "🚮", - "rabbit2": "🐇", - "racing_motorcycle": "🏍", - "radioactive_sign": "☢", - "fist": "✊", - "hand": "✋", - "raised_hand_with_fingers_splayed": "🖐", - "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", - "blue_car": "🚙", - "apple": "🍎", - "relieved": "😌", - "reversed_hand_with_middle_finger_extended": "🖕", - "mag_right": "🔎", - "arrow_right_hook": "↪", - "sweet_potato": "🍠", - "robot": "🤖", - "rolled__up_newspaper": "🗞", - "rowboat": "🚣", - "runner": "🏃", - "running": "🏃", - "running_shirt_with_sash": "🎽", - "boat": "⛵", - "scales": "⚖", - "school_satchel": "🎒", - "scorpius": "♏", - "see_no_evil": "🙈", - "sheep": "🐑", - "stars": "🌠", - "cake": "🍰", - "six_pointed_star": "🔯", - "ski": "🎿", - "sleeping_accommodation": "🛌", - "sleeping": "😴", - "sleepy": "😪", - "sleuth_or_spy": "🕵", - "heart_eyes_cat": "😻", - "smiley_cat": "😺", - "innocent": "😇", - "heart_eyes": "😍", - "smiling_imp": "😈", - "smiley": "😃", - "sweat_smile": "😅", - "smile": "😄", - "laughing": "😆", - "satisfied": "😆", - "blush": "😊", - "smirk": "😏", - "smoking": "🚬", - "snow_capped_mountain": "🏔", - "soccer": "⚽", - "icecream": "🍦", - "soon": "🔜", - "arrow_lower_right": "↘", - "arrow_lower_left": "↙", - "speak_no_evil": "🙊", - "speaker": "🔈", - "mute": "🔇", - "sound": "🔉", - "loud_sound": "🔊", - "speaking_head_in_silhouette": "🗣", - "spiral_calendar_pad": "🗓", - "spiral_note_pad": "🗒", - "shell": "🐚", - "sweat_drops": "💦", - "u5272": "🈹", - "u5408": "🈴", - "u55b6": "🈺", - "u6307": "🈯", - "u6708": "🈷", - "u6709": "🈶", - "u6e80": "🈵", - "u7121": "🈚", - "u7533": "🈸", - "u7981": "🈲", - "u7a7a": "🈳", - "cl": "🆑", - "cool": "🆒", - "free": "🆓", - "id": "🆔", - "koko": "🈁", - "sa": "🈂", - "new": "🆕", - "ng": "🆖", - "ok": "🆗", - "sos": "🆘", - "up": "🆙", - "vs": "🆚", - "steam_locomotive": "🚂", - "ramen": "🍜", - "partly_sunny": "⛅", - "city_sunrise": "🌇", - "surfer": "🏄", - "swimmer": "🏊", - "shirt": "👕", - "tshirt": "👕", - "table_tennis_paddle_and_ball": "🏓", - "tea": "🍵", - "tv": "📺", - "three_button_mouse": "🖱", - "+1": "👍", - "thumbsup": "👍", - "__1": "👎", - "-1": "👎", - "thumbsdown": "👎", - "thunder_cloud_and_rain": "⛈", - "tiger2": "🐅", - "tophat": "🎩", - "top": "🔝", - "tm": "™", - "train2": "🚆", - "triangular_flag_on_post": "🚩", - "trident": "🔱", - "twisted_rightwards_arrows": "🔀", - "unamused": "😒", - "small_red_triangle": "🔺", - "arrow_up_small": "🔼", - "arrow_up_down": "↕", - "upside__down_face": "🙃", - "arrow_up": "⬆", - "v": "✌", - "vhs": "📼", - "wc": "🚾", - "ocean": "🌊", - "waving_black_flag": "🏴", - "wave": "👋", - "waving_white_flag": "🏳", - "moon": "🌔", - "scream_cat": "🙀", - "weary": "😩", - "weight_lifter": "🏋", - "whale2": "🐋", - "wheelchair": "♿", - "point_down": "👇", - "grey_exclamation": "❕", - "white_frowning_face": "☹", - "white_check_mark": "✅", - "point_left": "👈", - "white_medium_small_square": "◽", - "star": "⭐", - "grey_question": "❔", - "point_right": "👉", - "relaxed": "☺", - "white_sun_behind_cloud": "🌥", - "white_sun_behind_cloud_with_rain": "🌦", - "white_sun_with_small_cloud": "🌤", - "point_up_2": "👆", - "point_up": "☝", - "wind_blowing_face": "🌬", - "wink": "😉", - "wolf": "🐺", - "dancers": "👯", - "boot": "👢", - "womans_clothes": "👚", - "womans_hat": "👒", - "sandal": "👡", - "womens": "🚺", - "worried": "😟", - "gift": "🎁", - "zipper__mouth_face": "🤐", - "regional_indicator_a": "🇦", - "regional_indicator_b": "🇧", - "regional_indicator_c": "🇨", - "regional_indicator_d": "🇩", - "regional_indicator_e": "🇪", - "regional_indicator_f": "🇫", - "regional_indicator_g": "🇬", - "regional_indicator_h": "🇭", - "regional_indicator_i": "🇮", - "regional_indicator_j": "🇯", - "regional_indicator_k": "🇰", - "regional_indicator_l": "🇱", - "regional_indicator_m": "🇲", - "regional_indicator_n": "🇳", - "regional_indicator_o": "🇴", - "regional_indicator_p": "🇵", - "regional_indicator_q": "🇶", - "regional_indicator_r": "🇷", - "regional_indicator_s": "🇸", - "regional_indicator_t": "🇹", - "regional_indicator_u": "🇺", - "regional_indicator_v": "🇻", - "regional_indicator_w": "🇼", - "regional_indicator_x": "🇽", - "regional_indicator_y": "🇾", - "regional_indicator_z": "🇿", -} diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py deleted file mode 100755 index bb2cafa..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Callable, Match, Optional -import re - -from ._emoji_codes import EMOJI - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def _emoji_replace( - text: str, - default_variant: Optional[str] = None, - _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, -) -> str: - """Replace emoji code in text.""" - get_emoji = EMOJI.__getitem__ - variants = {"text": "\uFE0E", "emoji": "\uFE0F"} - get_variant = variants.get - default_variant_code = variants.get(default_variant, "") if default_variant else "" - - def do_replace(match: Match[str]) -> str: - emoji_code, emoji_name, variant = match.groups() - try: - return get_emoji(emoji_name.lower()) + get_variant( - variant, default_variant_code - ) - except KeyError: - return emoji_code - - return _emoji_sub(do_replace, text) diff --git a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py b/venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py deleted file mode 100755 index e7527e5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_vendor/rich/_export_format.py +++ /dev/null @@ -1,76 +0,0 @@ -CONSOLE_HTML_FORMAT = """\ - - - - - - - -

  • ' : '\U0001d4ab', - '\\' : '\U0001d4ac', - '\\' : '\U0000211b', - '\\' : '\U0001d4ae', - '\\' : '\U0001d4af', - '\\' : '\U0001d4b0', - '\\' : '\U0001d4b1', - '\\' : '\U0001d4b2', - '\\' : '\U0001d4b3', - '\\' : '\U0001d4b4', - '\\' : '\U0001d4b5', - '\\' : '\U0001d5ba', - '\\' : '\U0001d5bb', - '\\' : '\U0001d5bc', - '\\' : '\U0001d5bd', - '\\' : '\U0001d5be', - '\\' : '\U0001d5bf', - '\\' : '\U0001d5c0', - '\\' : '\U0001d5c1', - '\\' : '\U0001d5c2', - '\\' : '\U0001d5c3', - '\\' : '\U0001d5c4', - '\\' : '\U0001d5c5', - '\\' : '\U0001d5c6', - '\\' : '\U0001d5c7', - '\\' : '\U0001d5c8', - '\\