From b5a30adb2749c452313a4109054b8eb6d71f46ff Mon Sep 17 00:00:00 2001 From: tiijay Date: Sun, 19 Oct 2025 18:29:10 +0200 Subject: [PATCH] first save --- .venv/bin/Activate.ps1 | 247 + .venv/bin/activate | 70 + .venv/bin/activate.csh | 27 + .venv/bin/activate.fish | 69 + .venv/bin/mpremote | 8 + .venv/bin/pip | 8 + .venv/bin/pip3 | 8 + .venv/bin/pip3.12 | 8 + .venv/bin/pyserial-miniterm | 8 + .venv/bin/pyserial-ports | 8 + .venv/bin/python | 1 + .venv/bin/python3 | 1 + .venv/bin/python3.12 | 1 + .../python3.12/site-packages/__builtins__.pyi | 28 + .venv/lib/python3.12/site-packages/_boot.pyi | 4 + .../python3.12/site-packages/_boot_fat.pyi | 3 + .../site-packages/_mpy_shed/IRQs.pyi | 31 + .../site-packages/_mpy_shed/__init__.pyi | 112 + .../mp_implementation.cpython-312.pyc | Bin 0 -> 1243 bytes .../_mpy_shed/_collections_abc.pyi | 98 + .../site-packages/_mpy_shed/blockdevice.pyi | 201 + .../site-packages/_mpy_shed/buffer_mp.pyi | 8 + .../_mpy_shed/collections/__init__.pyi | 553 ++ .../_mpy_shed/collections/abc.pyi | 3 + .../site-packages/_mpy_shed/io_modes.pyi | 87 + .../site-packages/_mpy_shed/io_mp.pyi | 52 + .../site-packages/_mpy_shed/mp_available.pyi | 32 + .../_mpy_shed/mp_implementation.py | 24 + .../site-packages/_mpy_shed/neopixelbase.pyi | 26 + .../site-packages/_mpy_shed/pathlike.pyi | 17 + .../site-packages/_mpy_shed/subscriptable.pyi | 17 + .../site-packages/_mpy_shed/time_mp.pyi | 15 + .../lib/python3.12/site-packages/_onewire.pyi | 15 + .../lib/python3.12/site-packages/_thread.pyi | 33 + .../lib/python3.12/site-packages/binascii.pyi | 61 + .venv/lib/python3.12/site-packages/cmath.pyi | 82 + .../python3.12/site-packages/cryptolib.pyi | 165 + .../lib/python3.12/site-packages/deflate.pyi | 85 + .venv/lib/python3.12/site-packages/dht.pyi | 15 + .../lib/python3.12/site-packages/ds18x20.pyi | 16 + .venv/lib/python3.12/site-packages/errno.pyi | 45 + .../lib/python3.12/site-packages/framebuf.pyi | 227 + .venv/lib/python3.12/site-packages/gc.pyi | 112 + .../lib/python3.12/site-packages/hashlib.pyi | 104 + .venv/lib/python3.12/site-packages/heapq.pyi | 46 + .../lib/python3.12/site-packages/machine.pyi | 3165 ++++++ .venv/lib/python3.12/site-packages/math.pyi | 267 + .../python3.12/site-packages/micropython.pyi | 350 + .../INSTALLER | 1 + .../LICENSE.md | 22 + .../METADATA | 64 + .../RECORD | 58 + .../REQUESTED | 0 .../WHEEL | 4 + .../INSTALLER | 1 + .../METADATA | 86 + .../RECORD | 83 + .../REQUESTED | 0 .../WHEEL | 4 + .../licenses/LICENSE.md | 239 + .../licenses/LICENSE_typeshed | 237 + .../mpremote-1.26.1.dist-info/INSTALLER | 1 + .../mpremote-1.26.1.dist-info/METADATA | 105 + .../mpremote-1.26.1.dist-info/RECORD | 30 + .../mpremote-1.26.1.dist-info/REQUESTED | 0 .../mpremote-1.26.1.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../site-packages/mpremote/__init__.py | 12 + .../site-packages/mpremote/__main__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 548 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 385 bytes .../__pycache__/commands.cpython-312.pyc | Bin 0 -> 34860 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 9036 bytes .../mpremote/__pycache__/main.cpython-312.pyc | Bin 0 -> 23248 bytes .../mpremote/__pycache__/mip.cpython-312.pyc | Bin 0 -> 9816 bytes .../__pycache__/mp_errno.cpython-312.pyc | Bin 0 -> 2938 bytes .../mpremote/__pycache__/repl.cpython-312.pyc | Bin 0 -> 5566 bytes .../__pycache__/romfs.cpython-312.pyc | Bin 0 -> 7376 bytes .../__pycache__/transport.cpython-312.pyc | Bin 0 -> 9638 bytes .../transport_serial.cpython-312.pyc | Bin 0 -> 41141 bytes .../site-packages/mpremote/commands.py | 746 ++ .../site-packages/mpremote/console.py | 176 + .../python3.12/site-packages/mpremote/main.py | 636 ++ .../python3.12/site-packages/mpremote/mip.py | 219 + .../site-packages/mpremote/mp_errno.py | 55 + .../python3.12/site-packages/mpremote/repl.py | 121 + .../site-packages/mpremote/romfs.py | 148 + .../site-packages/mpremote/transport.py | 211 + .../mpremote/transport_serial.py | 1058 ++ .../lib/python3.12/site-packages/neopixel.pyi | 90 + .../lib/python3.12/site-packages/onewire.pyi | 21 + .../pip-24.0.dist-info/AUTHORS.txt | 760 ++ .../pip-24.0.dist-info/INSTALLER | 1 + .../pip-24.0.dist-info/LICENSE.txt | 20 + .../site-packages/pip-24.0.dist-info/METADATA | 88 + .../site-packages/pip-24.0.dist-info/RECORD | 1005 ++ .../pip-24.0.dist-info/REQUESTED | 0 .../site-packages/pip-24.0.dist-info/WHEEL | 5 + .../pip-24.0.dist-info/entry_points.txt | 4 + .../pip-24.0.dist-info/top_level.txt | 1 + .../python3.12/site-packages/pip/__init__.py | 13 + .../python3.12/site-packages/pip/__main__.py | 24 + .../site-packages/pip/__pip-runner__.py | 50 + .../pip/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 737 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 893 bytes .../__pip-runner__.cpython-312.pyc | Bin 0 -> 2256 bytes .../site-packages/pip/_internal/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 839 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 0 -> 14346 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 12717 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 17718 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 33336 bytes .../__pycache__/main.cpython-312.pyc | Bin 0 -> 722 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 0 -> 5023 bytes .../self_outdated_check.cpython-312.pyc | Bin 0 -> 10604 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 0 -> 13701 bytes .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 330 bytes .../autocompletion.cpython-312.pyc | Bin 0 -> 8517 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 0 -> 10507 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 0 -> 30426 bytes .../command_context.cpython-312.pyc | Bin 0 -> 1833 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 0 -> 2350 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 0 -> 4957 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 0 -> 15074 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 0 -> 2672 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 0 -> 18904 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 0 -> 7892 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 427 bytes .../pip/_internal/cli/autocompletion.py | 172 + .../pip/_internal/cli/base_command.py | 236 + .../pip/_internal/cli/cmdoptions.py | 1074 ++ .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 79 + .../pip/_internal/cli/main_parser.py | 134 + .../site-packages/pip/_internal/cli/parser.py | 294 + .../pip/_internal/cli/progress_bars.py | 68 + .../pip/_internal/cli/req_command.py | 505 + .../pip/_internal/cli/spinners.py | 159 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 132 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4054 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 9763 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 2142 bytes .../__pycache__/completion.cpython-312.pyc | Bin 0 -> 5244 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 0 -> 13264 bytes .../__pycache__/debug.cpython-312.pyc | Bin 0 -> 10213 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 7641 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 4468 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 0 -> 3035 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 0 -> 1725 bytes .../__pycache__/index.cpython-312.pyc | Bin 0 -> 6772 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 0 -> 4027 bytes .../__pycache__/install.cpython-312.pyc | Bin 0 -> 28965 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 0 -> 15708 bytes .../__pycache__/search.cpython-312.pyc | Bin 0 -> 7673 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 0 -> 9780 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 0 -> 4778 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 9008 bytes .../pip/_internal/commands/cache.py | 225 + .../pip/_internal/commands/check.py | 54 + .../pip/_internal/commands/completion.py | 130 + .../pip/_internal/commands/configuration.py | 280 + .../pip/_internal/commands/debug.py | 201 + .../pip/_internal/commands/download.py | 147 + .../pip/_internal/commands/freeze.py | 109 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/inspect.py | 92 + .../pip/_internal/commands/install.py | 774 ++ .../pip/_internal/commands/list.py | 370 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 189 + .../pip/_internal/commands/uninstall.py | 113 + .../pip/_internal/commands/wheel.py | 183 + .../pip/_internal/configuration.py | 383 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 993 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2914 bytes .../__pycache__/installed.cpython-312.pyc | Bin 0 -> 1752 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 0 -> 8540 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 0 -> 2300 bytes .../pip/_internal/distributions/base.py | 51 + .../pip/_internal/distributions/installed.py | 29 + .../pip/_internal/distributions/sdist.py | 156 + .../pip/_internal/distributions/wheel.py | 40 + .../site-packages/pip/_internal/exceptions.py | 728 ++ .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 284 bytes .../__pycache__/collector.cpython-312.pyc | Bin 0 -> 21938 bytes .../package_finder.cpython-312.pyc | Bin 0 -> 40787 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 0 -> 12656 bytes .../pip/_internal/index/collector.py | 507 + .../pip/_internal/index/package_finder.py | 1027 ++ .../pip/_internal/index/sources.py | 285 + .../pip/_internal/locations/__init__.py | 467 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 16828 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 0 -> 6908 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 0 -> 8063 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 3833 bytes .../pip/_internal/locations/_distutils.py | 172 + .../pip/_internal/locations/_sysconfig.py | 213 + .../pip/_internal/locations/base.py | 81 + .../site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 128 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5934 bytes .../__pycache__/_json.cpython-312.pyc | Bin 0 -> 2927 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 0 -> 35764 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 0 -> 15842 bytes .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 ++ .../_internal/metadata/importlib/__init__.py | 6 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 410 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 3385 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 0 -> 13477 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 0 -> 11232 bytes .../_internal/metadata/importlib/_compat.py | 55 + .../_internal/metadata/importlib/_dists.py | 227 + .../pip/_internal/metadata/importlib/_envs.py | 189 + .../pip/_internal/metadata/pkg_resources.py | 278 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 318 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 0 -> 1957 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 0 -> 11251 bytes .../format_control.cpython-312.pyc | Bin 0 -> 4279 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 0 -> 1746 bytes .../installation_report.cpython-312.pyc | Bin 0 -> 2324 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 0 -> 26054 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 0 -> 1221 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 0 -> 5140 bytes .../selection_prefs.cpython-312.pyc | Bin 0 -> 1903 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 0 -> 5006 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5832 bytes .../pip/_internal/models/candidate.py | 30 + .../pip/_internal/models/direct_url.py | 235 + .../pip/_internal/models/format_control.py | 78 + .../pip/_internal/models/index.py | 28 + .../_internal/models/installation_report.py | 56 + .../pip/_internal/models/link.py | 579 ++ .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 132 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 122 + .../pip/_internal/models/wheel.py | 92 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 306 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 0 -> 22048 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 0 -> 6570 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 8605 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 0 -> 11715 bytes .../__pycache__/session.cpython-312.pyc | Bin 0 -> 18826 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2305 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 0 -> 3001 bytes .../pip/_internal/network/auth.py | 561 ++ .../pip/_internal/network/cache.py | 106 + .../pip/_internal/network/download.py | 186 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 520 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 62 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 249 bytes .../__pycache__/check.cpython-312.pyc | Bin 0 -> 7631 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 0 -> 10169 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 0 -> 25799 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 255 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 0 -> 7875 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 1932 bytes .../metadata_editable.cpython-312.pyc | Bin 0 -> 1966 bytes .../metadata_legacy.cpython-312.pyc | Bin 0 -> 3117 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 1736 bytes .../wheel_editable.cpython-312.pyc | Bin 0 -> 2077 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 0 -> 3981 bytes .../operations/build/build_tracker.py | 139 + .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 187 + .../pip/_internal/operations/freeze.py | 255 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 318 bytes .../editable_legacy.cpython-312.pyc | Bin 0 -> 1869 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 33911 bytes .../operations/install/editable_legacy.py | 46 + .../pip/_internal/operations/install/wheel.py | 734 ++ .../pip/_internal/operations/prepare.py | 730 ++ .../site-packages/pip/_internal/pyproject.py | 179 + .../pip/_internal/req/__init__.py | 92 + .../req/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3795 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 0 -> 21634 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 0 -> 21513 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 0 -> 38466 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 0 -> 7270 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 0 -> 33029 bytes .../pip/_internal/req/constructors.py | 576 ++ .../pip/_internal/req/req_file.py | 554 ++ .../pip/_internal/req/req_install.py | 923 ++ .../pip/_internal/req/req_set.py | 119 + .../pip/_internal/req/req_uninstall.py | 649 ++ .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 249 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 1237 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 256 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 22491 bytes .../_internal/resolution/legacy/resolver.py | 598 ++ .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 260 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8389 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 0 -> 30450 bytes .../__pycache__/factory.cpython-312.pyc | Bin 0 -> 32166 bytes .../found_candidates.cpython-312.pyc | Bin 0 -> 6260 bytes .../__pycache__/provider.cpython-312.pyc | Bin 0 -> 10430 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 0 -> 4987 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 11481 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 0 -> 12403 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 597 ++ .../resolution/resolvelib/factory.py | 812 ++ .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 255 + .../resolution/resolvelib/reporter.py | 80 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 317 + .../pip/_internal/self_outdated_check.py | 248 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 244 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 0 -> 4585 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 0 -> 1915 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 0 -> 2459 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 0 -> 2262 bytes .../compatibility_tags.cpython-312.pyc | Bin 0 -> 5610 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 0 -> 733 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 0 -> 4235 bytes .../direct_url_helpers.cpython-312.pyc | Bin 0 -> 3612 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 0 -> 3275 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 0 -> 2207 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 0 -> 4042 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 7507 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 0 -> 1213 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 0 -> 2391 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 0 -> 7603 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13606 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 0 -> 34170 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 0 -> 2761 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 0 -> 2632 bytes .../setuptools_build.cpython-312.pyc | Bin 0 -> 4599 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 0 -> 8767 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 0 -> 12111 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 0 -> 11157 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 0 -> 2454 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 0 -> 4529 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 5975 bytes .../pip/_internal/utils/_jaraco_text.py | 109 + .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/egg_link.py | 80 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 84 + .../pip/_internal/utils/filesystem.py | 153 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 151 + .../pip/_internal/utils/logging.py | 348 + .../site-packages/pip/_internal/utils/misc.py | 783 ++ .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 146 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 296 + .../pip/_internal/utils/unpacking.py | 257 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 134 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 583 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 0 -> 5075 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 0 -> 19044 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 0 -> 7664 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 0 -> 12536 bytes .../versioncontrol.cpython-312.pyc | Bin 0 -> 29062 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 ++ .../pip/_internal/wheel_builder.py | 354 + .../site-packages/pip/_vendor/__init__.py | 121 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4745 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 0 -> 41322 bytes .../typing_extensions.cpython-312.pyc | Bin 0 -> 122102 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 955 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 0 -> 2699 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 0 -> 6517 bytes .../__pycache__/cache.cpython-312.pyc | Bin 0 -> 3862 bytes .../__pycache__/controller.cpython-312.pyc | Bin 0 -> 16220 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 0 -> 4400 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 0 -> 6747 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 6458 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 0 -> 1727 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 488 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 0 -> 7763 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 0 -> 2791 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 + .../cachecontrol/caches/redis_cache.py | 48 + .../pip/_vendor/cachecontrol/controller.py | 494 + .../pip/_vendor/cachecontrol/filewrapper.py | 119 + .../pip/_vendor/cachecontrol/heuristics.py | 154 + .../pip/_vendor/cachecontrol/serialize.py | 206 + .../pip/_vendor/cachecontrol/wrapper.py | 43 + .../pip/_vendor/certifi/__init__.py | 4 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 371 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 698 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 0 -> 3380 bytes .../pip/_vendor/certifi/cacert.pem | 4635 +++++++++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4621 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 0 -> 27252 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 0 -> 1440 bytes .../chardistribution.cpython-312.pyc | Bin 0 -> 9691 bytes .../charsetgroupprober.cpython-312.pyc | Bin 0 -> 4175 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 0 -> 5071 bytes .../codingstatemachine.cpython-312.pyc | Bin 0 -> 3931 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 0 -> 842 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 0 -> 1449 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 0 -> 3049 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 0 -> 4619 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 0 -> 15363 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 0 -> 4436 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 0 -> 12135 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 0 -> 1443 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 0 -> 27257 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 0 -> 1443 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 0 -> 19179 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 0 -> 1456 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 0 -> 5875 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 0 -> 22208 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 0 -> 83056 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 0 -> 1447 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 0 -> 39602 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 0 -> 83175 bytes .../langgreekmodel.cpython-312.pyc | Bin 0 -> 77041 bytes .../langhebrewmodel.cpython-312.pyc | Bin 0 -> 77552 bytes .../langhungarianmodel.cpython-312.pyc | Bin 0 -> 83129 bytes .../langrussianmodel.cpython-312.pyc | Bin 0 -> 105304 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 0 -> 77730 bytes .../langturkishmodel.cpython-312.pyc | Bin 0 -> 77569 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 0 -> 7055 bytes .../macromanprober.cpython-312.pyc | Bin 0 -> 7235 bytes .../mbcharsetprober.cpython-312.pyc | Bin 0 -> 3956 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 0 -> 1641 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 0 -> 38698 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 0 -> 685 bytes .../sbcharsetprober.cpython-312.pyc | Bin 0 -> 6440 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 0 -> 2410 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 0 -> 4548 bytes .../universaldetector.cpython-312.pyc | Bin 0 -> 12322 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 0 -> 10032 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 0 -> 3228 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 541 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 261 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 147 + .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 248 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 0 -> 4065 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 + .../pip/_vendor/chardet/codingstatemachine.py | 90 + .../_vendor/chardet/codingstatemachinedict.py | 19 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 85 + .../pip/_vendor/chardet/escprober.py | 102 + .../pip/_vendor/chardet/escsm.py | 261 + .../pip/_vendor/chardet/eucjpprober.py | 102 + .../pip/_vendor/chardet/euckrfreq.py | 196 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 388 + .../pip/_vendor/chardet/euctwprober.py | 47 + .../pip/_vendor/chardet/gb2312freq.py | 284 + .../pip/_vendor/chardet/gb2312prober.py | 47 + .../pip/_vendor/chardet/hebrewprober.py | 316 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/johabfreq.py | 2382 +++++ .../pip/_vendor/chardet/johabprober.py | 47 + .../pip/_vendor/chardet/jpcntx.py | 238 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langgreekmodel.py | 4397 +++++++++ .../pip/_vendor/chardet/langhebrewmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langhungarianmodel.py | 4649 +++++++++ .../pip/_vendor/chardet/langrussianmodel.py | 5725 +++++++++++ .../pip/_vendor/chardet/langthaimodel.py | 4380 +++++++++ .../pip/_vendor/chardet/langturkishmodel.py | 4380 +++++++++ .../pip/_vendor/chardet/latin1prober.py | 147 + .../pip/_vendor/chardet/macromanprober.py | 162 + .../pip/_vendor/chardet/mbcharsetprober.py | 95 + .../pip/_vendor/chardet/mbcsgroupprober.py | 57 + .../pip/_vendor/chardet/mbcssm.py | 661 ++ .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 253 bytes .../__pycache__/languages.cpython-312.pyc | Bin 0 -> 9808 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 + .../pip/_vendor/chardet/resultdict.py | 16 + .../pip/_vendor/chardet/sbcharsetprober.py | 162 + .../pip/_vendor/chardet/sbcsgroupprober.py | 88 + .../pip/_vendor/chardet/sjisprober.py | 105 + .../pip/_vendor/chardet/universaldetector.py | 362 + .../pip/_vendor/chardet/utf1632prober.py | 225 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 545 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 4003 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 0 -> 16474 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 0 -> 3603 bytes .../__pycache__/win32.cpython-312.pyc | Bin 0 -> 8179 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 0 -> 9141 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 277 + .../pip/_vendor/colorama/initialise.py | 121 + .../pip/_vendor/colorama/tests/__init__.py | 1 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 251 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 0 -> 5520 bytes .../ansitowin32_test.cpython-312.pyc | Bin 0 -> 18156 bytes .../initialise_test.cpython-312.pyc | Bin 0 -> 11801 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 0 -> 4957 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 0 -> 2541 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 0 -> 6665 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 + .../colorama/tests/ansitowin32_test.py | 294 + .../_vendor/colorama/tests/initialise_test.py | 189 + .../pip/_vendor/colorama/tests/isatty_test.py | 57 + .../pip/_vendor/colorama/tests/utils.py | 49 + .../_vendor/colorama/tests/winterm_test.py | 131 + .../pip/_vendor/colorama/win32.py | 180 + .../pip/_vendor/colorama/winterm.py | 195 + .../pip/_vendor/distlib/__init__.py | 33 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1322 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 45658 bytes .../__pycache__/database.cpython-312.pyc | Bin 0 -> 66080 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 0 -> 24419 bytes .../__pycache__/locators.cpython-312.pyc | Bin 0 -> 60211 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 0 -> 15178 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 7735 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 41852 bytes .../__pycache__/resources.cpython-312.pyc | Bin 0 -> 17378 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 0 -> 19633 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 0 -> 88309 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 30419 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 0 -> 51914 bytes .../pip/_vendor/distlib/compat.py | 1138 +++ .../pip/_vendor/distlib/database.py | 1359 +++ .../pip/_vendor/distlib/index.py | 508 + .../pip/_vendor/distlib/locators.py | 1303 +++ .../pip/_vendor/distlib/manifest.py | 384 + .../pip/_vendor/distlib/markers.py | 167 + .../pip/_vendor/distlib/metadata.py | 1068 ++ .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 452 + .../site-packages/pip/_vendor/distlib/util.py | 2025 ++++ .../pip/_vendor/distlib/version.py | 751 ++ .../pip/_vendor/distlib/wheel.py | 1099 +++ .../pip/_vendor/distro/__init__.py | 54 + .../pip/_vendor/distro/__main__.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1013 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 345 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 0 -> 53807 bytes .../pip/_vendor/distro/distro.py | 1399 +++ .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 934 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 0 -> 4686 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 0 -> 940 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 0 -> 16076 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 0 -> 99550 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 0 -> 2691 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 0 -> 269 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 0 -> 158923 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 400 + .../pip/_vendor/idna/idnadata.py | 4246 ++++++++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8600 +++++++++++++++++ .../pip/_vendor/msgpack/__init__.py | 57 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1884 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 2078 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 0 -> 8721 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 0 -> 43629 bytes .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1010 ++ .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-312.pyc | Bin 0 -> 683 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 519 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 0 -> 12129 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 0 -> 6963 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 0 -> 3294 bytes .../__pycache__/markers.cpython-312.pyc | Bin 0 -> 14111 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 0 -> 6999 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 0 -> 31300 bytes .../__pycache__/tags.cpython-312.pyc | Bin 0 -> 19009 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 5921 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 19992 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 ++ .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pkg_resources/__init__.py | 3361 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 146527 bytes .../pip/_vendor/platformdirs/__init__.py | 566 ++ .../pip/_vendor/platformdirs/__main__.py | 53 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 18082 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1999 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 9497 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 9725 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 5690 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 12494 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 364 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13052 bytes .../pip/_vendor/platformdirs/android.py | 210 + .../pip/_vendor/platformdirs/api.py | 223 + .../pip/_vendor/platformdirs/macos.py | 91 + .../pip/_vendor/platformdirs/unix.py | 223 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 255 + .../pip/_vendor/pygments/__init__.py | 82 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3542 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 788 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 0 -> 26659 bytes .../__pycache__/console.cpython-312.pyc | Bin 0 -> 2680 bytes .../__pycache__/filter.cpython-312.pyc | Bin 0 -> 3286 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 0 -> 4623 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 0 -> 38383 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 0 -> 1622 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 0 -> 3450 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 0 -> 4135 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 0 -> 4810 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 0 -> 11100 bytes .../__pycache__/style.cpython-312.pyc | Bin 0 -> 6728 bytes .../__pycache__/token.cpython-312.pyc | Bin 0 -> 8196 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 0 -> 33042 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 0 -> 14035 bytes .../pip/_vendor/pygments/cmdline.py | 668 ++ .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 940 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 37990 bytes .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6980 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 4269 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 0 -> 4248 bytes .../__pycache__/groff.cpython-312.pyc | Bin 0 -> 7318 bytes .../__pycache__/html.cpython-312.pyc | Bin 0 -> 40626 bytes .../__pycache__/img.cpython-312.pyc | Bin 0 -> 27097 bytes .../__pycache__/irc.cpython-312.pyc | Bin 0 -> 6119 bytes .../__pycache__/latex.cpython-312.pyc | Bin 0 -> 20008 bytes .../__pycache__/other.cpython-312.pyc | Bin 0 -> 6938 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 0 -> 2984 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 0 -> 6180 bytes .../__pycache__/svg.cpython-312.pyc | Bin 0 -> 9120 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 0 -> 5883 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 0 -> 15211 bytes .../_vendor/pygments/formatters/_mapping.py | 23 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 170 + .../pip/_vendor/pygments/formatters/html.py | 989 ++ .../pip/_vendor/pygments/formatters/img.py | 645 ++ .../pip/_vendor/pygments/formatters/irc.py | 154 + .../pip/_vendor/pygments/formatters/latex.py | 521 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 943 ++ .../pip/_vendor/pygments/lexers/__init__.py | 362 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 14706 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 0 -> 64458 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 0 -> 42693 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 ++ .../pip/_vendor/pygments/lexers/python.py | 1198 +++ .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 88 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 217 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 103 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4502 bytes .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7965 bytes .../__pycache__/actions.cpython-312.pyc | Bin 0 -> 8449 bytes .../__pycache__/common.cpython-312.pyc | Bin 0 -> 13468 bytes .../__pycache__/core.cpython-312.pyc | Bin 0 -> 267762 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13048 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 48555 bytes .../__pycache__/results.cpython-312.pyc | Bin 0 -> 34164 bytes .../__pycache__/testing.cpython-312.pyc | Bin 0 -> 17242 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 0 -> 13238 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 14958 bytes .../pip/_vendor/pyparsing/actions.py | 217 + .../pip/_vendor/pyparsing/common.py | 432 + .../pip/_vendor/pyparsing/core.py | 6115 ++++++++++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 26867 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 + .../pip/_vendor/pyparsing/helpers.py | 1100 +++ .../pip/_vendor/pyparsing/results.py | 796 ++ .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 361 + .../pip/_vendor/pyparsing/util.py | 284 + .../pip/_vendor/pyproject_hooks/__init__.py | 23 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 667 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 0 -> 428 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 0 -> 14779 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1134 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 0 -> 14451 bytes .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 5507 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 638 bytes .../_internal_utils.cpython-312.pyc | Bin 0 -> 2078 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 21334 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 0 -> 7258 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 0 -> 13977 bytes .../__pycache__/certs.cpython-312.pyc | Bin 0 -> 976 bytes .../__pycache__/compat.cpython-312.pyc | Bin 0 -> 1561 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 0 -> 25300 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 7101 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 0 -> 4366 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 0 -> 1106 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 35502 bytes .../__pycache__/packages.cpython-312.pyc | Bin 0 -> 826 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 0 -> 27811 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 0 -> 6013 bytes .../__pycache__/structures.cpython-312.pyc | Bin 0 -> 5671 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 36129 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 50 + .../pip/_vendor/requests/adapters.py | 538 ++ .../site-packages/pip/_vendor/requests/api.py | 157 + .../pip/_vendor/requests/auth.py | 315 + .../pip/_vendor/requests/certs.py | 24 + .../pip/_vendor/requests/compat.py | 67 + .../pip/_vendor/requests/cookies.py | 561 ++ .../pip/_vendor/requests/exceptions.py | 141 + .../pip/_vendor/requests/help.py | 131 + .../pip/_vendor/requests/hooks.py | 33 + .../pip/_vendor/requests/models.py | 1034 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 833 ++ .../pip/_vendor/requests/status_codes.py | 128 + .../pip/_vendor/requests/structures.py | 99 + .../pip/_vendor/requests/utils.py | 1088 +++ .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 688 bytes .../__pycache__/providers.cpython-312.pyc | Bin 0 -> 6905 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 0 -> 2708 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 0 -> 25951 bytes .../__pycache__/structs.cpython-312.pyc | Bin 0 -> 10560 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 254 bytes .../collections_abc.cpython-312.pyc | Bin 0 -> 474 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 547 ++ .../pip/_vendor/resolvelib/structs.py | 170 + .../pip/_vendor/rich/__init__.py | 177 + .../pip/_vendor/rich/__main__.py | 274 + .../rich/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 7069 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 10358 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 0 -> 7875 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 0 -> 206030 bytes .../_emoji_replace.cpython-312.pyc | Bin 0 -> 1783 bytes .../_export_format.cpython-312.pyc | Bin 0 -> 2375 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 0 -> 591 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 0 -> 909 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 0 -> 12131 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 0 -> 4201 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 0 -> 1939 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 0 -> 3674 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 0 -> 5214 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 0 -> 780 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 0 -> 6633 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 0 -> 13233 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 0 -> 1019 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 0 -> 919 bytes .../_win32_console.cpython-312.pyc | Bin 0 -> 29030 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 0 -> 2544 bytes .../_windows_renderer.cpython-312.pyc | Bin 0 -> 3627 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 0 -> 2414 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 0 -> 1662 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 0 -> 12376 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 0 -> 9160 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 0 -> 4326 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 0 -> 11912 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 0 -> 5672 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 0 -> 26624 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 0 -> 1755 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 0 -> 8641 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 0 -> 113847 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 0 -> 2312 bytes .../__pycache__/containers.cpython-312.pyc | Bin 0 -> 9280 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 0 -> 10983 bytes .../default_styles.cpython-312.pyc | Bin 0 -> 10427 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 1541 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 0 -> 4263 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 0 -> 1899 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 0 -> 3631 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 0 -> 3136 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 0 -> 9952 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 0 -> 6089 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 0 -> 5263 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 0 -> 20274 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 0 -> 19197 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 0 -> 4948 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 0 -> 13608 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 0 -> 9352 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 0 -> 6430 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 0 -> 7188 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 0 -> 1874 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 0 -> 5368 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 0 -> 12151 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 0 -> 40110 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 0 -> 75132 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 0 -> 10443 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 0 -> 14835 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 0 -> 1846 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 0 -> 621 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 0 -> 6680 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 0 -> 6622 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 0 -> 3884 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 0 -> 2538 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 0 -> 28215 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 0 -> 6118 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 0 -> 6122 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 0 -> 33568 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 0 -> 2193 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 0 -> 39666 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 0 -> 43638 bytes .../terminal_theme.cpython-312.pyc | Bin 0 -> 3402 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 0 -> 59017 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 0 -> 6394 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 0 -> 368 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 0 -> 31602 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 0 -> 11493 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../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 | 270 + .../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 | 160 + .../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 | 662 ++ .../pip/_vendor/rich/_windows.py | 72 + .../pip/_vendor/rich/_windows_renderer.py | 56 + .../site-packages/pip/_vendor/rich/_wrap.py | 56 + .../site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 311 + .../site-packages/pip/_vendor/rich/ansi.py | 240 + .../site-packages/pip/_vendor/rich/bar.py | 94 + .../site-packages/pip/_vendor/rich/box.py | 517 + .../site-packages/pip/_vendor/rich/cells.py | 154 + .../site-packages/pip/_vendor/rich/color.py | 622 ++ .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2633 +++++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 225 + .../pip/_vendor/rich/default_styles.py | 190 + .../pip/_vendor/rich/diagnose.py | 37 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 57 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 232 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 101 + .../site-packages/pip/_vendor/rich/layout.py | 443 + .../site-packages/pip/_vendor/rich/live.py | 375 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 289 + .../site-packages/pip/_vendor/rich/markup.py | 246 + .../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 | 308 + .../site-packages/pip/_vendor/rich/pretty.py | 994 ++ .../pip/_vendor/rich/progress.py | 1702 ++++ .../pip/_vendor/rich/progress_bar.py | 224 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../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 | 739 ++ .../site-packages/pip/_vendor/rich/spinner.py | 137 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 796 ++ .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 948 ++ .../site-packages/pip/_vendor/rich/table.py | 1002 ++ .../pip/_vendor/rich/terminal_theme.py | 153 + .../site-packages/pip/_vendor/rich/text.py | 1307 +++ .../site-packages/pip/_vendor/rich/theme.py | 115 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 756 ++ .../site-packages/pip/_vendor/rich/tree.py | 251 + .../site-packages/pip/_vendor/six.py | 998 ++ .../pip/_vendor/tenacity/__init__.py | 608 ++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27140 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 0 -> 4860 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 0 -> 2369 bytes .../__pycache__/after.cpython-312.pyc | Bin 0 -> 1678 bytes .../__pycache__/before.cpython-312.pyc | Bin 0 -> 1518 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 0 -> 2356 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 0 -> 1466 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 14335 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 0 -> 5622 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 0 -> 2640 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 0 -> 12467 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 + .../pip/_vendor/tenacity/_utils.py | 76 + .../pip/_vendor/tenacity/after.py | 51 + .../pip/_vendor/tenacity/before.py | 46 + .../pip/_vendor/tenacity/before_sleep.py | 71 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 272 + .../pip/_vendor/tenacity/stop.py | 103 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 228 + .../pip/_vendor/tomli/__init__.py | 11 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 438 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 0 -> 26981 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 0 -> 3962 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 0 -> 420 bytes .../pip/_vendor/tomli/_parser.py | 691 ++ .../site-packages/pip/_vendor/tomli/_re.py | 107 + .../site-packages/pip/_vendor/tomli/_types.py | 10 + .../pip/_vendor/truststore/__init__.py | 13 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 672 bytes .../__pycache__/_api.cpython-312.pyc | Bin 0 -> 15851 bytes .../__pycache__/_macos.cpython-312.pyc | Bin 0 -> 16716 bytes .../__pycache__/_openssl.cpython-312.pyc | Bin 0 -> 2269 bytes .../_ssl_constants.cpython-312.pyc | Bin 0 -> 1153 bytes .../__pycache__/_windows.cpython-312.pyc | Bin 0 -> 15560 bytes .../pip/_vendor/truststore/_api.py | 302 + .../pip/_vendor/truststore/_macos.py | 501 + .../pip/_vendor/truststore/_openssl.py | 66 + .../pip/_vendor/truststore/_ssl_constants.py | 31 + .../pip/_vendor/truststore/_windows.py | 554 ++ .../pip/_vendor/typing_extensions.py | 3072 ++++++ .../pip/_vendor/urllib3/__init__.py | 102 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3459 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 0 -> 16542 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 272 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 20461 bytes .../connectionpool.cpython-312.pyc | Bin 0 -> 36496 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 13547 bytes .../__pycache__/fields.cpython-312.pyc | Bin 0 -> 10467 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 0 -> 4072 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 0 -> 20854 bytes .../__pycache__/request.cpython-312.pyc | Bin 0 -> 7348 bytes .../__pycache__/response.cpython-312.pyc | Bin 0 -> 34022 bytes .../pip/_vendor/urllib3/_collections.py | 355 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 572 ++ .../pip/_vendor/urllib3/connectionpool.py | 1137 +++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 252 bytes .../_appengine_environ.cpython-312.pyc | Bin 0 -> 1902 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 0 -> 11618 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 0 -> 5773 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 0 -> 24504 bytes .../securetransport.cpython-312.pyc | Bin 0 -> 35610 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 0 -> 7565 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 269 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 0 -> 17481 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 0 -> 14855 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 518 + .../urllib3/contrib/securetransport.py | 921 ++ .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 253 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 0 -> 41373 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 263 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 0 -> 1879 bytes .../weakref_finalize.cpython-312.pyc | Bin 0 -> 7385 bytes .../urllib3/packages/backports/makefile.py | 51 + .../packages/backports/weakref_finalize.py | 155 + .../pip/_vendor/urllib3/packages/six.py | 1076 +++ .../pip/_vendor/urllib3/poolmanager.py | 556 ++ .../pip/_vendor/urllib3/request.py | 191 + .../pip/_vendor/urllib3/response.py | 879 ++ .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1200 bytes .../__pycache__/connection.cpython-312.pyc | Bin 0 -> 4810 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 0 -> 1606 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 0 -> 1406 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 0 -> 4237 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 0 -> 3043 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 0 -> 21772 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 0 -> 15157 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 0 -> 5125 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 0 -> 10826 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 0 -> 11193 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 0 -> 15849 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 0 -> 4457 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 137 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 622 ++ .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 159 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 271 + .../pip/_vendor/urllib3/util/url.py | 435 + .../pip/_vendor/urllib3/util/wait.py | 152 + .../site-packages/pip/_vendor/vendor.txt | 24 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 12055 bytes .../__pycache__/labels.cpython-312.pyc | Bin 0 -> 7186 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 0 -> 2753 bytes .../__pycache__/tests.cpython-312.pyc | Bin 0 -> 9305 bytes .../x_user_defined.cpython-312.pyc | Bin 0 -> 3349 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../lib/python3.12/site-packages/pip/py.typed | 4 + .../lib/python3.12/site-packages/platform.pyi | 51 + .../platformdirs-4.5.0.dist-info/INSTALLER | 1 + .../platformdirs-4.5.0.dist-info/METADATA | 350 + .../platformdirs-4.5.0.dist-info/RECORD | 22 + .../platformdirs-4.5.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 21 + .../site-packages/platformdirs/__init__.py | 631 ++ .../site-packages/platformdirs/__main__.py | 55 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 19840 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 1997 bytes .../__pycache__/android.cpython-312.pyc | Bin 0 -> 10736 bytes .../__pycache__/api.cpython-312.pyc | Bin 0 -> 13401 bytes .../__pycache__/macos.cpython-312.pyc | Bin 0 -> 9044 bytes .../__pycache__/unix.cpython-312.pyc | Bin 0 -> 14787 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 844 bytes .../__pycache__/windows.cpython-312.pyc | Bin 0 -> 13714 bytes .../site-packages/platformdirs/android.py | 249 + .../site-packages/platformdirs/api.py | 299 + .../site-packages/platformdirs/macos.py | 146 + .../site-packages/platformdirs/py.typed | 0 .../site-packages/platformdirs/unix.py | 272 + .../site-packages/platformdirs/version.py | 34 + .../site-packages/platformdirs/windows.py | 272 + .../pyserial-3.5.dist-info/DESCRIPTION.rst | 13 + .../pyserial-3.5.dist-info/INSTALLER | 1 + .../pyserial-3.5.dist-info/METADATA | 47 + .../pyserial-3.5.dist-info/RECORD | 66 + .../pyserial-3.5.dist-info/WHEEL | 6 + .../pyserial-3.5.dist-info/entry_points.txt | 4 + .../pyserial-3.5.dist-info/metadata.json | 1 + .../pyserial-3.5.dist-info/top_level.txt | 1 + .venv/lib/python3.12/site-packages/random.pyi | 115 + .../python3.12/site-packages/rp2/__init__.pyi | 983 ++ .../python3.12/site-packages/rp2/asm_pio.pyi | 460 + .venv/lib/python3.12/site-packages/select.pyi | 123 + .../site-packages/serial/__init__.py | 91 + .../site-packages/serial/__main__.py | 3 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 3079 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 323 bytes .../__pycache__/rfc2217.cpython-312.pyc | Bin 0 -> 60657 bytes .../serial/__pycache__/rs485.cpython-312.pyc | Bin 0 -> 3926 bytes .../__pycache__/serialcli.cpython-312.pyc | Bin 0 -> 12525 bytes .../__pycache__/serialjava.cpython-312.pyc | Bin 0 -> 12888 bytes .../__pycache__/serialposix.cpython-312.pyc | Bin 0 -> 41354 bytes .../__pycache__/serialutil.cpython-312.pyc | Bin 0 -> 27510 bytes .../__pycache__/serialwin32.cpython-312.pyc | Bin 0 -> 26044 bytes .../serial/__pycache__/win32.cpython-312.pyc | Bin 0 -> 9382 bytes .../site-packages/serial/rfc2217.py | 1351 +++ .../python3.12/site-packages/serial/rs485.py | 94 + .../site-packages/serial/serialcli.py | 253 + .../site-packages/serial/serialjava.py | 251 + .../site-packages/serial/serialposix.py | 900 ++ .../site-packages/serial/serialutil.py | 697 ++ .../site-packages/serial/serialwin32.py | 477 + .../site-packages/serial/threaded/__init__.py | 297 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 13944 bytes .../site-packages/serial/tools/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 237 bytes .../__pycache__/hexlify_codec.cpython-312.pyc | Bin 0 -> 6446 bytes .../__pycache__/list_ports.cpython-312.pyc | Bin 0 -> 4335 bytes .../list_ports_common.cpython-312.pyc | Bin 0 -> 5764 bytes .../list_ports_linux.cpython-312.pyc | Bin 0 -> 6356 bytes .../list_ports_osx.cpython-312.pyc | Bin 0 -> 11989 bytes .../list_ports_posix.cpython-312.pyc | Bin 0 -> 5367 bytes .../list_ports_windows.cpython-312.pyc | Bin 0 -> 14889 bytes .../__pycache__/miniterm.cpython-312.pyc | Bin 0 -> 54198 bytes .../serial/tools/hexlify_codec.py | 126 + .../site-packages/serial/tools/list_ports.py | 110 + .../serial/tools/list_ports_common.py | 121 + .../serial/tools/list_ports_linux.py | 109 + .../serial/tools/list_ports_osx.py | 299 + .../serial/tools/list_ports_posix.py | 119 + .../serial/tools/list_ports_windows.py | 427 + .../site-packages/serial/tools/miniterm.py | 1042 ++ .../serial/urlhandler/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 242 bytes .../__pycache__/protocol_alt.cpython-312.pyc | Bin 0 -> 2423 bytes .../protocol_cp2110.cpython-312.pyc | Bin 0 -> 10613 bytes .../protocol_hwgrep.cpython-312.pyc | Bin 0 -> 3234 bytes .../__pycache__/protocol_loop.cpython-312.pyc | Bin 0 -> 14572 bytes .../protocol_rfc2217.cpython-312.pyc | Bin 0 -> 351 bytes .../protocol_socket.cpython-312.pyc | Bin 0 -> 16499 bytes .../__pycache__/protocol_spy.cpython-312.pyc | Bin 0 -> 15245 bytes .../serial/urlhandler/protocol_alt.py | 57 + .../serial/urlhandler/protocol_cp2110.py | 258 + .../serial/urlhandler/protocol_hwgrep.py | 91 + .../serial/urlhandler/protocol_loop.py | 308 + .../serial/urlhandler/protocol_rfc2217.py | 12 + .../serial/urlhandler/protocol_socket.py | 359 + .../serial/urlhandler/protocol_spy.py | 290 + .../python3.12/site-packages/serial/win32.py | 366 + .../python3.12/site-packages/stdlib/VERSIONS | 326 + .../site-packages/stdlib/__future__.pyi | 36 + .../python3.12/site-packages/stdlib/_ast.pyi | 149 + .../site-packages/stdlib/_codecs.pyi | 127 + .../site-packages/stdlib/_collections_abc.pyi | 101 + .../site-packages/stdlib/_decimal.pyi | 74 + .../site-packages/stdlib/_typeshed/README.md | 34 + .../stdlib/_typeshed/__init__.pyi | 361 + .../site-packages/stdlib/_typeshed/dbapi.pyi | 37 + .../stdlib/_typeshed/importlib.pyi | 18 + .../site-packages/stdlib/_typeshed/wsgi.pyi | 44 + .../site-packages/stdlib/_typeshed/xml.pyi | 9 + .../python3.12/site-packages/stdlib/abc.pyi | 51 + .../python3.12/site-packages/stdlib/array.pyi | 496 + .../site-packages/stdlib/asyncio/__init__.pyi | 45 + .../stdlib/asyncio/base_events.pyi | 482 + .../stdlib/asyncio/base_futures.pyi | 19 + .../stdlib/asyncio/base_tasks.pyi | 9 + .../stdlib/asyncio/constants.pyi | 20 + .../stdlib/asyncio/coroutines.pyi | 26 + .../site-packages/stdlib/asyncio/events.pyi | 645 ++ .../stdlib/asyncio/exceptions.pyi | 43 + .../stdlib/asyncio/format_helpers.pyi | 29 + .../site-packages/stdlib/asyncio/futures.pyi | 16 + .../site-packages/stdlib/asyncio/locks.pyi | 117 + .../site-packages/stdlib/asyncio/log.pyi | 3 + .../stdlib/asyncio/micropython.pyi | 39 + .../site-packages/stdlib/asyncio/mixins.pyi | 9 + .../stdlib/asyncio/proactor_events.pyi | 64 + .../stdlib/asyncio/protocols.pyi | 34 + .../site-packages/stdlib/asyncio/queues.pyi | 56 + .../site-packages/stdlib/asyncio/readme.md | 7 + .../site-packages/stdlib/asyncio/runners.pyi | 32 + .../stdlib/asyncio/selector_events.pyi | 8 + .../site-packages/stdlib/asyncio/sslproto.pyi | 165 + .../stdlib/asyncio/staggered.pyi | 10 + .../site-packages/stdlib/asyncio/streams.pyi | 187 + .../site-packages/stdlib/asyncio/tasks.pyi | 500 + .../site-packages/stdlib/asyncio/threads.pyi | 9 + .../site-packages/stdlib/asyncio/timeouts.pyi | 19 + .../stdlib/asyncio/transports.pyi | 47 + .../site-packages/stdlib/asyncio/trsock.pyi | 92 + .../site-packages/stdlib/builtins.pyi | 2074 ++++ .../stdlib/collections/__init__.pyi | 588 ++ .../site-packages/stdlib/collections/abc.pyi | 2 + .../python3.12/site-packages/stdlib/enum.pyi | 339 + .../python3.12/site-packages/stdlib/io.pyi | 999 ++ .../site-packages/stdlib/json/__init__.pyi | 321 + .../site-packages/stdlib/os/__init__.pyi | 1556 +++ .../python3.12/site-packages/stdlib/re.pyi | 308 + .../site-packages/stdlib/sre_compile.pyi | 10 + .../site-packages/stdlib/sre_constants.pyi | 123 + .../site-packages/stdlib/sre_parse.pyi | 104 + .../python3.12/site-packages/stdlib/ssl.pyi | 643 ++ .../site-packages/stdlib/struct.pyi | 120 + .../site-packages/stdlib/sys/__init__.pyi | 786 ++ .../python3.12/site-packages/stdlib/types.pyi | 641 ++ .../site-packages/stdlib/typing.pyi | 1075 +++ .../stdlib/typing_extensions.pyi | 531 + .../stubs/mypy-extensions/mypy_extensions.pyi | 214 + .venv/lib/python3.12/site-packages/time.pyi | 306 + .venv/lib/python3.12/site-packages/uarray.pyi | 2 + .../lib/python3.12/site-packages/uasyncio.pyi | 2 + .../python3.12/site-packages/ubinascii.pyi | 2 + .../python3.12/site-packages/ubluetooth.pyi | 2 + .../python3.12/site-packages/ucollections.pyi | 15 + .../python3.12/site-packages/ucryptolib.pyi | 14 + .../lib/python3.12/site-packages/uctypes.pyi | 107 + .venv/lib/python3.12/site-packages/uerrno.pyi | 2 + .../lib/python3.12/site-packages/uhashlib.pyi | 19 + .venv/lib/python3.12/site-packages/uheapq.pyi | 13 + .venv/lib/python3.12/site-packages/uio.pyi | 2 + .venv/lib/python3.12/site-packages/ujson.pyi | 2 + .../lib/python3.12/site-packages/umachine.pyi | 2 + .venv/lib/python3.12/site-packages/uos.pyi | 2 + .../python3.12/site-packages/uplatform.pyi | 2 + .../lib/python3.12/site-packages/urandom.pyi | 17 + .venv/lib/python3.12/site-packages/ure.pyi | 14 + .../lib/python3.12/site-packages/uselect.pyi | 2 + .../lib/python3.12/site-packages/usocket.pyi | 2 + .venv/lib/python3.12/site-packages/ussl.pyi | 2 + .../lib/python3.12/site-packages/ustruct.pyi | 2 + .venv/lib/python3.12/site-packages/usys.pyi | 2 + .venv/lib/python3.12/site-packages/utime.pyi | 2 + .venv/lib/python3.12/site-packages/uzlib.pyi | 2 + .venv/lib/python3.12/site-packages/vfs.pyi | 244 + .venv/lib64 | 1 + .venv/pyvenv.cfg | 5 + .vscode/settings.json | 13 + app.py | 3 + app/__init__.py | 0 app/classes/__init__.py | 0 app/classes/location.py | 9 + app/classes/weather.py | 59 + app/display/__init__.py | 0 app/display/emoji/emoji_16x16.py | 337 + app/display/emoji/emoji_5x7.py | 81 + app/display/emoji/emoji_8x8.py | 52 + app/display/fonts/__init__.py | 0 app/display/fonts/font_16x16.py | 1762 ++++ app/display/fonts/font_3x5.py | 90 + app/display/fonts/font_5x7.py | 109 + app/display/fonts/font_8x8.py | 109 + app/display/fonts/fonts_utils.py | 33 + app/display/neopixel_64x64.py | 323 + app/utils/__init__.py | 0 app/utils/colors.py | 98 + app/utils/system_load.py | 37 + app/utils/utils.py | 84 + app/web/wlan.py | 108 + async.py | 29 + deploy.fish | 17 + diagram.json | 27 + firmware/RPI_PICO-20250911-v1.26.1.uf2 | Bin 0 -> 668672 bytes main.py | 82 + readme.md | 7 + restapi/weather.http | 12 + wokwi.toml | 5 + 1303 files changed, 234711 insertions(+) create mode 100644 .venv/bin/Activate.ps1 create mode 100644 .venv/bin/activate create mode 100644 .venv/bin/activate.csh create mode 100644 .venv/bin/activate.fish create mode 100755 .venv/bin/mpremote create mode 100755 .venv/bin/pip create mode 100755 .venv/bin/pip3 create mode 100755 .venv/bin/pip3.12 create mode 100755 .venv/bin/pyserial-miniterm create mode 100755 .venv/bin/pyserial-ports create mode 120000 .venv/bin/python create mode 120000 .venv/bin/python3 create mode 120000 .venv/bin/python3.12 create mode 100644 .venv/lib/python3.12/site-packages/__builtins__.pyi create mode 100644 .venv/lib/python3.12/site-packages/_boot.pyi create mode 100644 .venv/lib/python3.12/site-packages/_boot_fat.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/IRQs.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/__pycache__/mp_implementation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/_collections_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/blockdevice.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/buffer_mp.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/collections/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/collections/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/io_modes.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/io_mp.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/mp_available.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/mp_implementation.py create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/neopixelbase.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/pathlike.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/subscriptable.pyi create mode 100644 .venv/lib/python3.12/site-packages/_mpy_shed/time_mp.pyi create mode 100644 .venv/lib/python3.12/site-packages/_onewire.pyi create mode 100644 .venv/lib/python3.12/site-packages/_thread.pyi create mode 100644 .venv/lib/python3.12/site-packages/binascii.pyi create mode 100644 .venv/lib/python3.12/site-packages/cmath.pyi create mode 100644 .venv/lib/python3.12/site-packages/cryptolib.pyi create mode 100644 .venv/lib/python3.12/site-packages/deflate.pyi create mode 100644 .venv/lib/python3.12/site-packages/dht.pyi create mode 100644 .venv/lib/python3.12/site-packages/ds18x20.pyi create mode 100644 .venv/lib/python3.12/site-packages/errno.pyi create mode 100644 .venv/lib/python3.12/site-packages/framebuf.pyi create mode 100644 .venv/lib/python3.12/site-packages/gc.pyi create mode 100644 .venv/lib/python3.12/site-packages/hashlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/heapq.pyi create mode 100644 .venv/lib/python3.12/site-packages/machine.pyi create mode 100644 .venv/lib/python3.12/site-packages/math.pyi create mode 100644 .venv/lib/python3.12/site-packages/micropython.pyi create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/LICENSE.md create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE.md create mode 100644 .venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE_typeshed create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/commands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/mip.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/mp_errno.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/repl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/romfs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/transport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/__pycache__/transport_serial.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/mpremote/commands.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/console.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/main.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/mip.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/mp_errno.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/repl.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/romfs.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/transport.py create mode 100644 .venv/lib/python3.12/site-packages/mpremote/transport_serial.py create mode 100644 .venv/lib/python3.12/site-packages/neopixel.pyi create mode 100644 .venv/lib/python3.12/site-packages/onewire.pyi create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 .venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 .venv/lib/python3.12/site-packages/platform.pyi create mode 100644 .venv/lib/python3.12/site-packages/platformdirs-4.5.0.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/platformdirs-4.5.0.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/platformdirs-4.5.0.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/platformdirs-4.5.0.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/platformdirs-4.5.0.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/android.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/api.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/macos.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/unix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/__pycache__/windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/android.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/api.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/macos.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/py.typed create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/unix.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/version.py create mode 100644 .venv/lib/python3.12/site-packages/platformdirs/windows.py create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/DESCRIPTION.rst create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/metadata.json create mode 100644 .venv/lib/python3.12/site-packages/pyserial-3.5.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/random.pyi create mode 100644 .venv/lib/python3.12/site-packages/rp2/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/rp2/asm_pio.pyi create mode 100644 .venv/lib/python3.12/site-packages/select.pyi create mode 100644 .venv/lib/python3.12/site-packages/serial/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/serial/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/rfc2217.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/rs485.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/serialcli.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/serialjava.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/serialposix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/serialutil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/serialwin32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/__pycache__/win32.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/rfc2217.py create mode 100644 .venv/lib/python3.12/site-packages/serial/rs485.py create mode 100644 .venv/lib/python3.12/site-packages/serial/serialcli.py create mode 100644 .venv/lib/python3.12/site-packages/serial/serialjava.py create mode 100644 .venv/lib/python3.12/site-packages/serial/serialposix.py create mode 100644 .venv/lib/python3.12/site-packages/serial/serialutil.py create mode 100644 .venv/lib/python3.12/site-packages/serial/serialwin32.py create mode 100644 .venv/lib/python3.12/site-packages/serial/threaded/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/serial/threaded/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/hexlify_codec.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports_common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports_linux.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports_osx.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports_posix.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/list_ports_windows.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/__pycache__/miniterm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/hexlify_codec.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports_common.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports_linux.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports_osx.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports_posix.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/list_ports_windows.py create mode 100644 .venv/lib/python3.12/site-packages/serial/tools/miniterm.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_alt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_cp2110.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_hwgrep.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_loop.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_rfc2217.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_socket.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/__pycache__/protocol_spy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_alt.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_cp2110.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_hwgrep.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_loop.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_rfc2217.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_socket.py create mode 100644 .venv/lib/python3.12/site-packages/serial/urlhandler/protocol_spy.py create mode 100644 .venv/lib/python3.12/site-packages/serial/win32.py create mode 100644 .venv/lib/python3.12/site-packages/stdlib/VERSIONS create mode 100644 .venv/lib/python3.12/site-packages/stdlib/__future__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_ast.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_codecs.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_collections_abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_decimal.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/README.md create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/dbapi.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/importlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/wsgi.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/_typeshed/xml.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/array.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/base_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/base_futures.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/base_tasks.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/coroutines.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/events.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/exceptions.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/format_helpers.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/futures.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/locks.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/log.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/micropython.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/mixins.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/proactor_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/protocols.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/queues.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/readme.md create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/runners.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/selector_events.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/sslproto.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/staggered.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/streams.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/tasks.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/threads.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/timeouts.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/transports.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/asyncio/trsock.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/builtins.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/collections/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/collections/abc.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/enum.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/io.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/json/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/os/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/re.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/sre_compile.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/sre_constants.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/sre_parse.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/ssl.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/struct.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/sys/__init__.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/types.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/typing.pyi create mode 100644 .venv/lib/python3.12/site-packages/stdlib/typing_extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/stubs/mypy-extensions/mypy_extensions.pyi create mode 100644 .venv/lib/python3.12/site-packages/time.pyi create mode 100644 .venv/lib/python3.12/site-packages/uarray.pyi create mode 100644 .venv/lib/python3.12/site-packages/uasyncio.pyi create mode 100644 .venv/lib/python3.12/site-packages/ubinascii.pyi create mode 100644 .venv/lib/python3.12/site-packages/ubluetooth.pyi create mode 100644 .venv/lib/python3.12/site-packages/ucollections.pyi create mode 100644 .venv/lib/python3.12/site-packages/ucryptolib.pyi create mode 100644 .venv/lib/python3.12/site-packages/uctypes.pyi create mode 100644 .venv/lib/python3.12/site-packages/uerrno.pyi create mode 100644 .venv/lib/python3.12/site-packages/uhashlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/uheapq.pyi create mode 100644 .venv/lib/python3.12/site-packages/uio.pyi create mode 100644 .venv/lib/python3.12/site-packages/ujson.pyi create mode 100644 .venv/lib/python3.12/site-packages/umachine.pyi create mode 100644 .venv/lib/python3.12/site-packages/uos.pyi create mode 100644 .venv/lib/python3.12/site-packages/uplatform.pyi create mode 100644 .venv/lib/python3.12/site-packages/urandom.pyi create mode 100644 .venv/lib/python3.12/site-packages/ure.pyi create mode 100644 .venv/lib/python3.12/site-packages/uselect.pyi create mode 100644 .venv/lib/python3.12/site-packages/usocket.pyi create mode 100644 .venv/lib/python3.12/site-packages/ussl.pyi create mode 100644 .venv/lib/python3.12/site-packages/ustruct.pyi create mode 100644 .venv/lib/python3.12/site-packages/usys.pyi create mode 100644 .venv/lib/python3.12/site-packages/utime.pyi create mode 100644 .venv/lib/python3.12/site-packages/uzlib.pyi create mode 100644 .venv/lib/python3.12/site-packages/vfs.pyi create mode 120000 .venv/lib64 create mode 100644 .venv/pyvenv.cfg create mode 100644 .vscode/settings.json create mode 100644 app.py create mode 100644 app/__init__.py create mode 100644 app/classes/__init__.py create mode 100644 app/classes/location.py create mode 100644 app/classes/weather.py create mode 100644 app/display/__init__.py create mode 100644 app/display/emoji/emoji_16x16.py create mode 100644 app/display/emoji/emoji_5x7.py create mode 100644 app/display/emoji/emoji_8x8.py create mode 100644 app/display/fonts/__init__.py create mode 100644 app/display/fonts/font_16x16.py create mode 100644 app/display/fonts/font_3x5.py create mode 100644 app/display/fonts/font_5x7.py create mode 100644 app/display/fonts/font_8x8.py create mode 100644 app/display/fonts/fonts_utils.py create mode 100644 app/display/neopixel_64x64.py create mode 100644 app/utils/__init__.py create mode 100644 app/utils/colors.py create mode 100644 app/utils/system_load.py create mode 100644 app/utils/utils.py create mode 100644 app/web/wlan.py create mode 100644 async.py create mode 100755 deploy.fish create mode 100644 diagram.json create mode 100644 firmware/RPI_PICO-20250911-v1.26.1.uf2 create mode 100644 main.py create mode 100644 readme.md create mode 100644 restapi/weather.http create mode 100644 wokwi.toml diff --git a/.venv/bin/Activate.ps1 b/.venv/bin/Activate.ps1 new file mode 100644 index 0000000..b49d77b --- /dev/null +++ b/.venv/bin/Activate.ps1 @@ -0,0 +1,247 @@ +<# +.Synopsis +Activate a Python virtual environment for the current PowerShell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + +.Notes +On Windows, it may be required to enable this Activate.ps1 script by setting the +execution policy for the user. You can do this by issuing the following PowerShell +command: + +PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +For more information on Execution Policies: +https://go.microsoft.com/fwlink/?LinkID=135170 + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove VIRTUAL_ENV_PROMPT altogether. + if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { + Remove-Item -Path env:VIRTUAL_ENV_PROMPT + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0, 1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} +else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} +else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } + $env:VIRTUAL_ENV_PROMPT = $Prompt +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate new file mode 100644 index 0000000..a0ce031 --- /dev/null +++ b/.venv/bin/activate @@ -0,0 +1,70 @@ +# This file must be used with "source bin/activate" *from bash* +# You cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # Call hash to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + hash -r 2> /dev/null + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + unset VIRTUAL_ENV_PROMPT + if [ ! "${1:-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +# on Windows, a path can contain colons and backslashes and has to be converted: +if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then + # transform D:\path\to\venv to /d/path/to/venv on MSYS + # and to /cygdrive/d/path/to/venv on Cygwin + export VIRTUAL_ENV=$(cygpath /home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv) +else + # use the path as-is + export VIRTUAL_ENV=/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv +fi + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/"bin":$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + PS1='(.venv) '"${PS1:-}" + export PS1 + VIRTUAL_ENV_PROMPT='(.venv) ' + export VIRTUAL_ENV_PROMPT +fi + +# Call hash to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +hash -r 2> /dev/null diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh new file mode 100644 index 0000000..28bb4a7 --- /dev/null +++ b/.venv/bin/activate.csh @@ -0,0 +1,27 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. + +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV /home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/"bin":$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + set prompt = '(.venv) '"$prompt" + setenv VIRTUAL_ENV_PROMPT '(.venv) ' +endif + +alias pydoc python -m pydoc + +rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish new file mode 100644 index 0000000..df5aa40 --- /dev/null +++ b/.venv/bin/activate.fish @@ -0,0 +1,69 @@ +# This file must be used with "source /bin/activate.fish" *from fish* +# (https://fishshell.com/). You cannot run it directly. + +function deactivate -d "Exit virtual environment and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + set -e _OLD_FISH_PROMPT_OVERRIDE + # prevents error when using nested fish instances (Issue #93858) + if functions -q _old_fish_prompt + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + end + + set -e VIRTUAL_ENV + set -e VIRTUAL_ENV_PROMPT + if test "$argv[1]" != "nondestructive" + # Self-destruct! + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV /home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/"bin $PATH + +# Unset PYTHONHOME if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # Save the current fish_prompt function as the function _old_fish_prompt. + functions -c fish_prompt _old_fish_prompt + + # With the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command. + set -l old_status $status + + # Output the venv prompt; color taken from the blue of the Python logo. + printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) + + # Restore the return status of the previous command. + echo "exit $old_status" | . + # Output the original/"old" prompt. + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" + set -gx VIRTUAL_ENV_PROMPT '(.venv) ' +end diff --git a/.venv/bin/mpremote b/.venv/bin/mpremote new file mode 100755 index 0000000..9b015cd --- /dev/null +++ b/.venv/bin/mpremote @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from mpremote.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip new file mode 100755 index 0000000..944b610 --- /dev/null +++ b/.venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 new file mode 100755 index 0000000..944b610 --- /dev/null +++ b/.venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pip3.12 b/.venv/bin/pip3.12 new file mode 100755 index 0000000..944b610 --- /dev/null +++ b/.venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pip._internal.cli.main import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pyserial-miniterm b/.venv/bin/pyserial-miniterm new file mode 100755 index 0000000..e2d58fb --- /dev/null +++ b/.venv/bin/pyserial-miniterm @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from serial.tools.miniterm import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/pyserial-ports b/.venv/bin/pyserial-ports new file mode 100755 index 0000000..f75b918 --- /dev/null +++ b/.venv/bin/pyserial-ports @@ -0,0 +1,8 @@ +#!/home/tiijay/Development/Microcontroller/rapsberry_pico/micropython/weather-info/.venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from serial.tools.list_ports import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/.venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 new file mode 120000 index 0000000..ae65fda --- /dev/null +++ b/.venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.12 b/.venv/bin/python3.12 new file mode 120000 index 0000000..b8a0adb --- /dev/null +++ b/.venv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/.venv/lib/python3.12/site-packages/__builtins__.pyi b/.venv/lib/python3.12/site-packages/__builtins__.pyi new file mode 100644 index 0000000..60a8dc3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/__builtins__.pyi @@ -0,0 +1,28 @@ +"""Allows for type checking of Micropython specific builtins by pyright and pylance. +""" + +from typing import Tuple, TypeVar + +Const_T = TypeVar("Const_T", int, float, str, bytes, Tuple) # constant + +def const(expr: Const_T) -> Const_T: + """ + Used to declare that the expression is a constant so that the compiler can + optimise it. The use of this function should be as follows:: + + from micropython import const + + CONST_X = const(123) + CONST_Y = const(2 * CONST_X + 1) + + Constants declared this way are still accessible as global variables from + outside the module they are declared in. On the other hand, if a constant + begins with an underscore then it is hidden, it is not available as a global + variable, and does not take up any memory during execution. + + This `const` function is recognised directly by the MicroPython parser and is + provided as part of the :mod:`micropython` module mainly so that scripts can be + written which run under both CPython and MicroPython, by following the above + pattern. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/_boot.pyi b/.venv/lib/python3.12/site-packages/_boot.pyi new file mode 100644 index 0000000..75abd7c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_boot.pyi @@ -0,0 +1,4 @@ +from _typeshed import Incomplete + +bdev: Incomplete +fs: Incomplete diff --git a/.venv/lib/python3.12/site-packages/_boot_fat.pyi b/.venv/lib/python3.12/site-packages/_boot_fat.pyi new file mode 100644 index 0000000..0bd844c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_boot_fat.pyi @@ -0,0 +1,3 @@ +from _typeshed import Incomplete + +bdev: Incomplete diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/IRQs.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/IRQs.pyi new file mode 100644 index 0000000..f312564 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/IRQs.pyi @@ -0,0 +1,31 @@ +""" +IRQ object types, used in the machine, bluetooth, _rp2 and rp2 modules + +_IRQ is a union of the types _IRQ_ESP32, _IRQ_RP2 and _IRQ_PYB +to allow the same stubs to support of the different ports of MicroPython. + +""" + +from typing import Type + +from _typeshed import Incomplete +from typing_extensions import TypeAlias + +class _IRQ_ESP32: + def trigger(self) -> int: ... + # def flags(self) -> int: ... + +class _IRQ_RP2: + # rp2040 + # object is of type irq + # flags -- + # trigger -- + def flags(self) -> int: ... + def trigger(self) -> int: ... + +# pybv11 +# TODO: Not sure what the correct implementation is +# NoneType +_IRQ_PYB: TypeAlias = None + +_IRQ: TypeAlias = Type[_IRQ_ESP32] | Type[_IRQ_RP2] | Type[_IRQ_PYB] | Incomplete diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/__init__.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/__init__.pyi new file mode 100644 index 0000000..bd135c1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/__init__.pyi @@ -0,0 +1,112 @@ +""" +MicroPython-stubs base types that are not present in typeshed. + +This is a collection of types that are not present in typeshed, but are used in the micropython stubs. + +Common cases are: +- MicroPython implementation is different from CPython, so the types are different. +- MicroPython has some types that are not present in CPython. + +""" + +from __future__ import annotations + +import abc # type: ignore - not collections.abc +import sys + +from typing import Final, final + +from _typeshed import Incomplete, structseq, AnyStr_co +from typing_extensions import TypeAlias, TypeVar + +from .subscriptable import Subscriptable as Subscriptable +from .IRQs import _IRQ +from .neopixelbase import _NeoPixelBase as _NeoPixelBase +from .blockdevice import ( + _BlockDeviceProtocol as _BlockDeviceProtocol, + _OldAbstractBlockDev, + _OldAbstractReadOnlyBlockDev, +) +from .buffer_mp import AnyReadableBuf as AnyReadableBuf, AnyWritableBuf as AnyWritableBuf + +from .io_mp import ( + BytesIO as BytesIO, + FileIO as FileIO, + IncrementalNewlineDecoder as IncrementalNewlineDecoder, + StringIO as StringIO, + TextIOWrapper as TextIOWrapper, + IOBase_mp as IOBase_mp, + _BufferedIOBase, + _IOBase, + _RawIOBase, + _TextIOBase, + open as open, +) + +from .time_mp import _TimeTuple as _TimeTuple +from .pathlike import PathLike as PathLike + +from .mp_implementation import _mp_implementation as _mp_implementation +from .mp_available import mp_available as mp_available +# ------------------ +# copied from _typeshed os.pyi as os.pyi cannot import from a module with the same name +GenericAlias = type(list[int]) + +# ------------------------------------------------------------------------------------ +StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] +_StrOrBytesT = TypeVar("_StrOrBytesT", str, bytes) + +# ------------------------------------------------------------------------------------ +_AnyPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] +_FdOrAnyPath: TypeAlias = int | _AnyPath + +# ------------------------------------------------------------------------------------ +# HID_Tuple is used in multiple pyb.submodules +HID_Tuple: TypeAlias = tuple[int, int, int, int, bytes] + +# ------------------------------------------------------------------------------------ +# copied from _typeshed os.pyi as os.pyi cannot import from a module with the same nam@final +@final +class uname_result(structseq[str], tuple[str, str, str, str, str]): + if sys.version_info >= (3, 8): + __match_args__: Final = ("sysname", "nodename", "release", "version", "machine") + + @property + def sysname(self) -> str: ... + @property + def nodename(self) -> str: ... + @property + def release(self) -> str: ... + @property + def version(self) -> str: ... + @property + def machine(self) -> str: ... + +# ------------------------------------------------------------------------------------ + +########################### +# HashLib + +# manual addition to hashlib.pyi + +class _Hash(abc.ABC): + """ + Abstract base class for hashing algorithms that defines methods available in all algorithms. + """ + + def update(self, data: AnyReadableBuf, /) -> None: + """ + Feed more binary data into hash. + """ + + def digest(self) -> bytes: + """ + Return hash for all data passed through hash, as a bytes object. After this + method is called, more data cannot be fed into the hash any longer. + """ + + def hexdigest(self) -> str: + """ + This method is NOT implemented. Use ``binascii.hexlify(hash.digest())`` + to achieve a similar effect. + """ diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/__pycache__/mp_implementation.cpython-312.pyc b/.venv/lib/python3.12/site-packages/_mpy_shed/__pycache__/mp_implementation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99d23eceb8b8d97f0660d9b0b0b4d74b9e28767d GIT binary patch literal 1243 zcmZWo&u`Q?6m}A4CLNdpMMA7rLgvSTk!aFsB~BF*5)wj)3Tfdo7vsjB#*oBW+tY5i zp~4+;DMyYV{*=A2+C7YN<+PU-Y!67BcuuB>iWlkm+3)4O_dS39b2uCzkVmWkWfw6* zAKm6iVBgB&HCPT1M-#+7?&n_NPy8a71RnCyZN!7;h~xKu7d*jrIO;vUKDZ}St?t)0 zQzh9I+DKT{l-NuVQ=3>8RW1rqT4r0%_G6LS!M`ra$Zvw1W!;1iW)PEhc{?30HisD) z2S}ia2W|Nep|MFIun4)o2_DfC{r1CC{EOR%JZR5d1a{UE0)NQEh3(FJoy~oLd0#|R z%%kUcvQ#gP2F(gBDtf$SHuex25ReC%G(@!k2v`oG7O5%#9T%MJv6@&#xHMLlJ2PoA z^5bl#S`|dWPns;Ib-a!t!a7SWYUX ztr^8_i@#Z>U3Ic2ZT9^-#_{@kytZ0tu`9*iwKm06%`}9RiaQj!UQJ!)4?X>w_i{ZiLRgG*M3roZ^NiD<#nOqQa-FygxD(e0VcdDGLv z&UBeBSOquMNdU{CBjy3B(a76+=h%Xw$Eohasd4dye0`NxsuDn3?k2h1PCD;KJYG+Xv|_bl z=@YgiOyU4glL?;uM3xw!ouG6_0Nt&o^y!742^Ig~KYxVf89D?LZ2<=(O5N-zZ3dJU ziqCRqpQQBn8Os-*KBZixa2&u5G^Z$KC6J_jVun)f2G;}Gfpi#wc^xir+P;! z0>j(^^#XnNgE0COp%csdcjm*Dmm4q5>y0*^ox>1(vv!M&k>g%Egl e$hcSiDeye+v+sNOON6`&UwWs#@&5=^Tj(3!^=8lj literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/_collections_abc.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/_collections_abc.pyi new file mode 100644 index 0000000..7a7ef09 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/_collections_abc.pyi @@ -0,0 +1,98 @@ +import sys +from abc import abstractmethod +from types import MappingProxyType +from typing import AbstractSet as Set # noqa: Y022,Y038 +from typing import AsyncGenerator as AsyncGenerator +from typing import AsyncIterable as AsyncIterable +from typing import AsyncIterator as AsyncIterator +from typing import Awaitable as Awaitable +from typing import Callable as Callable +from typing import Collection as Collection +from typing import Container as Container +from typing import Coroutine as Coroutine +from typing import Generator as Generator +from typing import Generic +from typing import Hashable as Hashable +from typing import ItemsView as ItemsView +from typing import Iterable as Iterable +from typing import Iterator as Iterator +from typing import KeysView as KeysView +from typing import Mapping as Mapping +from typing import MappingView as MappingView +from typing import MutableMapping as MutableMapping +from typing import MutableSequence as MutableSequence +from typing import MutableSet as MutableSet +from typing import Protocol +from typing import Reversible as Reversible +from typing import Sequence as Sequence +from typing import Sized as Sized +from typing import TypeVar +from typing import ValuesView as ValuesView +from typing import final, runtime_checkable + +__all__ = [ + "Awaitable", + "Coroutine", + "AsyncIterable", + "AsyncIterator", + "AsyncGenerator", + "Hashable", + "Iterable", + "Iterator", + "Generator", + "Reversible", + "Sized", + "Container", + "Callable", + "Collection", + "Set", + "MutableSet", + "Mapping", + "MutableMapping", + "MappingView", + "KeysView", + "ItemsView", + "ValuesView", + "Sequence", + "MutableSequence", +] +if sys.version_info < (3, 14): + from typing import ByteString as ByteString # noqa: Y057 + + __all__ += ["ByteString"] + +if sys.version_info >= (3, 12): + __all__ += ["Buffer"] + +_KT_co = TypeVar("_KT_co", covariant=True) # Key type covariant containers. +_VT_co = TypeVar("_VT_co", covariant=True) # Value type covariant containers. + +@final +class dict_keys(KeysView[_KT_co], Generic[_KT_co, _VT_co]): # undocumented + def __eq__(self, value: object, /) -> bool: ... + if sys.version_info >= (3, 13): + def isdisjoint(self, other: Iterable[_KT_co], /) -> bool: ... + if sys.version_info >= (3, 10): + @property + def mapping(self) -> MappingProxyType[_KT_co, _VT_co]: ... + +@final +class dict_values(ValuesView[_VT_co], Generic[_KT_co, _VT_co]): # undocumented + if sys.version_info >= (3, 10): + @property + def mapping(self) -> MappingProxyType[_KT_co, _VT_co]: ... + +@final +class dict_items(ItemsView[_KT_co, _VT_co]): # undocumented + def __eq__(self, value: object, /) -> bool: ... + if sys.version_info >= (3, 13): + def isdisjoint(self, other: Iterable[tuple[_KT_co, _VT_co]], /) -> bool: ... + if sys.version_info >= (3, 10): + @property + def mapping(self) -> MappingProxyType[_KT_co, _VT_co]: ... + +if sys.version_info >= (3, 12): + @runtime_checkable + class Buffer(Protocol): + @abstractmethod + def __buffer__(self, flags: int, /) -> memoryview: ... diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/blockdevice.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/blockdevice.pyi new file mode 100644 index 0000000..8604ddd --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/blockdevice.pyi @@ -0,0 +1,201 @@ +""" +The AbstractBlockDev class is a template for the design of block device classes, +MicroPython does not actually provide that class. + +In the type stubs this is implemented as a Protocol, which is a Python 3.8 feature that allows for more flexible type checking. + +It has been moved to the _mpy_shed type library for convinience, but may be relocated to the `vfs` stub module in the future. + +- vfs.*(...) +- os.AbstractBlockDev(...) +- pyb.AbstractBlockDev(...) +- pyb.Flash(...) +- (u)os.AbstractBlockDev(...) +- esp32.Partition.ioctl +https://docs.micropython.org/en/v1.24.0/reference/filesystem.html?highlight=abstractblockdev +- https://docs.micropython.org/en/v1.24.0/library/vfs.html#vfs.AbstractBlockDev +- https://docs.micropython.org/en/v1.20.0/library/os.html?highlight=abstractblockdev#block-devices +- https://docs.micropython.org/en/v1.20.0/library/pyb.html?highlight=abstractblockdev#block-devices +- https://docs.micropython.org/en/latest/library/esp32.html#esp32.Partition.ioctl +""" + +from typing import Any, Final, Literal, Protocol, Tuple, Type, final, overload, runtime_checkable + +from _typeshed import AnyStr_co, Incomplete, structseq +from typing_extensions import TypeAlias, TypeVar + +# TODO: improve the typechecking implementation if possible +_OldAbstractReadOnlyBlockDev: TypeAlias = Any +_OldAbstractBlockDev: TypeAlias = Any + +# documented as AbstractBlockDev in the vfs module documentation +@runtime_checkable +class _BlockDeviceProtocol(Protocol): + """ + Block devices + ------------- + + A block device is an object which implements the block protocol. This enables a + device to support MicroPython filesystems. The physical hardware is represented + by a user defined class. The :class:`AbstractBlockDev` class is a template for + the design of such a class: MicroPython does not actually provide that class, + but an actual block device class must implement the methods described below. + + A concrete implementation of this class will usually allow access to the + memory-like functionality of a piece of hardware (like flash memory). A block + device can be formatted to any supported filesystem and mounted using ``os`` + methods. + + See :ref:`filesystem` for example implementations of block devices using the + two variants of the block protocol described below. + + .. _block-device-interface: + + Simple and extended interface + ............................. + + There are two compatible signatures for the ``readblocks`` and ``writeblocks`` + methods (see below), in order to support a variety of use cases. A given block + device may implement one form or the other, or both at the same time. The second + form (with the offset parameter) is referred to as the "extended interface". + + Some filesystems (such as littlefs) that require more control over write + operations, for example writing to sub-block regions without erasing, may require + that the block device supports the extended interface. + """ + + def __init__(self) -> None: + """ + Construct a block device object. The parameters to the constructor are + dependent on the specific block device. + """ + + @overload + def readblocks(self, block_num: int, buf: bytearray, /) -> bool: + """ + The first form reads aligned, multiples of blocks. + Starting at the block given by the index *block_num*, read blocks from + the device into *buf* (an array of bytes). + The number of blocks to read is given by the length of *buf*, + which will be a multiple of the block size. + """ + + @overload + def readblocks(self, block_num: int, buf: bytearray, offset: int, /) -> bool: + """ + The second form allows reading at arbitrary locations within a block, + and arbitrary lengths. + Starting at block index *block_num*, and byte offset within that block + of *offset*, read bytes from the device into *buf* (an array of bytes). + The number of bytes to read is given by the length of *buf*. + """ + + @overload + def writeblocks(self, block_num: int, buf: bytes | bytearray, /) -> None: + """ + The first form writes aligned, multiples of blocks, and requires that the + blocks that are written to be first erased (if necessary) by this method. + Starting at the block given by the index *block_num*, write blocks from + *buf* (an array of bytes) to the device. + The number of blocks to write is given by the length of *buf*, + which will be a multiple of the block size. + + The second form allows writing at arbitrary locations within a block, + and arbitrary lengths. Only the bytes being written should be changed, + and the caller of this method must ensure that the relevant blocks are + erased via a prior ``ioctl`` call. + Starting at block index *block_num*, and byte offset within that block + of *offset*, write bytes from *buf* (an array of bytes) to the device. + The number of bytes to write is given by the length of *buf*. + + Note that implementations must never implicitly erase blocks if the offset + argument is specified, even if it is zero. + """ + + @overload + def writeblocks(self, block_num: int, buf: bytes | bytearray, offset: int, /) -> None: + """ + The first form writes aligned, multiples of blocks, and requires that the + blocks that are written to be first erased (if necessary) by this method. + Starting at the block given by the index *block_num*, write blocks from + *buf* (an array of bytes) to the device. + The number of blocks to write is given by the length of *buf*, + which will be a multiple of the block size. + + The second form allows writing at arbitrary locations within a block, + and arbitrary lengths. Only the bytes being written should be changed, + and the caller of this method must ensure that the relevant blocks are + erased via a prior ``ioctl`` call. + Starting at block index *block_num*, and byte offset within that block + of *offset*, write bytes from *buf* (an array of bytes) to the device. + The number of bytes to write is given by the length of *buf*. + + Note that implementations must never implicitly erase blocks if the offset + argument is specified, even if it is zero. + """ + + @overload + def ioctl(self, op: Literal[4, 5], arg: int) -> int: + """ + Control the block device and query its parameters. The operation to + perform is given by *op* which is one of the following integers: + + - 1 -- initialise the device (*arg* is unused) + - 2 -- shutdown the device (*arg* is unused) + - 3 -- sync the device (*arg* is unused) + - 4 -- get a count of the number of blocks, should return an integer + (*arg* is unused) + - 5 -- get the number of bytes in a block, should return an integer, + or ``None`` in which case the default value of 512 is used + (*arg* is unused) + - 6 -- erase a block, *arg* is the block number to erase + + As a minimum ``ioctl(4, ...)`` must be intercepted; for littlefs + ``ioctl(6, ...)`` must also be intercepted. The need for others is + hardware dependent. + + Prior to any call to ``writeblocks(block, ...)`` littlefs issues + ``ioctl(6, block)``. This enables a device driver to erase the block + prior to a write if the hardware requires it. Alternatively a driver + might intercept ``ioctl(6, block)`` and return 0 (success). In this case + the driver assumes responsibility for detecting the need for erasure. + + Unless otherwise stated ``ioctl(op, arg)`` can return ``None``. + Consequently an implementation can ignore unused values of ``op``. Where + ``op`` is intercepted, the return value for operations 4 and 5 are as + detailed above. Other operations should return 0 on success and non-zero + for failure, with the value returned being an ``OSError`` errno code. + """ + + @overload + def ioctl(self, op: Literal[1, 2, 3, 6], arg: int) -> int | None: + """ + Control the block device and query its parameters. The operation to + perform is given by *op* which is one of the following integers: + + - 1 -- initialise the device (*arg* is unused) + - 2 -- shutdown the device (*arg* is unused) + - 3 -- sync the device (*arg* is unused) + - 4 -- get a count of the number of blocks, should return an integer + (*arg* is unused) + - 5 -- get the number of bytes in a block, should return an integer, + or ``None`` in which case the default value of 512 is used + (*arg* is unused) + - 6 -- erase a block, *arg* is the block number to erase + + As a minimum ``ioctl(4, ...)`` must be intercepted; for littlefs + ``ioctl(6, ...)`` must also be intercepted. The need for others is + hardware dependent. + + Prior to any call to ``writeblocks(block, ...)`` littlefs issues + ``ioctl(6, block)``. This enables a device driver to erase the block + prior to a write if the hardware requires it. Alternatively a driver + might intercept ``ioctl(6, block)`` and return 0 (success). In this case + the driver assumes responsibility for detecting the need for erasure. + + Unless otherwise stated ``ioctl(op, arg)`` can return ``None``. + Consequently an implementation can ignore unused values of ``op``. Where + ``op`` is intercepted, the return value for operations 4 and 5 are as + detailed above. Other operations should return 0 on success and non-zero + for failure, with the value returned being an ``OSError`` errno code. + """ diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/buffer_mp.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/buffer_mp.pyi new file mode 100644 index 0000000..3ca190a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/buffer_mp.pyi @@ -0,0 +1,8 @@ +from _typeshed import Incomplete, structseq, AnyStr_co +from typing_extensions import TypeAlias, TypeVar +from array import array + +# ------------------------------------------------------------------------------------ +# TODO: need some to allow string to be passed in : uart_1.write("hello") +AnyReadableBuf: TypeAlias = bytearray | array | memoryview | bytes | Incomplete +AnyWritableBuf: TypeAlias = bytearray | array | memoryview | Incomplete diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/collections/__init__.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/collections/__init__.pyi new file mode 100644 index 0000000..2d3196f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/collections/__init__.pyi @@ -0,0 +1,553 @@ +import sys +from typing import Any, Generic, NoReturn, SupportsIndex, TypeVar, final, overload + +from _collections_abc import dict_items, dict_keys, dict_values +from _typeshed import ( + SupportsItems, + SupportsKeysAndGetItem, + SupportsRichComparison, + SupportsRichComparisonT, +) +from typing_extensions import Self + +if sys.version_info >= (3, 9): + # from types import GenericAlias + from _mpy_shed import GenericAlias + +if sys.version_info >= (3, 10): + from collections.abc import ( + Callable, + ItemsView, + Iterable, + Iterator, + KeysView, + Mapping, + MutableMapping, + MutableSequence, + Sequence, + ValuesView, + ) +else: + from _collections_abc import * + +__all__ = [ + "ChainMap", + "Counter", + "OrderedDict", + "UserDict", + "UserList", + "UserString", + "defaultdict", + "deque", + "namedtuple", +] + +_S = TypeVar("_S") +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_KT = TypeVar("_KT") +_VT = TypeVar("_VT") +_KT_co = TypeVar("_KT_co", covariant=True) +_VT_co = TypeVar("_VT_co", covariant=True) + +# namedtuple is special-cased in the type checker; the initializer is ignored. +def namedtuple( + typename: str, + field_names: str | Iterable[str], + *, + rename: bool = False, + module: str | None = None, + defaults: Iterable[Any] | None = None, +) -> type[tuple[Any, ...]]: ... + +class UserDict(MutableMapping[_KT, _VT]): + data: dict[_KT, _VT] + # __init__ should be kept roughly in line with `dict.__init__`, which has the same semantics + @overload + def __init__(self, dict: None = None, /) -> None: ... + @overload + def __init__( + self: UserDict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + dict: None = None, + /, + **kwargs: _VT, # pyright: ignore[reportInvalidTypeVarUse] #11780 + ) -> None: ... + @overload + def __init__(self, dict: SupportsKeysAndGetItem[_KT, _VT], /) -> None: ... + @overload + def __init__( + self: UserDict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + dict: SupportsKeysAndGetItem[str, _VT], + /, + **kwargs: _VT, + ) -> None: ... + @overload + def __init__(self, iterable: Iterable[tuple[_KT, _VT]], /) -> None: ... + @overload + def __init__( + self: UserDict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + iterable: Iterable[tuple[str, _VT]], + /, + **kwargs: _VT, + ) -> None: ... + @overload + def __init__(self: UserDict[str, str], iterable: Iterable[list[str]], /) -> None: ... + @overload + def __init__(self: UserDict[bytes, bytes], iterable: Iterable[list[bytes]], /) -> None: ... + def __len__(self) -> int: ... + def __getitem__(self, key: _KT) -> _VT: ... + def __setitem__(self, key: _KT, item: _VT) -> None: ... + def __delitem__(self, key: _KT) -> None: ... + def __iter__(self) -> Iterator[_KT]: ... + def __contains__(self, key: object) -> bool: ... + def copy(self) -> Self: ... + def __copy__(self) -> Self: ... + + # `UserDict.fromkeys` has the same semantics as `dict.fromkeys`, so should be kept in line with `dict.fromkeys`. + # TODO: Much like `dict.fromkeys`, the true signature of `UserDict.fromkeys` is inexpressible in the current type system. + # See #3800 & https://github.com/python/typing/issues/548#issuecomment-683336963. + @classmethod + @overload + def fromkeys(cls, iterable: Iterable[_T], value: None = None) -> UserDict[_T, Any | None]: ... + @classmethod + @overload + def fromkeys(cls, iterable: Iterable[_T], value: _S) -> UserDict[_T, _S]: ... + if sys.version_info >= (3, 9): + @overload + def __or__(self, other: UserDict[_KT, _VT] | dict[_KT, _VT]) -> Self: ... + @overload + def __or__( + self, other: UserDict[_T1, _T2] | dict[_T1, _T2] + ) -> UserDict[_KT | _T1, _VT | _T2]: ... + @overload + def __ror__(self, other: UserDict[_KT, _VT] | dict[_KT, _VT]) -> Self: ... + @overload + def __ror__( + self, other: UserDict[_T1, _T2] | dict[_T1, _T2] + ) -> UserDict[_KT | _T1, _VT | _T2]: ... + # UserDict.__ior__ should be kept roughly in line with MutableMapping.update() + @overload # type: ignore[misc] + def __ior__(self, other: SupportsKeysAndGetItem[_KT, _VT]) -> Self: ... + @overload + def __ior__(self, other: Iterable[tuple[_KT, _VT]]) -> Self: ... + if sys.version_info >= (3, 12): + @overload + def get(self, key: _KT, default: None = None) -> _VT | None: ... + @overload + def get(self, key: _KT, default: _T) -> _VT | _T: ... + +class UserList(MutableSequence[_T]): + data: list[_T] + @overload + def __init__(self, initlist: None = None) -> None: ... + @overload + def __init__(self, initlist: Iterable[_T]) -> None: ... + def __lt__(self, other: list[_T] | UserList[_T]) -> bool: ... + def __le__(self, other: list[_T] | UserList[_T]) -> bool: ... + def __gt__(self, other: list[_T] | UserList[_T]) -> bool: ... + def __ge__(self, other: list[_T] | UserList[_T]) -> bool: ... + def __eq__(self, other: object) -> bool: ... + def __contains__(self, item: object) -> bool: ... + def __len__(self) -> int: ... + @overload + def __getitem__(self, i: SupportsIndex) -> _T: ... + @overload + def __getitem__(self, i: slice) -> Self: ... + @overload + def __setitem__(self, i: SupportsIndex, item: _T) -> None: ... + @overload + def __setitem__(self, i: slice, item: Iterable[_T]) -> None: ... + def __delitem__(self, i: SupportsIndex | slice) -> None: ... + def __add__(self, other: Iterable[_T]) -> Self: ... + def __radd__(self, other: Iterable[_T]) -> Self: ... + def __iadd__(self, other: Iterable[_T]) -> Self: ... + def __mul__(self, n: int) -> Self: ... + def __rmul__(self, n: int) -> Self: ... + def __imul__(self, n: int) -> Self: ... + def append(self, item: _T) -> None: ... + def insert(self, i: int, item: _T) -> None: ... + def pop(self, i: int = -1) -> _T: ... + def remove(self, item: _T) -> None: ... + def copy(self) -> Self: ... + def __copy__(self) -> Self: ... + def count(self, item: _T) -> int: ... + # The runtime signature is "item, *args", and the arguments are then passed + # to `list.index`. In order to give more precise types, we pretend that the + # `item` argument is positional-only. + def index( + self, item: _T, start: SupportsIndex = 0, stop: SupportsIndex = sys.maxsize, / + ) -> int: ... + # All arguments are passed to `list.sort` at runtime, so the signature should be kept in line with `list.sort`. + @overload + def sort( + self: UserList[SupportsRichComparisonT], *, key: None = None, reverse: bool = False + ) -> None: ... + @overload + def sort( + self, *, key: Callable[[_T], SupportsRichComparison], reverse: bool = False + ) -> None: ... + def extend(self, other: Iterable[_T]) -> None: ... + +class UserString(Sequence[UserString]): + data: str + def __init__(self, seq: object) -> None: ... + def __int__(self) -> int: ... + def __float__(self) -> float: ... + def __complex__(self) -> complex: ... + def __getnewargs__(self) -> tuple[str]: ... + def __lt__(self, string: str | UserString) -> bool: ... + def __le__(self, string: str | UserString) -> bool: ... + def __gt__(self, string: str | UserString) -> bool: ... + def __ge__(self, string: str | UserString) -> bool: ... + def __eq__(self, string: object) -> bool: ... + def __hash__(self) -> int: ... + def __contains__(self, char: object) -> bool: ... + def __len__(self) -> int: ... + def __getitem__(self, index: SupportsIndex | slice) -> Self: ... + def __iter__(self) -> Iterator[Self]: ... + def __reversed__(self) -> Iterator[Self]: ... + def __add__(self, other: object) -> Self: ... + def __radd__(self, other: object) -> Self: ... + def __mul__(self, n: int) -> Self: ... + def __rmul__(self, n: int) -> Self: ... + def __mod__(self, args: Any) -> Self: ... + def __rmod__(self, template: object) -> Self: ... + def capitalize(self) -> Self: ... + def casefold(self) -> Self: ... + def center(self, width: int, *args: Any) -> Self: ... + def count(self, sub: str | UserString, start: int = 0, end: int = sys.maxsize) -> int: ... + def encode( + self: UserString, encoding: str | None = "utf-8", errors: str | None = "strict" + ) -> bytes: ... + def endswith( + self, suffix: str | tuple[str, ...], start: int | None = 0, end: int | None = sys.maxsize + ) -> bool: ... + def expandtabs(self, tabsize: int = 8) -> Self: ... + def find(self, sub: str | UserString, start: int = 0, end: int = sys.maxsize) -> int: ... + def format(self, *args: Any, **kwds: Any) -> str: ... + def format_map(self, mapping: Mapping[str, Any]) -> str: ... + def index(self, sub: str, start: int = 0, end: int = sys.maxsize) -> int: ... + def isalpha(self) -> bool: ... + def isalnum(self) -> bool: ... + def isdecimal(self) -> bool: ... + def isdigit(self) -> bool: ... + def isidentifier(self) -> bool: ... + def islower(self) -> bool: ... + def isnumeric(self) -> bool: ... + def isprintable(self) -> bool: ... + def isspace(self) -> bool: ... + def istitle(self) -> bool: ... + def isupper(self) -> bool: ... + def isascii(self) -> bool: ... + def join(self, seq: Iterable[str]) -> str: ... + def ljust(self, width: int, *args: Any) -> Self: ... + def lower(self) -> Self: ... + def lstrip(self, chars: str | None = None) -> Self: ... + maketrans = str.maketrans + def partition(self, sep: str) -> tuple[str, str, str]: ... + if sys.version_info >= (3, 9): + def removeprefix(self, prefix: str | UserString, /) -> Self: ... + def removesuffix(self, suffix: str | UserString, /) -> Self: ... + + def replace( + self, old: str | UserString, new: str | UserString, maxsplit: int = -1 + ) -> Self: ... + def rfind(self, sub: str | UserString, start: int = 0, end: int = sys.maxsize) -> int: ... + def rindex(self, sub: str | UserString, start: int = 0, end: int = sys.maxsize) -> int: ... + def rjust(self, width: int, *args: Any) -> Self: ... + def rpartition(self, sep: str) -> tuple[str, str, str]: ... + def rstrip(self, chars: str | None = None) -> Self: ... + def split(self, sep: str | None = None, maxsplit: int = -1) -> list[str]: ... + def rsplit(self, sep: str | None = None, maxsplit: int = -1) -> list[str]: ... + def splitlines(self, keepends: bool = False) -> list[str]: ... + def startswith( + self, prefix: str | tuple[str, ...], start: int | None = 0, end: int | None = sys.maxsize + ) -> bool: ... + def strip(self, chars: str | None = None) -> Self: ... + def swapcase(self) -> Self: ... + def title(self) -> Self: ... + def translate(self, *args: Any) -> Self: ... + def upper(self) -> Self: ... + def zfill(self, width: int) -> Self: ... + +class deque(MutableSequence[_T]): + @property + def maxlen(self) -> int | None: ... + @overload + def __init__(self, *, maxlen: int | None = None) -> None: ... + @overload + def __init__(self, iterable: Iterable[_T], maxlen: int | None = None) -> None: ... + def append(self, x: _T, /) -> None: ... + def appendleft(self, x: _T, /) -> None: ... + def copy(self) -> Self: ... + def count(self, x: _T, /) -> int: ... + def extend(self, iterable: Iterable[_T], /) -> None: ... + def extendleft(self, iterable: Iterable[_T], /) -> None: ... + def insert(self, i: int, x: _T, /) -> None: ... + def index(self, x: _T, start: int = 0, stop: int = ..., /) -> int: ... + def pop(self) -> _T: ... # type: ignore[override] + def popleft(self) -> _T: ... + def remove(self, value: _T, /) -> None: ... + def rotate(self, n: int = 1, /) -> None: ... + def __copy__(self) -> Self: ... + def __len__(self) -> int: ... + # These methods of deque don't take slices, unlike MutableSequence, hence the type: ignores + def __getitem__(self, key: SupportsIndex, /) -> _T: ... # type: ignore[override] + def __setitem__(self, key: SupportsIndex, value: _T, /) -> None: ... # type: ignore[override] + def __delitem__(self, key: SupportsIndex, /) -> None: ... # type: ignore[override] + def __contains__(self, key: object, /) -> bool: ... + def __reduce__(self) -> tuple[type[Self], tuple[()], None, Iterator[_T]]: ... + def __iadd__(self, value: Iterable[_T], /) -> Self: ... + def __add__(self, value: Self, /) -> Self: ... + def __mul__(self, value: int, /) -> Self: ... + def __imul__(self, value: int, /) -> Self: ... + def __lt__(self, value: deque[_T], /) -> bool: ... + def __le__(self, value: deque[_T], /) -> bool: ... + def __gt__(self, value: deque[_T], /) -> bool: ... + def __ge__(self, value: deque[_T], /) -> bool: ... + def __eq__(self, value: object, /) -> bool: ... + if sys.version_info >= (3, 9): + def __class_getitem__(cls, item: Any, /) -> GenericAlias: ... + +class Counter(dict[_T, int], Generic[_T]): + @overload + def __init__(self, iterable: None = None, /) -> None: ... + @overload + def __init__(self: Counter[str], iterable: None = None, /, **kwargs: int) -> None: ... + @overload + def __init__(self, mapping: SupportsKeysAndGetItem[_T, int], /) -> None: ... + @overload + def __init__(self, iterable: Iterable[_T], /) -> None: ... + def copy(self) -> Self: ... + def elements(self) -> Iterator[_T]: ... + def most_common(self, n: int | None = None) -> list[tuple[_T, int]]: ... + @classmethod + def fromkeys(cls, iterable: Any, v: int | None = None) -> NoReturn: ... # type: ignore[override] + @overload + def subtract(self, iterable: None = None, /) -> None: ... + @overload + def subtract(self, mapping: Mapping[_T, int], /) -> None: ... + @overload + def subtract(self, iterable: Iterable[_T], /) -> None: ... + # Unlike dict.update(), use Mapping instead of SupportsKeysAndGetItem for the first overload + # (source code does an `isinstance(other, Mapping)` check) + # + # The second overload is also deliberately different to dict.update() + # (if it were `Iterable[_T] | Iterable[tuple[_T, int]]`, + # the tuples would be added as keys, breaking type safety) + @overload # type: ignore[override] + def update(self, m: Mapping[_T, int], /, **kwargs: int) -> None: ... + @overload + def update(self, iterable: Iterable[_T], /, **kwargs: int) -> None: ... + @overload + def update(self, iterable: None = None, /, **kwargs: int) -> None: ... + def __missing__(self, key: _T) -> int: ... + def __delitem__(self, elem: object) -> None: ... + if sys.version_info >= (3, 10): + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + + def __add__(self, other: Counter[_S]) -> Counter[_T | _S]: ... + def __sub__(self, other: Counter[_T]) -> Counter[_T]: ... + def __and__(self, other: Counter[_T]) -> Counter[_T]: ... + def __or__(self, other: Counter[_S]) -> Counter[_T | _S]: ... # type: ignore[override] + def __pos__(self) -> Counter[_T]: ... + def __neg__(self) -> Counter[_T]: ... + # several type: ignores because __iadd__ is supposedly incompatible with __add__, etc. + def __iadd__(self, other: SupportsItems[_T, int]) -> Self: ... # type: ignore[misc] + def __isub__(self, other: SupportsItems[_T, int]) -> Self: ... + def __iand__(self, other: SupportsItems[_T, int]) -> Self: ... + def __ior__(self, other: SupportsItems[_T, int]) -> Self: ... # type: ignore[override,misc] + if sys.version_info >= (3, 10): + def total(self) -> int: ... + def __le__(self, other: Counter[Any]) -> bool: ... + def __lt__(self, other: Counter[Any]) -> bool: ... + def __ge__(self, other: Counter[Any]) -> bool: ... + def __gt__(self, other: Counter[Any]) -> bool: ... + +# The pure-Python implementations of the "views" classes +# These are exposed at runtime in `collections/__init__.py` +class _OrderedDictKeysView(KeysView[_KT_co]): + def __reversed__(self) -> Iterator[_KT_co]: ... + +class _OrderedDictItemsView(ItemsView[_KT_co, _VT_co]): + def __reversed__(self) -> Iterator[tuple[_KT_co, _VT_co]]: ... + +class _OrderedDictValuesView(ValuesView[_VT_co]): + def __reversed__(self) -> Iterator[_VT_co]: ... + +# The C implementations of the "views" classes +# (At runtime, these are called `odict_keys`, `odict_items` and `odict_values`, +# but they are not exposed anywhere) +# pyright doesn't have a specific error code for subclassing error! +@final +class _odict_keys(dict_keys[_KT_co, _VT_co]): # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] + def __reversed__(self) -> Iterator[_KT_co]: ... + +@final +class _odict_items(dict_items[_KT_co, _VT_co]): # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] + def __reversed__(self) -> Iterator[tuple[_KT_co, _VT_co]]: ... + +@final +class _odict_values(dict_values[_KT_co, _VT_co]): # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] + def __reversed__(self) -> Iterator[_VT_co]: ... + +class OrderedDict(dict[_KT, _VT]): + def popitem(self, last: bool = True) -> tuple[_KT, _VT]: ... + def move_to_end(self, key: _KT, last: bool = True) -> None: ... + def copy(self) -> Self: ... + def __reversed__(self) -> Iterator[_KT]: ... + def keys(self) -> _odict_keys[_KT, _VT]: ... + def items(self) -> _odict_items[_KT, _VT]: ... + def values(self) -> _odict_values[_KT, _VT]: ... + # The signature of OrderedDict.fromkeys should be kept in line with `dict.fromkeys`, modulo positional-only differences. + # Like dict.fromkeys, its true signature is not expressible in the current type system. + # See #3800 & https://github.com/python/typing/issues/548#issuecomment-683336963. + @classmethod + @overload + def fromkeys( + cls, iterable: Iterable[_T], value: None = None + ) -> OrderedDict[_T, Any | None]: ... + @classmethod + @overload + def fromkeys(cls, iterable: Iterable[_T], value: _S) -> OrderedDict[_T, _S]: ... + # Keep OrderedDict.setdefault in line with MutableMapping.setdefault, modulo positional-only differences. + @overload + def setdefault( + self: OrderedDict[_KT, _T | None], key: _KT, default: None = None + ) -> _T | None: ... + @overload + def setdefault(self, key: _KT, default: _VT) -> _VT: ... + # Same as dict.pop, but accepts keyword arguments + @overload + def pop(self, key: _KT) -> _VT: ... + @overload + def pop(self, key: _KT, default: _VT) -> _VT: ... + @overload + def pop(self, key: _KT, default: _T) -> _VT | _T: ... + def __eq__(self, value: object, /) -> bool: ... + if sys.version_info >= (3, 9): + @overload + def __or__(self, value: dict[_KT, _VT], /) -> Self: ... + @overload + def __or__(self, value: dict[_T1, _T2], /) -> OrderedDict[_KT | _T1, _VT | _T2]: ... + @overload + def __ror__(self, value: dict[_KT, _VT], /) -> Self: ... + @overload + def __ror__(self, value: dict[_T1, _T2], /) -> OrderedDict[_KT | _T1, _VT | _T2]: ... # type: ignore[misc] + +class defaultdict(dict[_KT, _VT]): + default_factory: Callable[[], _VT] | None + @overload + def __init__(self) -> None: ... + @overload + def __init__( + self: defaultdict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + **kwargs: _VT, + ) -> None: ... # pyright: ignore[reportInvalidTypeVarUse] #11780 + @overload + def __init__(self, default_factory: Callable[[], _VT] | None, /) -> None: ... + @overload + def __init__( + self: defaultdict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + default_factory: Callable[[], _VT] | None, + /, + **kwargs: _VT, + ) -> None: ... + @overload + def __init__( + self, default_factory: Callable[[], _VT] | None, map: SupportsKeysAndGetItem[_KT, _VT], / + ) -> None: ... + @overload + def __init__( + self: defaultdict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + default_factory: Callable[[], _VT] | None, + map: SupportsKeysAndGetItem[str, _VT], + /, + **kwargs: _VT, + ) -> None: ... + @overload + def __init__( + self, default_factory: Callable[[], _VT] | None, iterable: Iterable[tuple[_KT, _VT]], / + ) -> None: ... + @overload + def __init__( + self: defaultdict[str, _VT], # pyright: ignore[reportInvalidTypeVarUse] #11780 + default_factory: Callable[[], _VT] | None, + iterable: Iterable[tuple[str, _VT]], + /, + **kwargs: _VT, + ) -> None: ... + def __missing__(self, key: _KT, /) -> _VT: ... + def __copy__(self) -> Self: ... + def copy(self) -> Self: ... + if sys.version_info >= (3, 9): + @overload + def __or__(self, value: dict[_KT, _VT], /) -> Self: ... + @overload + def __or__(self, value: dict[_T1, _T2], /) -> defaultdict[_KT | _T1, _VT | _T2]: ... + @overload + def __ror__(self, value: dict[_KT, _VT], /) -> Self: ... + @overload + def __ror__(self, value: dict[_T1, _T2], /) -> defaultdict[_KT | _T1, _VT | _T2]: ... # type: ignore[misc] + +class ChainMap(MutableMapping[_KT, _VT]): + maps: list[MutableMapping[_KT, _VT]] + def __init__(self, *maps: MutableMapping[_KT, _VT]) -> None: ... + def new_child(self, m: MutableMapping[_KT, _VT] | None = None) -> Self: ... + @property + def parents(self) -> Self: ... + def __setitem__(self, key: _KT, value: _VT) -> None: ... + def __delitem__(self, key: _KT) -> None: ... + def __getitem__(self, key: _KT) -> _VT: ... + def __iter__(self) -> Iterator[_KT]: ... + def __len__(self) -> int: ... + def __contains__(self, key: object) -> bool: ... + @overload + def get(self, key: _KT, default: None = None) -> _VT | None: ... + @overload + def get(self, key: _KT, default: _T) -> _VT | _T: ... + def __missing__(self, key: _KT) -> _VT: ... # undocumented + def __bool__(self) -> bool: ... + # Keep ChainMap.setdefault in line with MutableMapping.setdefault, modulo positional-only differences. + @overload + def setdefault( + self: ChainMap[_KT, _T | None], key: _KT, default: None = None + ) -> _T | None: ... + @overload + def setdefault(self, key: _KT, default: _VT) -> _VT: ... + @overload + def pop(self, key: _KT) -> _VT: ... + @overload + def pop(self, key: _KT, default: _VT) -> _VT: ... + @overload + def pop(self, key: _KT, default: _T) -> _VT | _T: ... + def copy(self) -> Self: ... + __copy__ = copy + # All arguments to `fromkeys` are passed to `dict.fromkeys` at runtime, + # so the signature should be kept in line with `dict.fromkeys`. + @classmethod + @overload + def fromkeys(cls, iterable: Iterable[_T]) -> ChainMap[_T, Any | None]: ... + @classmethod + @overload + # Special-case None: the user probably wants to add non-None values later. + def fromkeys(cls, iterable: Iterable[_T], value: None, /) -> ChainMap[_T, Any | None]: ... + @classmethod + @overload + def fromkeys(cls, iterable: Iterable[_T], value: _S, /) -> ChainMap[_T, _S]: ... + if sys.version_info >= (3, 9): + @overload + def __or__(self, other: Mapping[_KT, _VT]) -> Self: ... + @overload + def __or__(self, other: Mapping[_T1, _T2]) -> ChainMap[_KT | _T1, _VT | _T2]: ... + @overload + def __ror__(self, other: Mapping[_KT, _VT]) -> Self: ... + @overload + def __ror__(self, other: Mapping[_T1, _T2]) -> ChainMap[_KT | _T1, _VT | _T2]: ... + # ChainMap.__ior__ should be kept roughly in line with MutableMapping.update() + @overload # type: ignore[misc] + def __ior__(self, other: SupportsKeysAndGetItem[_KT, _VT]) -> Self: ... + @overload + def __ior__(self, other: Iterable[tuple[_KT, _VT]]) -> Self: ... diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/collections/abc.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/collections/abc.pyi new file mode 100644 index 0000000..1ed47cc --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/collections/abc.pyi @@ -0,0 +1,3 @@ +from _collections_abc import * + +# from _collections_abc import __all__ as __all__ diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/io_modes.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/io_modes.pyi new file mode 100644 index 0000000..cdc46c6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/io_modes.pyi @@ -0,0 +1,87 @@ +""" +Type aliases for the Micropython specific modes used in the `open` function. + +References: + - https://docs.micropython.org/en/latest/library/io.html#conceptual-hierarchy + - https://docs.python.org/3/library/io.html +""" + +# MIT License +# Howard C Lovatt, 2020 onwards. +# Jos Verlinde, 2025 onwards. + +from typing import Literal + +from typing_extensions import TypeAlias + +_OpenTextModeUpdating: TypeAlias = Literal[ + "r+", + "+r", + "rt+", + "r+t", + "+rt", + "tr+", + "t+r", + "+tr", + "w+", + "+w", + "wt+", + "w+t", + "+wt", + "tw+", + "t+w", + "+tw", + "a+", + "+a", + "at+", + "a+t", + "+at", + "ta+", + "t+a", + "+ta", + "x+", + "+x", + "xt+", + "x+t", + "+xt", + "tx+", + "t+x", + "+tx", +] +_OpenTextModeWriting: TypeAlias = Literal["w", "wt", "tw", "a", "at", "ta", "x", "xt", "tx"] +_OpenTextModeReading: TypeAlias = Literal[ + "r", "rt", "tr", "U", "rU", "Ur", "rtU", "rUt", "Urt", "trU", "tUr", "Utr" +] +_OpenTextMode: TypeAlias = _OpenTextModeUpdating | _OpenTextModeWriting | _OpenTextModeReading + +_OpenBinaryModeUpdating: TypeAlias = Literal[ + "rb+", + "r+b", + "+rb", + "br+", + "b+r", + "+br", + "wb+", + "w+b", + "+wb", + "bw+", + "b+w", + "+bw", + "ab+", + "a+b", + "+ab", + "ba+", + "b+a", + "+ba", + "xb+", + "x+b", + "+xb", + "bx+", + "b+x", + "+bx", +] +_OpenBinaryModeWriting: TypeAlias = Literal["wb", "bw", "ab", "ba", "xb", "bx"] +_OpenBinaryModeReading: TypeAlias = Literal["rb", "br", "rbU", "rUb", "Urb", "brU", "bUr", "Ubr"] +_OpenBinaryMode: TypeAlias = ( + _OpenBinaryModeUpdating | _OpenBinaryModeReading | _OpenBinaryModeWriting +) diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/io_mp.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/io_mp.pyi new file mode 100644 index 0000000..93d7167 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/io_mp.pyi @@ -0,0 +1,52 @@ +# ------------------ +# from typeshed/stdlib/io.pyi + +import abc +from types import TracebackType +from typing import TypeVar + +from _io import BytesIO as BytesIO +from _io import FileIO as FileIO +from _io import IncrementalNewlineDecoder as IncrementalNewlineDecoder +from _io import StringIO as StringIO +from _io import TextIOWrapper as TextIOWrapper +from _io import _BufferedIOBase, _IOBase, _RawIOBase, _TextIOBase +from _io import open as open +from typing_extensions import Self + +from .buffer_mp import AnyReadableBuf, AnyWritableBuf +from .pathlike import PathLike + +class IOBase_mp(_IOBase, metaclass=abc.ABCMeta): ... +# class IOBase_mp(Stream, metaclass=abc.ABCMeta): ... + +# Andy +# +# class Stream(metaclass=abc.ABCMeta): +# """ +# MicroPython stream "base class". Due to implementation mechanism +# not all methods are guaranteed to be available on all classes +# based on the stream type / protocol. +# """ +# def __init__(self, *argv, **kwargs) -> None: ... +# def __enter__(self: Self) -> Self: ... +# def __exit__( +# self, +# exc_type: type[BaseException] | None, +# exc_val: BaseException | None, +# exc_tb: TracebackType | None, +# ) -> None: ... +# def close(self) -> None: ... +# def flush(self) -> None: ... +# def read(self, __size: int | None = ...) -> bytes: ... +# def read1(self, __size: int = ...) -> bytes: ... +# def readinto(self, __buffer: AnyWritableBuf) -> int: ... +# def readline(self, __size: int | None = ...) -> bytes: ... +# def readlines(self, __hint: int = ...) -> list[bytes]: ... +# def seek(self, __offset: int, __whence: int = ...) -> int: ... +# def tell(self) -> int: ... +# def write(self, __buffer: AnyReadableBuf) -> int: ... +# def write1(self, __buffer: AnyReadableBuf) -> int: ... + +# Howard +_OpenFile = TypeVar("_OpenFile", str, bytes, PathLike[str], PathLike[bytes], int) diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/mp_available.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/mp_available.pyi new file mode 100644 index 0000000..1f1ef95 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/mp_available.pyi @@ -0,0 +1,32 @@ +from typing import Callable, Iterable, Tuple, TypeVar, Union + +""" +Decorator to annotate objects with the MicroPython ports they are available on. + +Usage: + @mp_available(port="esp32") + def foo(): ... + + @mp_available(port=["esp32", "rp2"]) + class Bar: ... +""" + + +__all__ = ["mp_available"] + +T = TypeVar("T") # Works for functions, classes, and other callables + +def mp_available( + *, + port: Union[str, Iterable[str]] =["*"], + version: Union[str, Iterable[str]] =["*"], + macro: Union[str, Iterable[str]] =["*"], + ) -> Callable[[T], T]: + """ + Decorator factory that marks an object as available on the given MicroPython ports. + The ports list is stored on the decorated object as __mp_available_ports__. + """ + def decorator(obj: T) -> T: + return obj + return decorator + diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/mp_implementation.py b/.venv/lib/python3.12/site-packages/_mpy_shed/mp_implementation.py new file mode 100644 index 0000000..8f8bf36 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/mp_implementation.py @@ -0,0 +1,24 @@ +""" +MicroPython version of the sys.implementation object +""" + +from typing import Any, Tuple + + +class _mp_implementation(): + """ + This object is the recommended way to distinguish MicroPython from other Python implementations (note that it still may not exist in the very minimal ports). + Starting with version 1.22.0-preview, the fourth node releaselevel in implementation.version is either an empty string or "preview". + """ + name: str + version: Tuple[int,int,int, str] + _machine: str + "string describing the underlying machine" + _mpy: int + "supported mpy file-format version (optional attribute)" + _build: str + "string that can help identify the configuration that MicroPython was built with" + # Define __getattr__, as the documentation states: + # > sys.implementation may contain additional attributes specific to the Python implementation. + # > These non-standard attributes must start with an underscore, and are not described here. + def __getattr__(self, name: str) -> Any: ... \ No newline at end of file diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/neopixelbase.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/neopixelbase.pyi new file mode 100644 index 0000000..089a124 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/neopixelbase.pyi @@ -0,0 +1,26 @@ +########################### +# neopixel +from typing import Tuple + +class _NeoPixelBase: + """ + a class to add a few missing methods to the NeoPixel class + """ + + def __len__(self) -> int: + """ + Returns the number of LEDs in the strip. + """ + ... + + def __setitem__(self, index: int, val, /) -> None: + """ + Set the pixel at *index* to the value, which is an RGB/RGBW tuple. + """ + ... + + def __getitem__(self, index: int, /) -> Tuple: + """ + Returns the pixel at *index* as an RGB/RGBW tuple. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/pathlike.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/pathlike.pyi new file mode 100644 index 0000000..c601cd6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/pathlike.pyi @@ -0,0 +1,17 @@ +""" +pathlike is used in multiple stdlib stubs - but does not exists in MicroPython +copied from typeshed/stdlib/os.pyi as os.pyi cannot import from a module with the same name +""" + +import abc +from typing import Protocol, Tuple, runtime_checkable + +from _typeshed import AnyStr_co + +# mypy and pyright object to this being both ABC and Protocol. +# At runtime it inherits from ABC and is not a Protocol, but it will be +# on the allowlist for use as a Protocol starting in 3.14. +@runtime_checkable +class PathLike(ABC, Protocol[AnyStr_co]): # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] + @abc.abstractmethod + def __fspath__(self) -> AnyStr_co: ... diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/subscriptable.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/subscriptable.pyi new file mode 100644 index 0000000..0794446 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/subscriptable.pyi @@ -0,0 +1,17 @@ +from typing import Protocol, TypeVar, runtime_checkable + +_T_Co = TypeVar("_T_Co", covariant=True) + +@runtime_checkable +class Subscriptable(Protocol[_T_Co]): + """A `Protocol` (structurally typed) for an object that is subscriptable and of finite length.""" + + __slots__ = () + def __len__(self) -> int: + """Number of elements, normally called via `len(x)` where `x` is an object that implements this protocol.""" + + def __getitem__(self, index: int) -> _T_Co: + """ + Element at the given index, + normally called via `x[index]` where `x` is an object that implements this protocol. + """ diff --git a/.venv/lib/python3.12/site-packages/_mpy_shed/time_mp.pyi b/.venv/lib/python3.12/site-packages/_mpy_shed/time_mp.pyi new file mode 100644 index 0000000..32caf34 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_mpy_shed/time_mp.pyi @@ -0,0 +1,15 @@ +""" +The tuple to pass or receive from the time methods is unfortunately +defined differently on different ports, boards and versions of MicroPython. + +The _Time8Tuple and _Time9Tuple are the most common ones, and are unified in the _TimeTuple. + +As this still does not cover all cases, the _TimeTuple is a union of the two common cases and the generic Tuple. +""" + +from typing import Tuple +from typing_extensions import TypeAlias + +_Time8Tuple: TypeAlias = Tuple[int, int, int, int, int, int, int, int] +_Time9Tuple: TypeAlias = Tuple[int, int, int, int, int, int, int, int, int] +_TimeTuple: TypeAlias = _Time8Tuple | _Time9Tuple | Tuple[int, ...] diff --git a/.venv/lib/python3.12/site-packages/_onewire.pyi b/.venv/lib/python3.12/site-packages/_onewire.pyi new file mode 100644 index 0000000..52e94e7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_onewire.pyi @@ -0,0 +1,15 @@ +""" +Module: '_onewire' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete + +def reset(*args, **kwargs) -> Incomplete: ... +def writebyte(*args, **kwargs) -> Incomplete: ... +def writebit(*args, **kwargs) -> Incomplete: ... +def crc8(*args, **kwargs) -> Incomplete: ... +def readbyte(*args, **kwargs) -> Incomplete: ... +def readbit(*args, **kwargs) -> Incomplete: ... diff --git a/.venv/lib/python3.12/site-packages/_thread.pyi b/.venv/lib/python3.12/site-packages/_thread.pyi new file mode 100644 index 0000000..2048aea --- /dev/null +++ b/.venv/lib/python3.12/site-packages/_thread.pyi @@ -0,0 +1,33 @@ +""" +Multithreading support. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/_thread.html + +CPython module: :mod:`python:_thread` https://docs.python.org/3/library/_thread.html . + +This module implements multithreading support. + +This module is highly experimental and its API is not yet fully settled +and not yet described in this documentation. + +--- +Module: '_thread' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing_extensions import Awaitable, TypeAlias, TypeVar + +def get_ident(*args, **kwargs) -> Incomplete: ... +def start_new_thread(*args, **kwargs) -> Incomplete: ... +def stack_size(*args, **kwargs) -> Incomplete: ... +def exit(*args, **kwargs) -> Incomplete: ... +def allocate_lock(*args, **kwargs) -> Incomplete: ... + +class LockType: + def locked(self, *args, **kwargs) -> Incomplete: ... + def release(self, *args, **kwargs) -> Incomplete: ... + def acquire(self, *args, **kwargs) -> Incomplete: ... + def __init__(self, *argv, **kwargs) -> None: ... diff --git a/.venv/lib/python3.12/site-packages/binascii.pyi b/.venv/lib/python3.12/site-packages/binascii.pyi new file mode 100644 index 0000000..4fad282 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/binascii.pyi @@ -0,0 +1,61 @@ +""" +Binary/ASCII conversions. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/binascii.html + +CPython module: :mod:`python:binascii` https://docs.python.org/3/library/binascii.html . + +This module implements conversions between binary data and various +encodings of it in ASCII form (in both directions). + +--- +Module: 'binascii' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing import Any, Optional +from typing_extensions import Awaitable, TypeAlias, TypeVar + +def crc32(data, value: Optional[Any] = None) -> Incomplete: + """ + Compute CRC-32, the 32-bit checksum of *data*, starting with an initial CRC + of *value*. The default initial CRC is zero. The algorithm is consistent + with the ZIP file checksum. + """ + ... + +def hexlify(data: bytes, sep: str | bytes = ..., /) -> bytes: + """ + Convert the bytes in the *data* object to a hexadecimal representation. + Returns a bytes object. + + If the additional argument *sep* is supplied it is used as a separator + between hexadecimal values. + """ + ... + +def unhexlify(data: str | bytes, /) -> bytes: + """ + Convert hexadecimal data to binary representation. Returns bytes string. + (i.e. inverse of hexlify) + """ + ... + +def b2a_base64(data: bytes, /) -> bytes: + """ + Encode binary data in base64 format, as in `RFC 3548 + `_. Returns the encoded data + followed by a newline character if newline is true, as a bytes object. + """ + ... + +def a2b_base64(data: str | bytes, /) -> bytes: + """ + Decode base64-encoded data, ignoring invalid characters in the input. + Conforms to `RFC 2045 s.6.8 `_. + Returns a bytes object. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/cmath.pyi b/.venv/lib/python3.12/site-packages/cmath.pyi new file mode 100644 index 0000000..b362a72 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmath.pyi @@ -0,0 +1,82 @@ +""" +Mathematical functions for complex numbers. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/cmath.html + +CPython module: :mod:`python:cmath` https://docs.python.org/3/library/cmath.html . + +The ``cmath`` module provides some basic mathematical functions for +working with complex numbers. + +Availability: not available on WiPy and ESP8266. Floating point support +required for this module. + +--- +Module: 'cmath' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing import SupportsComplex, SupportsFloat, SupportsIndex, Tuple +from typing_extensions import Awaitable, TypeAlias, TypeVar + +_C: TypeAlias = SupportsFloat | SupportsComplex | SupportsIndex | complex + +e: float = 2.7182818 +pi: float = 3.1415928 + +def polar(z: _C, /) -> Tuple: + """ + Returns, as a tuple, the polar form of ``z``. + """ + ... + +def sqrt(z: _C, /) -> complex: + """ + Return the square-root of ``z``. + """ + ... + +def rect(r: float, phi: float, /) -> float: + """ + Returns the complex number with modulus ``r`` and phase ``phi``. + """ + ... + +def sin(z: _C, /) -> float: + """ + Return the sine of ``z``. + """ + ... + +def exp(z: _C, /) -> float: + """ + Return the exponential of ``z``. + """ + ... + +def cos(z: _C, /) -> float: + """ + Return the cosine of ``z``. + """ + ... + +def phase(z: _C, /) -> float: + """ + Returns the phase of the number ``z``, in the range (-pi, +pi]. + """ + ... + +def log(z: _C, /) -> float: + """ + Return the natural logarithm of ``z``. The branch cut is along the negative real axis. + """ + ... + +def log10(z: _C, /) -> float: + """ + Return the base-10 logarithm of ``z``. The branch cut is along the negative real axis. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/cryptolib.pyi b/.venv/lib/python3.12/site-packages/cryptolib.pyi new file mode 100644 index 0000000..358a054 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cryptolib.pyi @@ -0,0 +1,165 @@ +""" +Cryptographic ciphers. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/cryptolib.html + +--- +Module: 'cryptolib' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from _mpy_shed import AnyReadableBuf, AnyWritableBuf +from typing import overload +from typing_extensions import Awaitable, TypeAlias, TypeVar + +class aes: + """ + .. class:: aes + """ + + @overload + def encrypt(self, in_buf: AnyReadableBuf, /) -> bytes: + """ + Encrypt *in_buf*. If no *out_buf* is given result is returned as a + newly allocated `bytes` object. Otherwise, result is written into + mutable buffer *out_buf*. *in_buf* and *out_buf* can also refer + to the same mutable buffer, in which case data is encrypted in-place. + """ + + @overload + def encrypt(self, in_buf: AnyReadableBuf, out_buf: AnyWritableBuf, /) -> None: + """ + Encrypt *in_buf*. If no *out_buf* is given result is returned as a + newly allocated `bytes` object. Otherwise, result is written into + mutable buffer *out_buf*. *in_buf* and *out_buf* can also refer + to the same mutable buffer, in which case data is encrypted in-place. + """ + + @overload + def encrypt(self, in_buf: AnyReadableBuf, /) -> bytes: + """ + Encrypt *in_buf*. If no *out_buf* is given result is returned as a + newly allocated `bytes` object. Otherwise, result is written into + mutable buffer *out_buf*. *in_buf* and *out_buf* can also refer + to the same mutable buffer, in which case data is encrypted in-place. + """ + + @overload + def encrypt(self, in_buf: AnyReadableBuf, out_buf: AnyWritableBuf, /) -> None: + """ + Encrypt *in_buf*. If no *out_buf* is given result is returned as a + newly allocated `bytes` object. Otherwise, result is written into + mutable buffer *out_buf*. *in_buf* and *out_buf* can also refer + to the same mutable buffer, in which case data is encrypted in-place. + """ + + @overload + def decrypt(self, in_buf: AnyReadableBuf, /) -> bytes: + """ + Like `encrypt()`, but for decryption. + """ + + @overload + def decrypt(self, in_buf: AnyReadableBuf, out_buf: AnyWritableBuf, /) -> None: + """ + Like `encrypt()`, but for decryption. + """ + + @overload + def decrypt(self, in_buf: AnyReadableBuf, /) -> bytes: + """ + Like `encrypt()`, but for decryption. + """ + + @overload + def decrypt(self, in_buf: AnyReadableBuf, out_buf: AnyWritableBuf, /) -> None: + """ + Like `encrypt()`, but for decryption. + """ + + @overload + def __init__(self, key: AnyReadableBuf, mode: int, /): + """ + Initialize cipher object, suitable for encryption/decryption. Note: + after initialization, cipher object can be use only either for + encryption or decryption. Running decrypt() operation after encrypt() + or vice versa is not supported. + + Parameters are: + + * *key* is an encryption/decryption key (bytes-like). + * *mode* is: + + * ``1`` (or ``cryptolib.MODE_ECB`` if it exists) for Electronic Code Book (ECB). + * ``2`` (or ``cryptolib.MODE_CBC`` if it exists) for Cipher Block Chaining (CBC). + * ``6`` (or ``cryptolib.MODE_CTR`` if it exists) for Counter mode (CTR). + + * *IV* is an initialization vector for CBC mode. + * For Counter mode, *IV* is the initial value for the counter. + """ + + @overload + def __init__(self, key: AnyReadableBuf, mode: int, IV: AnyReadableBuf, /): + """ + Initialize cipher object, suitable for encryption/decryption. Note: + after initialization, cipher object can be use only either for + encryption or decryption. Running decrypt() operation after encrypt() + or vice versa is not supported. + + Parameters are: + + * *key* is an encryption/decryption key (bytes-like). + * *mode* is: + + * ``1`` (or ``cryptolib.MODE_ECB`` if it exists) for Electronic Code Book (ECB). + * ``2`` (or ``cryptolib.MODE_CBC`` if it exists) for Cipher Block Chaining (CBC). + * ``6`` (or ``cryptolib.MODE_CTR`` if it exists) for Counter mode (CTR). + + * *IV* is an initialization vector for CBC mode. + * For Counter mode, *IV* is the initial value for the counter. + """ + + @overload + def __init__(self, key: AnyReadableBuf, mode: int, /): + """ + Initialize cipher object, suitable for encryption/decryption. Note: + after initialization, cipher object can be use only either for + encryption or decryption. Running decrypt() operation after encrypt() + or vice versa is not supported. + + Parameters are: + + * *key* is an encryption/decryption key (bytes-like). + * *mode* is: + + * ``1`` (or ``cryptolib.MODE_ECB`` if it exists) for Electronic Code Book (ECB). + * ``2`` (or ``cryptolib.MODE_CBC`` if it exists) for Cipher Block Chaining (CBC). + * ``6`` (or ``cryptolib.MODE_CTR`` if it exists) for Counter mode (CTR). + + * *IV* is an initialization vector for CBC mode. + * For Counter mode, *IV* is the initial value for the counter. + """ + + @overload + def __init__(self, key: AnyReadableBuf, mode: int, IV: AnyReadableBuf, /): + """ + Initialize cipher object, suitable for encryption/decryption. Note: + after initialization, cipher object can be use only either for + encryption or decryption. Running decrypt() operation after encrypt() + or vice versa is not supported. + + Parameters are: + + * *key* is an encryption/decryption key (bytes-like). + * *mode* is: + + * ``1`` (or ``cryptolib.MODE_ECB`` if it exists) for Electronic Code Book (ECB). + * ``2`` (or ``cryptolib.MODE_CBC`` if it exists) for Cipher Block Chaining (CBC). + * ``6`` (or ``cryptolib.MODE_CTR`` if it exists) for Counter mode (CTR). + + * *IV* is an initialization vector for CBC mode. + * For Counter mode, *IV* is the initial value for the counter. + """ diff --git a/.venv/lib/python3.12/site-packages/deflate.pyi b/.venv/lib/python3.12/site-packages/deflate.pyi new file mode 100644 index 0000000..77b9b36 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/deflate.pyi @@ -0,0 +1,85 @@ +""" +Deflate compression & decompression. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/deflate.html + +This module allows compression and decompression of binary data with the +`DEFLATE algorithm `_ +(commonly used in the zlib library and gzip archiver). + +**Availability:** + +* Added in MicroPython v1.21. + +* Decompression: Enabled via the ``MICROPY_PY_DEFLATE`` build option, on by default + on ports with the "extra features" level or higher (which is most boards). + +* Compression: Enabled via the ``MICROPY_PY_DEFLATE_COMPRESS`` build option, on + by default on ports with the "full features" level or higher (generally this means + you need to build your own firmware to enable this). + +--- +Module: 'deflate' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from typing import Final +from _typeshed import Incomplete +from typing_extensions import Awaitable, TypeAlias, TypeVar + +GZIP: Final[int] = 3 +RAW: Final[int] = 1 +ZLIB: Final[int] = 2 +AUTO: Final[int] = 0 + +class DeflateIO: + """ + This class can be used to wrap a *stream* which is any + :term:`stream-like ` object such as a file, socket, or stream + (including :class:`io.BytesIO`). It is itself a stream and implements the + standard read/readinto/write/close methods. + + The *stream* must be a blocking stream. Non-blocking streams are currently + not supported. + + The *format* can be set to any of the constants defined below, and defaults + to ``AUTO`` which for decompressing will auto-detect gzip or zlib streams, + and for compressing it will generate a raw stream. + + The *wbits* parameter sets the base-2 logarithm of the DEFLATE dictionary + window size. So for example, setting *wbits* to ``10`` sets the window size + to 1024 bytes. Valid values are ``5`` to ``15`` inclusive (corresponding to + window sizes of 32 to 32k bytes). + + If *wbits* is set to ``0`` (the default), then for compression a window size + of 256 bytes will be used (as if *wbits* was set to 8). For decompression, it + depends on the format: + + * ``RAW`` will use 256 bytes (corresponding to *wbits* set to 8). + * ``ZLIB`` (or ``AUTO`` with zlib detected) will use the value from the zlib + header. + * ``GZIP`` (or ``AUTO`` with gzip detected) will use 32 kilobytes + (corresponding to *wbits* set to 15). + + See the :ref:`window size ` notes below for more information + about the window size, zlib, and gzip streams. + + If *close* is set to ``True`` then the underlying stream will be closed + automatically when the :class:`deflate.DeflateIO` stream is closed. This is + useful if you want to return a :class:`deflate.DeflateIO` stream that wraps + another stream and not have the caller need to know about managing the + underlying stream. + + If compression is enabled, a given :class:`deflate.DeflateIO` instance + supports both reading and writing. For example, a bidirectional stream like + a socket can be wrapped, which allows for compression/decompression in both + directions. + """ + + def readline(self, *args, **kwargs) -> Incomplete: ... + def readinto(self, *args, **kwargs) -> Incomplete: ... + def read(self, *args, **kwargs) -> Incomplete: ... + def close(self, *args, **kwargs) -> Incomplete: ... + def __init__(self, stream, format=AUTO, wbits=0, close=False, /) -> None: ... diff --git a/.venv/lib/python3.12/site-packages/dht.pyi b/.venv/lib/python3.12/site-packages/dht.pyi new file mode 100644 index 0000000..f374267 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/dht.pyi @@ -0,0 +1,15 @@ +from _typeshed import Incomplete + +class DHTBase: + pin: Incomplete + buf: Incomplete + def __init__(self, pin) -> None: ... + def measure(self) -> None: ... + +class DHT11(DHTBase): + def humidity(self): ... + def temperature(self): ... + +class DHT22(DHTBase): + def humidity(self): ... + def temperature(self): ... diff --git a/.venv/lib/python3.12/site-packages/ds18x20.pyi b/.venv/lib/python3.12/site-packages/ds18x20.pyi new file mode 100644 index 0000000..a1f9a03 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/ds18x20.pyi @@ -0,0 +1,16 @@ +from _typeshed import Incomplete +from micropython import const as const + +_CONVERT: int +_RD_SCRATCH: int +_WR_SCRATCH: int + +class DS18X20: + ow: Incomplete + buf: Incomplete + def __init__(self, onewire) -> None: ... + def scan(self): ... + def convert_temp(self) -> None: ... + def read_scratch(self, rom): ... + def write_scratch(self, rom, buf) -> None: ... + def read_temp(self, rom): ... diff --git a/.venv/lib/python3.12/site-packages/errno.pyi b/.venv/lib/python3.12/site-packages/errno.pyi new file mode 100644 index 0000000..3c6fbc6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/errno.pyi @@ -0,0 +1,45 @@ +""" +System error codes. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/errno.html + +CPython module: :mod:`python:errno` https://docs.python.org/3/library/errno.html . + +This module provides access to symbolic error codes for `OSError` exception. +A particular inventory of codes depends on :term:`MicroPython port`. + +--- +Module: 'errno' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from typing import Dict, Final +from _typeshed import Incomplete +from typing_extensions import Awaitable, TypeAlias, TypeVar + +ENOBUFS: Final[int] = 105 +ENODEV: Final[int] = 19 +ENOENT: Final[int] = 2 +EISDIR: Final[int] = 21 +EIO: Final[int] = 5 +EINVAL: Final[int] = 22 +EPERM: Final[int] = 1 +ETIMEDOUT: Final[int] = 110 +ENOMEM: Final[int] = 12 +EOPNOTSUPP: Final[int] = 95 +ENOTCONN: Final[int] = 107 +errorcode: dict = {} +EAGAIN: Final[int] = 11 +EALREADY: Final[int] = 114 +EBADF: Final[int] = 9 +EADDRINUSE: Final[int] = 98 +EACCES: Final[int] = 13 +EINPROGRESS: Final[int] = 115 +EEXIST: Final[int] = 17 +EHOSTUNREACH: Final[int] = 113 +ECONNABORTED: Final[int] = 103 +ECONNRESET: Final[int] = 104 +ECONNREFUSED: Final[int] = 111 +ENOTSUP: Final[int] = ... diff --git a/.venv/lib/python3.12/site-packages/framebuf.pyi b/.venv/lib/python3.12/site-packages/framebuf.pyi new file mode 100644 index 0000000..7b502b5 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/framebuf.pyi @@ -0,0 +1,227 @@ +""" +Frame buffer manipulation. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/framebuf.html + +This module provides a general frame buffer which can be used to create +bitmap images, which can then be sent to a display. + +--- +Module: 'framebuf' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from typing import Any, Optional, overload, Final +from _typeshed import Incomplete +from _mpy_shed import AnyReadableBuf, AnyWritableBuf +from typing_extensions import Awaitable, TypeAlias, TypeVar + +MONO_HMSB: Final[int] = 4 +MONO_HLSB: Final[int] = 3 +RGB565: Final[int] = 1 +MONO_VLSB: Final[int] = 0 +MVLSB: Final[int] = 0 +GS2_HMSB: Final[int] = 5 +GS8: Final[int] = 6 +GS4_HMSB: Final[int] = 2 + +def FrameBuffer1(*args, **kwargs) -> Incomplete: ... + +class FrameBuffer: + """ + The FrameBuffer class provides a pixel buffer which can be drawn upon with + pixels, lines, rectangles, text and even other FrameBuffer's. It is useful + when generating output for displays. + + For example:: + + import framebuf + + # FrameBuffer needs 2 bytes for every RGB565 pixel + fbuf = framebuf.FrameBuffer(bytearray(100 * 10 * 2), 100, 10, framebuf.RGB565) + + fbuf.fill(0) + fbuf.text('MicroPython!', 0, 0, 0xffff) + fbuf.hline(0, 9, 96, 0xffff) + """ + + def poly(self, x, y, coords, c, f: Optional[Any] = None) -> Incomplete: + """ + Given a list of coordinates, draw an arbitrary (convex or concave) closed + polygon at the given x, y location using the given color. + + The *coords* must be specified as a :mod:`array` of integers, e.g. + ``array('h', [x0, y0, x1, y1, ... xn, yn])``. + + The optional *f* parameter can be set to ``True`` to fill the polygon. + Otherwise just a one pixel outline is drawn. + """ + ... + + def vline(self, x: int, y: int, h: int, c: int, /) -> None: + """ + Draw a line from a set of coordinates using the given color and + a thickness of 1 pixel. The `line` method draws the line up to + a second set of coordinates whereas the `hline` and `vline` + methods draw horizontal and vertical lines respectively up to + a given length. + """ + + @overload + def pixel(self, x: int, y: int, /) -> int: + """ + If *c* is not given, get the color value of the specified pixel. + If *c* is given, set the specified pixel to the given color. + """ + + @overload + def pixel(self, x: int, y: int, c: int, /) -> None: + """ + If *c* is not given, get the color value of the specified pixel. + If *c* is given, set the specified pixel to the given color. + """ + + def text(self, s: str, x: int, y: int, c: int = 1, /) -> None: + """ + Write text to the FrameBuffer using the coordinates as the upper-left + corner of the text. The color of the text can be defined by the optional + argument but is otherwise a default value of 1. All characters have + dimensions of 8x8 pixels and there is currently no way to change the font. + """ + ... + + def rect(self, x: int, y: int, w: int, h: int, c: int, /) -> None: + """ + Draw a rectangle at the given location, size and color. + + The optional *f* parameter can be set to ``True`` to fill the rectangle. + Otherwise just a one pixel outline is drawn. + """ + ... + + def scroll(self, xstep: int, ystep: int, /) -> None: + """ + Shift the contents of the FrameBuffer by the given vector. This may + leave a footprint of the previous colors in the FrameBuffer. + """ + ... + + def ellipse(self, x, y, xr, yr, c, f, m: Optional[Any] = None) -> None: + """ + Draw an ellipse at the given location. Radii *xr* and *yr* define the + geometry; equal values cause a circle to be drawn. The *c* parameter + defines the color. + + The optional *f* parameter can be set to ``True`` to fill the ellipse. + Otherwise just a one pixel outline is drawn. + + The optional *m* parameter enables drawing to be restricted to certain + quadrants of the ellipse. The LS four bits determine which quadrants are + to be drawn, with bit 0 specifying Q1, b1 Q2, b2 Q3 and b3 Q4. Quadrants + are numbered counterclockwise with Q1 being top right. + """ + ... + + def line(self, x1: int, y1: int, x2: int, y2: int, c: int, /) -> None: + """ + Draw a line from a set of coordinates using the given color and + a thickness of 1 pixel. The `line` method draws the line up to + a second set of coordinates whereas the `hline` and `vline` + methods draw horizontal and vertical lines respectively up to + a given length. + """ + ... + + def blit( + self, + fbuf: FrameBuffer, + x: int, + y: int, + key: int = -1, + palette: Optional[bytes] = None, + /, + ) -> None: + """ + Draw another FrameBuffer on top of the current one at the given coordinates. + If *key* is specified then it should be a color integer and the + corresponding color will be considered transparent: all pixels with that + color value will not be drawn. (If the *palette* is specified then the *key* + is compared to the value from *palette*, not to the value directly from + *fbuf*.) + + *fbuf* can be another FrameBuffer instance, or a tuple or list of the form:: + + (buffer, width, height, format) + + or:: + + (buffer, width, height, format, stride) + + This matches the signature of the FrameBuffer constructor, and the elements + of the tuple/list are the same as the arguments to the constructor except that + the *buffer* here can be read-only. + + The *palette* argument enables blitting between FrameBuffers with differing + formats. Typical usage is to render a monochrome or grayscale glyph/icon to + a color display. The *palette* is a FrameBuffer instance whose format is + that of the current FrameBuffer. The *palette* height is one pixel and its + pixel width is the number of colors in the source FrameBuffer. The *palette* + for an N-bit source needs 2**N pixels; the *palette* for a monochrome source + would have 2 pixels representing background and foreground colors. The + application assigns a color to each pixel in the *palette*. The color of the + current pixel will be that of that *palette* pixel whose x position is the + color of the corresponding source pixel. + """ + ... + + def hline(self, x: int, y: int, w: int, c: int, /) -> None: + """ + Draw a line from a set of coordinates using the given color and + a thickness of 1 pixel. The `line` method draws the line up to + a second set of coordinates whereas the `hline` and `vline` + methods draw horizontal and vertical lines respectively up to + a given length. + """ + + def fill(self, c: int, /) -> None: + """ + Fill the entire FrameBuffer with the specified color. + """ + ... + + def fill_rect(self, *args, **kwargs) -> Incomplete: ... + def __init__( + self, + buffer: AnyWritableBuf, + width: int, + height: int, + format: int, + stride: int = ..., + /, + ) -> None: + """ + Construct a FrameBuffer object. The parameters are: + + - *buffer* is an object with a buffer protocol which must be large + enough to contain every pixel defined by the width, height and + format of the FrameBuffer. + - *width* is the width of the FrameBuffer in pixels + - *height* is the height of the FrameBuffer in pixels + - *format* specifies the type of pixel used in the FrameBuffer; + permissible values are listed under Constants below. These set the + number of bits used to encode a color value and the layout of these + bits in *buffer*. + Where a color value c is passed to a method, c is a small integer + with an encoding that is dependent on the format of the FrameBuffer. + - *stride* is the number of pixels between each horizontal line + of pixels in the FrameBuffer. This defaults to *width* but may + need adjustments when implementing a FrameBuffer within another + larger FrameBuffer or screen. The *buffer* size must accommodate + an increased step size. + + One must specify valid *buffer*, *width*, *height*, *format* and + optionally *stride*. Invalid *buffer* size or dimensions may lead to + unexpected errors. + """ diff --git a/.venv/lib/python3.12/site-packages/gc.pyi b/.venv/lib/python3.12/site-packages/gc.pyi new file mode 100644 index 0000000..3d7a77b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/gc.pyi @@ -0,0 +1,112 @@ +""" +Control the garbage collector. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/gc.html + +CPython module: :mod:`python:gc` https://docs.python.org/3/library/gc.html . + +--- +Module: 'gc' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing import overload +from typing_extensions import Awaitable, TypeAlias, TypeVar + +def mem_alloc() -> int: + """ + Return the number of bytes of heap RAM that are allocated by Python code. + + Admonition:Difference to CPython + :class: attention + + This function is MicroPython extension. + """ + ... + +def isenabled(*args, **kwargs) -> Incomplete: ... +def mem_free() -> int: + """ + Return the number of bytes of heap RAM that is available for Python + code to allocate, or -1 if this amount is not known. + + Admonition:Difference to CPython + :class: attention + + This function is MicroPython extension. + """ + ... + +@overload +def threshold() -> int: + """ + Set or query the additional GC allocation threshold. Normally, a collection + is triggered only when a new allocation cannot be satisfied, i.e. on an + out-of-memory (OOM) condition. If this function is called, in addition to + OOM, a collection will be triggered each time after *amount* bytes have been + allocated (in total, since the previous time such an amount of bytes + have been allocated). *amount* is usually specified as less than the + full heap size, with the intention to trigger a collection earlier than when the + heap becomes exhausted, and in the hope that an early collection will prevent + excessive memory fragmentation. This is a heuristic measure, the effect + of which will vary from application to application, as well as + the optimal value of the *amount* parameter. + + Calling the function without argument will return the current value of + the threshold. A value of -1 means a disabled allocation threshold. + + Admonition:Difference to CPython + :class: attention + + This function is a MicroPython extension. CPython has a similar + function - ``set_threshold()``, but due to different GC + implementations, its signature and semantics are different. + """ + +@overload +def threshold(amount: int) -> None: + """ + Set or query the additional GC allocation threshold. Normally, a collection + is triggered only when a new allocation cannot be satisfied, i.e. on an + out-of-memory (OOM) condition. If this function is called, in addition to + OOM, a collection will be triggered each time after *amount* bytes have been + allocated (in total, since the previous time such an amount of bytes + have been allocated). *amount* is usually specified as less than the + full heap size, with the intention to trigger a collection earlier than when the + heap becomes exhausted, and in the hope that an early collection will prevent + excessive memory fragmentation. This is a heuristic measure, the effect + of which will vary from application to application, as well as + the optimal value of the *amount* parameter. + + Calling the function without argument will return the current value of + the threshold. A value of -1 means a disabled allocation threshold. + + Admonition:Difference to CPython + :class: attention + + This function is a MicroPython extension. CPython has a similar + function - ``set_threshold()``, but due to different GC + implementations, its signature and semantics are different. + """ + +def collect() -> None: + """ + Run a garbage collection. + """ + ... + +def enable() -> None: + """ + Enable automatic garbage collection. + """ + ... + +def disable() -> None: + """ + Disable automatic garbage collection. Heap memory can still be allocated, + and garbage collection can still be initiated manually using :meth:`gc.collect`. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/hashlib.pyi b/.venv/lib/python3.12/site-packages/hashlib.pyi new file mode 100644 index 0000000..4ff97f3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/hashlib.pyi @@ -0,0 +1,104 @@ +""" +Hashing algorithms. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/hashlib.html + +CPython module: :mod:`python:hashlib` https://docs.python.org/3/library/hashlib.html . + +This module implements binary data hashing algorithms. The exact inventory +of available algorithms depends on a board. Among the algorithms which may +be implemented: + +* SHA256 - The current generation, modern hashing algorithm (of SHA2 series). + It is suitable for cryptographically-secure purposes. Included in the + MicroPython core and any board is recommended to provide this, unless + it has particular code size constraints. + +* SHA1 - A previous generation algorithm. Not recommended for new usages, + but SHA1 is a part of number of Internet standards and existing + applications, so boards targeting network connectivity and + interoperability will try to provide this. + +* MD5 - A legacy algorithm, not considered cryptographically secure. Only + selected boards, targeting interoperability with legacy applications, + will offer this. + +--- +Module: 'hashlib' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from _mpy_shed import AnyReadableBuf, AnyWritableBuf, _Hash +from typing import overload +from typing_extensions import Awaitable, TypeAlias, TypeVar + +class sha256(_Hash): + """ + The current generation, modern hashing algorithm (of SHA2 series). + It is suitable for cryptographically-secure purposes. Included in the + MicroPython core and any board is recommended to provide this, unless + it has particular code size constraints. + """ + + def digest(self, *args, **kwargs) -> Incomplete: ... + def update(self, *args, **kwargs) -> Incomplete: ... + @overload + def __init__(self): + """ + Create an SHA256 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self, data: AnyReadableBuf): + """ + Create an SHA256 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self): + """ + Create an SHA256 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self, data: AnyReadableBuf): + """ + Create an SHA256 hasher object and optionally feed ``data`` into it. + """ + +class sha1(_Hash): + """ + A previous generation algorithm. Not recommended for new usages, + but SHA1 is a part of number of Internet standards and existing + applications, so boards targeting network connectivity and + interoperability will try to provide this. + """ + + def digest(self, *args, **kwargs) -> Incomplete: ... + def update(self, *args, **kwargs) -> Incomplete: ... + @overload + def __init__(self): + """ + Create an SHA1 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self, data: AnyReadableBuf): + """ + Create an SHA1 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self): + """ + Create an SHA1 hasher object and optionally feed ``data`` into it. + """ + + @overload + def __init__(self, data: AnyReadableBuf): + """ + Create an SHA1 hasher object and optionally feed ``data`` into it. + """ diff --git a/.venv/lib/python3.12/site-packages/heapq.pyi b/.venv/lib/python3.12/site-packages/heapq.pyi new file mode 100644 index 0000000..dd452a4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/heapq.pyi @@ -0,0 +1,46 @@ +""" +Heap queue algorithm. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/heapq.html + +CPython module: :mod:`python:heapq` https://docs.python.org/3/library/heapq.html . + +This module implements the +`min heap queue algorithm `_. + +A heap queue is essentially a list that has its elements stored in such a way +that the first item of the list is always the smallest. + +--- +Module: 'heapq' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing import Any +from typing_extensions import Awaitable, TypeAlias, TypeVar + +_T = TypeVar("_T") + +def heappop(heap: list[_T], /) -> _T: + """ + Pop the first item from the ``heap``, and return it. Raise ``IndexError`` if + ``heap`` is empty. + + The returned item will be the smallest item in the ``heap``. + """ + ... + +def heappush(heap: list[_T], item: _T, /) -> None: + """ + Push the ``item`` onto the ``heap``. + """ + ... + +def heapify(x: list[Any], /) -> None: + """ + Convert the list ``x`` into a heap. This is an in-place operation. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/machine.pyi b/.venv/lib/python3.12/site-packages/machine.pyi new file mode 100644 index 0000000..6f62fb7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/machine.pyi @@ -0,0 +1,3165 @@ +""" +Functions related to the hardware. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/machine.html + +The ``machine`` module contains specific functions related to the hardware +on a particular board. Most functions in this module allow to achieve direct +and unrestricted access to and control of hardware blocks on a system +(like CPU, timers, buses, etc.). Used incorrectly, this can lead to +malfunction, lockups, crashes of your board, and in extreme cases, hardware +damage. + +--- +Module: 'machine' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from typing import NoReturn, Union, Tuple, Callable, List, Sequence, Any, Optional, overload, Final +from _typeshed import Incomplete +from _mpy_shed import _IRQ, AnyReadableBuf, AnyWritableBuf, mp_available +from typing_extensions import Awaitable, TypeAlias, TypeVar, deprecated +from vfs import AbstractBlockDev + +PWRON_RESET: Final[int] = 1 +WDT_RESET: Final[int] = 3 +ATTN_0DB: int = ... +ID_T: TypeAlias = int | str +PinLike: TypeAlias = Pin | int | str +IDLE: Incomplete +SLEEP: Incomplete +DEEPSLEEP: Incomplete +HARD_RESET: Incomplete +DEEPSLEEP_RESET: Incomplete +SOFT_RESET: Incomplete +WLAN_WAKE: Incomplete +PIN_WAKE: Incomplete +RTC_WAKE: Incomplete +_IRQ_STATE: TypeAlias = int + +def dht_readinto(*args, **kwargs) -> Incomplete: ... +def disable_irq() -> _IRQ_STATE: + """ + Disable interrupt requests. + Returns the previous IRQ state which should be considered an opaque value. + This return value should be passed to the `enable_irq()` function to restore + interrupts to their original state, before `disable_irq()` was called. + """ + ... + +def enable_irq(state: _IRQ_STATE, /) -> None: + """ + Re-enable interrupt requests. + The *state* parameter should be the value that was returned from the most + recent call to the `disable_irq()` function. + """ + ... + +def bitstream(pin, encoding, timing, data, /) -> Incomplete: + """ + Transmits *data* by bit-banging the specified *pin*. The *encoding* argument + specifies how the bits are encoded, and *timing* is an encoding-specific timing + specification. + + The supported encodings are: + + - ``0`` for "high low" pulse duration modulation. This will transmit 0 and + 1 bits as timed pulses, starting with the most significant bit. + The *timing* must be a four-tuple of nanoseconds in the format + ``(high_time_0, low_time_0, high_time_1, low_time_1)``. For example, + ``(400, 850, 800, 450)`` is the timing specification for WS2812 RGB LEDs + at 800kHz. + + The accuracy of the timing varies between ports. On Cortex M0 at 48MHz, it is + at best +/- 120ns, however on faster MCUs (ESP8266, ESP32, STM32, Pyboard), it + will be closer to +/-30ns. + + ``Note:`` For controlling WS2812 / NeoPixel strips, see the :mod:`neopixel` + module for a higher-level API. + """ + ... + +@overload +def deepsleep() -> NoReturn: + """ + Stops execution in an attempt to enter a low power state. + + If *time_ms* is specified then this will be the maximum time in milliseconds that + the sleep will last for. Otherwise the sleep can last indefinitely. + + With or without a timeout, execution may resume at any time if there are events + that require processing. Such events, or wake sources, should be configured before + sleeping, like `Pin` change or `RTC` timeout. + + The precise behaviour and power-saving capabilities of lightsleep and deepsleep is + highly dependent on the underlying hardware, but the general properties are: + + * A lightsleep has full RAM and state retention. Upon wake execution is resumed + from the point where the sleep was requested, with all subsystems operational. + + * A deepsleep may not retain RAM or any other state of the system (for example + peripherals or network interfaces). Upon wake execution is resumed from the main + script, similar to a hard or power-on reset. The `reset_cause()` function will + return `machine.DEEPSLEEP` and this can be used to distinguish a deepsleep wake + from other resets. + """ + +@overload +def deepsleep(time_ms: int, /) -> NoReturn: + """ + Stops execution in an attempt to enter a low power state. + + If *time_ms* is specified then this will be the maximum time in milliseconds that + the sleep will last for. Otherwise the sleep can last indefinitely. + + With or without a timeout, execution may resume at any time if there are events + that require processing. Such events, or wake sources, should be configured before + sleeping, like `Pin` change or `RTC` timeout. + + The precise behaviour and power-saving capabilities of lightsleep and deepsleep is + highly dependent on the underlying hardware, but the general properties are: + + * A lightsleep has full RAM and state retention. Upon wake execution is resumed + from the point where the sleep was requested, with all subsystems operational. + + * A deepsleep may not retain RAM or any other state of the system (for example + peripherals or network interfaces). Upon wake execution is resumed from the main + script, similar to a hard or power-on reset. The `reset_cause()` function will + return `machine.DEEPSLEEP` and this can be used to distinguish a deepsleep wake + from other resets. + """ + +def bootloader(value: Optional[Any] = None) -> None: + """ + Reset the device and enter its bootloader. This is typically used to put the + device into a state where it can be programmed with new firmware. + + Some ports support passing in an optional *value* argument which can control + which bootloader to enter, what to pass to it, or other things. + """ + ... + +def unique_id() -> bytes: + """ + Returns a byte string with a unique identifier of a board/SoC. It will vary + from a board/SoC instance to another, if underlying hardware allows. Length + varies by hardware (so use substring of a full value if you expect a short + ID). In some MicroPython ports, ID corresponds to the network MAC address. + """ + ... + +def soft_reset() -> NoReturn: + """ + Performs a :ref:`soft reset ` of the interpreter, deleting all + Python objects and resetting the Python heap. + """ + ... + +def reset_cause() -> int: + """ + Get the reset cause. See :ref:`constants ` for the possible return values. + """ + ... + +def time_pulse_us(pin: Pin, pulse_level: int, timeout_us: int = 1_000_000, /) -> int: + """ + Time a pulse on the given *pin*, and return the duration of the pulse in + microseconds. The *pulse_level* argument should be 0 to time a low pulse + or 1 to time a high pulse. + + If the current input value of the pin is different to *pulse_level*, + the function first (*) waits until the pin input becomes equal to *pulse_level*, + then (**) times the duration that the pin is equal to *pulse_level*. + If the pin is already equal to *pulse_level* then timing starts straight away. + + The function will return -2 if there was timeout waiting for condition marked + (*) above, and -1 if there was timeout during the main measurement, marked (**) + above. The timeout is the same for both cases and given by *timeout_us* (which + is in microseconds). + """ + ... + +@overload +def freq() -> int: + """ + Returns the CPU frequency in hertz. + + On some ports this can also be used to set the CPU frequency by passing in *hz*. + """ + +@overload +def freq(hz: int, /) -> None: + """ + Returns the CPU frequency in hertz. + + On some ports this can also be used to set the CPU frequency by passing in *hz*. + """ + +@overload +def freq(self) -> int: + """ + Returns the CPU frequency in hertz. + + On some ports this can also be used to set the CPU frequency by passing in *hz*. + """ + +@overload +def freq( + self, + value: int, + /, +) -> None: + """ + Returns the CPU frequency in hertz. + + On some ports this can also be used to set the CPU frequency by passing in *hz*. + """ + +def idle() -> None: + """ + Gates the clock to the CPU, useful to reduce power consumption at any time + during short or long periods. Peripherals continue working and execution + resumes as soon as any interrupt is triggered, or at most one millisecond + after the CPU was paused. + + It is recommended to call this function inside any tight loop that is + continuously checking for an external change (i.e. polling). This will reduce + power consumption without significantly impacting performance. To reduce + power consumption further then see the :func:`lightsleep`, + :func:`time.sleep()` and :func:`time.sleep_ms()` functions. + """ + ... + +def reset() -> NoReturn: + """ + :ref:`Hard resets ` the device in a manner similar to pushing the + external RESET button. + """ + ... + +@overload +def lightsleep() -> None: + """ + Stops execution in an attempt to enter a low power state. + + If *time_ms* is specified then this will be the maximum time in milliseconds that + the sleep will last for. Otherwise the sleep can last indefinitely. + + With or without a timeout, execution may resume at any time if there are events + that require processing. Such events, or wake sources, should be configured before + sleeping, like `Pin` change or `RTC` timeout. + + The precise behaviour and power-saving capabilities of lightsleep and deepsleep is + highly dependent on the underlying hardware, but the general properties are: + + * A lightsleep has full RAM and state retention. Upon wake execution is resumed + from the point where the sleep was requested, with all subsystems operational. + + * A deepsleep may not retain RAM or any other state of the system (for example + peripherals or network interfaces). Upon wake execution is resumed from the main + script, similar to a hard or power-on reset. The `reset_cause()` function will + return `machine.DEEPSLEEP` and this can be used to distinguish a deepsleep wake + from other resets. + """ + +@overload +def lightsleep(time_ms: int, /) -> None: + """ + Stops execution in an attempt to enter a low power state. + + If *time_ms* is specified then this will be the maximum time in milliseconds that + the sleep will last for. Otherwise the sleep can last indefinitely. + + With or without a timeout, execution may resume at any time if there are events + that require processing. Such events, or wake sources, should be configured before + sleeping, like `Pin` change or `RTC` timeout. + + The precise behaviour and power-saving capabilities of lightsleep and deepsleep is + highly dependent on the underlying hardware, but the general properties are: + + * A lightsleep has full RAM and state retention. Upon wake execution is resumed + from the point where the sleep was requested, with all subsystems operational. + + * A deepsleep may not retain RAM or any other state of the system (for example + peripherals or network interfaces). Upon wake execution is resumed from the main + script, similar to a hard or power-on reset. The `reset_cause()` function will + return `machine.DEEPSLEEP` and this can be used to distinguish a deepsleep wake + from other resets. + """ + +mem8: Incomplete ## = <8-bit memory> +mem32: Incomplete ## = <32-bit memory> +mem16: Incomplete ## = <16-bit memory> + +class PWM: + """ + This class provides pulse width modulation output. + + Example usage:: + + from machine import PWM + + pwm = PWM(pin) # create a PWM object on a pin + pwm.duty_u16(32768) # set duty to 50% + + # reinitialise with a period of 200us, duty of 5us + pwm.init(freq=5000, duty_ns=5000) + + pwm.duty_ns(3000) # set pulse width to 3us + + pwm.deinit() + + + Limitations of PWM + ------------------ + + * Not all frequencies can be generated with absolute accuracy due to + the discrete nature of the computing hardware. Typically the PWM frequency + is obtained by dividing some integer base frequency by an integer divider. + For example, if the base frequency is 80MHz and the required PWM frequency is + 300kHz the divider must be a non-integer number 80000000 / 300000 = 266.67. + After rounding the divider is set to 267 and the PWM frequency will be + 80000000 / 267 = 299625.5 Hz, not 300kHz. If the divider is set to 266 then + the PWM frequency will be 80000000 / 266 = 300751.9 Hz, but again not 300kHz. + + * The duty cycle has the same discrete nature and its absolute accuracy is not + achievable. On most hardware platforms the duty will be applied at the next + frequency period. Therefore, you should wait more than "1/frequency" before + measuring the duty. + + * The frequency and the duty cycle resolution are usually interdependent. + The higher the PWM frequency the lower the duty resolution which is available, + and vice versa. For example, a 300kHz PWM frequency can have a duty cycle + resolution of 8 bit, not 16-bit as may be expected. In this case, the lowest + 8 bits of *duty_u16* are insignificant. So:: + + pwm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2) + + and:: + + pwm=PWM(Pin(13), freq=300_000, duty_u16=2**16//2 + 255) + + will generate PWM with the same 50% duty cycle. + """ + + @overload + def duty_u16(self) -> int: + """ + Get or set the current duty cycle of the PWM output, as an unsigned 16-bit + value in the range 0 to 65535 inclusive. + + With no arguments the duty cycle is returned. + + With a single *value* argument the duty cycle is set to that value, measured + as the ratio ``value / 65535``. + """ + + @overload + def duty_u16( + self, + value: int, + /, + ) -> None: + """ + Get or set the current duty cycle of the PWM output, as an unsigned 16-bit + value in the range 0 to 65535 inclusive. + + With no arguments the duty cycle is returned. + + With a single *value* argument the duty cycle is set to that value, measured + as the ratio ``value / 65535``. + """ + + @overload + def freq(self) -> int: + """ + Get or set the current frequency of the PWM output. + + With no arguments the frequency in Hz is returned. + + With a single *value* argument the frequency is set to that value in Hz. The + method may raise a ``ValueError`` if the frequency is outside the valid range. + """ + + @overload + def freq( + self, + value: int, + /, + ) -> None: + """ + Get or set the current frequency of the PWM output. + + With no arguments the frequency in Hz is returned. + + With a single *value* argument the frequency is set to that value in Hz. The + method may raise a ``ValueError`` if the frequency is outside the valid range. + """ + + def init(self, *, freq: int = ..., duty_u16: int = ..., duty_ns: int = ...) -> None: + """ + Modify settings for the PWM object. See the above constructor for details + about the parameters. + """ + ... + + @overload + def duty_ns(self) -> int: + """ + Get or set the current pulse width of the PWM output, as a value in nanoseconds. + + With no arguments the pulse width in nanoseconds is returned. + + With a single *value* argument the pulse width is set to that value. + """ + + @overload + def duty_ns( + self, + value: int, + /, + ) -> None: + """ + Get or set the current pulse width of the PWM output, as a value in nanoseconds. + + With no arguments the pulse width in nanoseconds is returned. + + With a single *value* argument the pulse width is set to that value. + """ + + def deinit(self) -> None: + """ + Disable the PWM output. + """ + ... + + def __init__( + self, + dest: PinLike, + /, + *, + freq: int = ..., + duty_u16: int = ..., + duty_ns: int = ..., + ) -> None: + """ + Construct and return a new PWM object using the following parameters: + + - *dest* is the entity on which the PWM is output, which is usually a + :ref:`machine.Pin ` object, but a port may allow other values, + like integers. + - *freq* should be an integer which sets the frequency in Hz for the + PWM cycle. + - *duty_u16* sets the duty cycle as a ratio ``duty_u16 / 65535``. + - *duty_ns* sets the pulse width in nanoseconds. + + Setting *freq* may affect other PWM objects if the objects share the same + underlying PWM generator (this is hardware specific). + Only one of *duty_u16* and *duty_ns* should be specified at a time. + """ + +class WDT: + """ + The WDT is used to restart the system when the application crashes and ends + up into a non recoverable state. Once started it cannot be stopped or + reconfigured in any way. After enabling, the application must "feed" the + watchdog periodically to prevent it from expiring and resetting the system. + + Example usage:: + + from machine import WDT + wdt = WDT(timeout=2000) # enable it with a timeout of 2s + wdt.feed() + + Availability of this class: pyboard, WiPy, esp8266, esp32. + """ + + def feed(self) -> None: + """ + Feed the WDT to prevent it from resetting the system. The application + should place this call in a sensible place ensuring that the WDT is + only fed after verifying that everything is functioning correctly. + """ + ... + + def __init__(self, *, id: int = 0, timeout: int = 5000) -> None: + """ + Create a WDT object and start it. The timeout must be given in milliseconds. + Once it is running the timeout cannot be changed and the WDT cannot be stopped either. + + Notes: On the esp32 the minimum timeout is 1 second. On the esp8266 a timeout + cannot be specified, it is determined by the underlying system. + """ + +class I2S: + """ + I2S is a synchronous serial protocol used to connect digital audio devices. + At the physical level, a bus consists of 3 lines: SCK, WS, SD. + The I2S class supports controller operation. Peripheral operation is not supported. + + The I2S class is currently available as a Technical Preview. During the preview period, feedback from + users is encouraged. Based on this feedback, the I2S class API and implementation may be changed. + + I2S objects can be created and initialized using:: + + from machine import I2S + from machine import Pin + + # ESP32 + sck_pin = Pin(14) # Serial clock output + ws_pin = Pin(13) # Word clock output + sd_pin = Pin(12) # Serial data output + + or + + # PyBoards + sck_pin = Pin("Y6") # Serial clock output + ws_pin = Pin("Y5") # Word clock output + sd_pin = Pin("Y8") # Serial data output + + audio_out = I2S(2, + sck=sck_pin, ws=ws_pin, sd=sd_pin, + mode=I2S.TX, + bits=16, + format=I2S.MONO, + rate=44100, + ibuf=20000) + + audio_in = I2S(2, + sck=sck_pin, ws=ws_pin, sd=sd_pin, + mode=I2S.RX, + bits=32, + format=I2S.STEREO, + rate=22050, + ibuf=20000) + + 3 modes of operation are supported: + - blocking + - non-blocking + - uasyncio + + blocking:: + + num_written = audio_out.write(buf) # blocks until buf emptied + + num_read = audio_in.readinto(buf) # blocks until buf filled + + non-blocking:: + + audio_out.irq(i2s_callback) # i2s_callback is called when buf is emptied + num_written = audio_out.write(buf) # returns immediately + + audio_in.irq(i2s_callback) # i2s_callback is called when buf is filled + num_read = audio_in.readinto(buf) # returns immediately + + uasyncio:: + + swriter = uasyncio.StreamWriter(audio_out) + swriter.write(buf) + await swriter.drain() + + sreader = uasyncio.StreamReader(audio_in) + num_read = await sreader.readinto(buf) + """ + + RX: Final[int] = 0 + MONO: Final[int] = 0 + STEREO: Final[int] = 1 + TX: Final[int] = 1 + @staticmethod + def shift( + buf: AnyWritableBuf, + bits: int, + shift: int, + /, + ) -> None: + """ + bitwise shift of all samples contained in ``buf``. ``bits`` specifies sample size in bits. ``shift`` specifies the number of bits to shift each sample. + Positive for left shift, negative for right shift. + Typically used for volume control. Each bit shift changes sample volume by 6dB. + """ + ... + + def init( + self, + *, + sck: PinLike, + ws: PinLike, + sd: PinLike, + mode: int, + bits: int, + format: int, + rate: int, + ibuf: int, + ) -> None: + """ + see Constructor for argument descriptions + """ + ... + + def irq( + self, + handler: Callable[[], None], + /, + ) -> None: + """ + Set a callback. ``handler`` is called when ``buf`` is emptied (``write`` method) or becomes full (``readinto`` method). + Setting a callback changes the ``write`` and ``readinto`` methods to non-blocking operation. + ``handler`` is called in the context of the MicroPython scheduler. + """ + ... + + def readinto( + self, + buf: AnyWritableBuf, + /, + ) -> int: + """ + Read audio samples into the buffer specified by ``buf``. ``buf`` must support the buffer protocol, such as bytearray or array. + "buf" byte ordering is little-endian. For Stereo format, left channel sample precedes right channel sample. For Mono format, + the left channel sample data is used. + Returns number of bytes read + """ + ... + + def deinit(self) -> None: + """ + Deinitialize the I2S bus + """ + ... + + def write( + self, + buf: AnyReadableBuf, + /, + ) -> int: + """ + Write audio samples contained in ``buf``. ``buf`` must support the buffer protocol, such as bytearray or array. + "buf" byte ordering is little-endian. For Stereo format, left channel sample precedes right channel sample. For Mono format, + the sample data is written to both the right and left channels. + Returns number of bytes written + """ + ... + + def __init__( + self, + id: ID_T, + /, + *, + sck: PinLike, + ws: PinLike, + sd: PinLike, + mode: int, + bits: int, + format: int, + rate: int, + ibuf: int, + ) -> None: + """ + Construct an I2S object of the given id: + + - ``id`` identifies a particular I2S bus. + + ``id`` is board and port specific: + + - PYBv1.0/v1.1: has one I2S bus with id=2. + - PYBD-SFxW: has two I2S buses with id=1 and id=2. + - ESP32: has two I2S buses with id=0 and id=1. + + Keyword-only parameters that are supported on all ports: + + - ``sck`` is a pin object for the serial clock line + - ``ws`` is a pin object for the word select line + - ``sd`` is a pin object for the serial data line + - ``mode`` specifies receive or transmit + - ``bits`` specifies sample size (bits), 16 or 32 + - ``format`` specifies channel format, STEREO or MONO + - ``rate`` specifies audio sampling rate (samples/s) + - ``ibuf`` specifies internal buffer length (bytes) + + For all ports, DMA runs continuously in the background and allows user applications to perform other operations while + sample data is transfered between the internal buffer and the I2S peripheral unit. + Increasing the size of the internal buffer has the potential to increase the time that user applications can perform non-I2S operations + before underflow (e.g. ``write`` method) or overflow (e.g. ``readinto`` method). + """ + +class ADC: + """ + The ADC class provides an interface to analog-to-digital convertors, and + represents a single endpoint that can sample a continuous voltage and + convert it to a discretised value. + + Example usage:: + + import machine + + adc = machine.ADC(pin) # create an ADC object acting on a pin + val = adc.read_u16() # read a raw analog value in the range 0-65535 + """ + + CORE_TEMP: Final[int] = 4 + VREF: int = ... + CORE_VREF: int = ... + CORE_VBAT: int = ... + ATTN_0DB: int = 0 + ATTN_2_5DB: int = 1 + ATTN_6DB: int = 2 + ATTN_11DB: int = 3 + WIDTH_9BIT: int = 9 + WIDTH_10BIT: int = 10 + WIDTH_11BIT: int = 11 + WIDTH_12BIT: int = 12 + def read_u16(self) -> int: + """ + Take an analog reading and return an integer in the range 0-65535. + The return value represents the raw reading taken by the ADC, scaled + such that the minimum value is 0 and the maximum value is 65535. + """ + ... + + def __init__(self, pin: PinLike, *, atten=ATTN_0DB) -> None: + """ + Access the ADC associated with a source identified by *id*. This + *id* may be an integer (usually specifying a channel number), a + :ref:`Pin ` object, or other value supported by the + underlying machine. + .. note:: + + WiPy has a custom implementation of ADC, see ADCWiPy for details. + + on ESP32 : `atten` specifies the attenuation level for the ADC input. + """ + # ESP32 specific + @mp_available(port="esp32") + @deprecated("Use ADC.block().init(bits=bits) instead.") + def width(self, bits: int) -> None: + """ + Equivalent to ADC.block().init(bits=bits). + The only chip that can switch resolution to a lower one is the normal esp32. The C2 & S3 are stuck at 12 bits, while the S2 is at 13 bits. + + For compatibility, the ADC object also provides constants matching the supported ADC resolutions, per chip: + + ESP32: + ADC.WIDTH_9BIT = 9 + ADC.WIDTH_10BIT = 10 + ADC.WIDTH_11BIT = 11 + ADC.WIDTH_12BIT = 12 + + ESP32 C3 & S3: + ADC.WIDTH_12BIT = 12 + + ESP32 S2: + ADC.WIDTH_13BIT = 13 + + Available : ESP32 + """ + ... + + @mp_available(port="esp32") + @deprecated("Use read_u16() instead.") + def read(self) -> int: + """ + Take an analog reading and return an integer in the range 0-4095. + The return value represents the raw reading taken by the ADC, scaled + such that the minimum value is 0 and the maximum value is 4095. + + This method is deprecated, use `read_u16()` instead. + + Available : ESP32 + """ + ... + + @mp_available(port="esp32") + @deprecated("Use ADC.init(atten=atten) instead.") + def atten(self, atten: int) -> None: + """ + Set the attenuation level for the ADC input. + + Available : ESP32 + """ + ... + +class I2C: + """ + I2C is a two-wire protocol for communicating between devices. At the physical + level it consists of 2 wires: SCL and SDA, the clock and data lines respectively. + + I2C objects are created attached to a specific bus. They can be initialised + when created, or initialised later on. + + Printing the I2C object gives you information about its configuration. + + Both hardware and software I2C implementations exist via the + :ref:`machine.I2C ` and `machine.SoftI2C` classes. Hardware I2C uses + underlying hardware support of the system to perform the reads/writes and is + usually efficient and fast but may have restrictions on which pins can be used. + Software I2C is implemented by bit-banging and can be used on any pin but is not + as efficient. These classes have the same methods available and differ primarily + in the way they are constructed. + + Example usage:: + + from machine import I2C + + i2c = I2C(freq=400000) # create I2C peripheral at frequency of 400kHz + # depending on the port, extra parameters may be required + # to select the peripheral and/or pins to use + + i2c.scan() # scan for peripherals, returning a list of 7-bit addresses + + i2c.writeto(42, b'123') # write 3 bytes to peripheral with 7-bit address 42 + i2c.readfrom(42, 4) # read 4 bytes from peripheral with 7-bit address 42 + + i2c.readfrom_mem(42, 8, 3) # read 3 bytes from memory of peripheral 42, + # starting at memory-address 8 in the peripheral + i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of peripheral 42 + # starting at address 2 in the peripheral + """ + + def readfrom_mem_into(self, addr: int, memaddr: int, buf: AnyWritableBuf, /, *, addrsize: int = 8) -> None: + """ + Read into *buf* from the peripheral specified by *addr* starting from the + memory address specified by *memaddr*. The number of bytes read is the + length of *buf*. + The argument *addrsize* specifies the address size in bits (on ESP8266 + this argument is not recognised and the address size is always 8 bits). + + The method returns ``None``. + """ + ... + + def readfrom_into(self, addr: int, buf: AnyWritableBuf, stop: bool = True, /) -> None: + """ + Read into *buf* from the peripheral specified by *addr*. + The number of bytes read will be the length of *buf*. + If *stop* is true then a STOP condition is generated at the end of the transfer. + + The method returns ``None``. + """ + ... + + def readfrom_mem(self, addr: int, memaddr: int, nbytes: int, /, *, addrsize: int = 8) -> bytes: + """ + Read *nbytes* from the peripheral specified by *addr* starting from the memory + address specified by *memaddr*. + The argument *addrsize* specifies the address size in bits. + Returns a `bytes` object with the data read. + """ + ... + + def writeto_mem(self, addr: int, memaddr: int, buf: AnyReadableBuf, /, *, addrsize: int = 8) -> None: + """ + Write *buf* to the peripheral specified by *addr* starting from the + memory address specified by *memaddr*. + The argument *addrsize* specifies the address size in bits (on ESP8266 + this argument is not recognised and the address size is always 8 bits). + + The method returns ``None``. + """ + ... + + def scan(self) -> List: + """ + Scan all I2C addresses between 0x08 and 0x77 inclusive and return a list of + those that respond. A device responds if it pulls the SDA line low after + its address (including a write bit) is sent on the bus. + """ + ... + + def writeto(self, addr: int, buf: AnyReadableBuf, stop: bool = True, /) -> int: + """ + Write the bytes from *buf* to the peripheral specified by *addr*. If a + NACK is received following the write of a byte from *buf* then the + remaining bytes are not sent. If *stop* is true then a STOP condition is + generated at the end of the transfer, even if a NACK is received. + The function returns the number of ACKs that were received. + """ + ... + + def writevto(self, addr: int, vector: Sequence[AnyReadableBuf], stop: bool = True, /) -> int: + """ + Write the bytes contained in *vector* to the peripheral specified by *addr*. + *vector* should be a tuple or list of objects with the buffer protocol. + The *addr* is sent once and then the bytes from each object in *vector* + are written out sequentially. The objects in *vector* may be zero bytes + in length in which case they don't contribute to the output. + + If a NACK is received following the write of a byte from one of the + objects in *vector* then the remaining bytes, and any remaining objects, + are not sent. If *stop* is true then a STOP condition is generated at + the end of the transfer, even if a NACK is received. The function + returns the number of ACKs that were received. + """ + ... + + def start(self) -> None: + """ + Generate a START condition on the bus (SDA transitions to low while SCL is high). + """ + ... + + def readfrom(self, addr: int, nbytes: int, stop: bool = True, /) -> bytes: + """ + Read *nbytes* from the peripheral specified by *addr*. + If *stop* is true then a STOP condition is generated at the end of the transfer. + Returns a `bytes` object with the data read. + """ + ... + + def readinto(self, buf: AnyWritableBuf, nack: bool = True, /) -> None: + """ + Reads bytes from the bus and stores them into *buf*. The number of bytes + read is the length of *buf*. An ACK will be sent on the bus after + receiving all but the last byte. After the last byte is received, if *nack* + is true then a NACK will be sent, otherwise an ACK will be sent (and in this + case the peripheral assumes more bytes are going to be read in a later call). + """ + ... + + @overload + def init(self, *, freq: int = 400_000) -> None: + """ + Initialise the I2C bus with the given arguments: + + - *scl* is a pin object for the SCL line + - *sda* is a pin object for the SDA line + - *freq* is the SCL clock rate + + In the case of hardware I2C the actual clock frequency may be lower than the + requested frequency. This is dependent on the platform hardware. The actual + rate may be determined by printing the I2C object. + """ + + @overload + def init(self, *, scl: PinLike, sda: PinLike, freq: int = 400_000) -> None: + """ + Initialise the I2C bus with the given arguments: + + - *scl* is a pin object for the SCL line + - *sda* is a pin object for the SDA line + - *freq* is the SCL clock rate + + In the case of hardware I2C the actual clock frequency may be lower than the + requested frequency. This is dependent on the platform hardware. The actual + rate may be determined by printing the I2C object. + """ + + def stop(self) -> None: + """ + Generate a STOP condition on the bus (SDA transitions to high while SCL is high). + """ + ... + + def write(self, buf: AnyReadableBuf, /) -> int: + """ + Write the bytes from *buf* to the bus. Checks that an ACK is received + after each byte and stops transmitting the remaining bytes if a NACK is + received. The function returns the number of ACKs that were received. + """ + ... + + @overload + def __init__(self, id: ID_T, /, *, freq: int = 400_000): + """ + Construct and return a new I2C object using the following parameters: + + - *id* identifies a particular I2C peripheral. Allowed values for + depend on the particular port/board + - *scl* should be a pin object specifying the pin to use for SCL. + - *sda* should be a pin object specifying the pin to use for SDA. + - *freq* should be an integer which sets the maximum frequency + for SCL. + + Note that some ports/boards will have default values of *scl* and *sda* + that can be changed in this constructor. Others will have fixed values + of *scl* and *sda* that cannot be changed. + """ + + @overload + def __init__(self, id: ID_T, /, *, scl: PinLike, sda: PinLike, freq: int = 400_000): + """ + Construct and return a new I2C object using the following parameters: + + - *id* identifies a particular I2C peripheral. Allowed values for + depend on the particular port/board + - *scl* should be a pin object specifying the pin to use for SCL. + - *sda* should be a pin object specifying the pin to use for SDA. + - *freq* should be an integer which sets the maximum frequency + for SCL. + + Note that some ports/boards will have default values of *scl* and *sda* + that can be changed in this constructor. Others will have fixed values + of *scl* and *sda* that cannot be changed. + """ + + @overload + def __init__(self, *, scl: PinLike, sda: PinLike, freq: int = 400_000) -> None: + """ + Initialise the I2C bus with the given arguments: + + - *scl* is a pin object for the SCL line + - *sda* is a pin object for the SDA line + - *freq* is the SCL clock rate + + In the case of hardware I2C the actual clock frequency may be lower than the + requested frequency. This is dependent on the platform hardware. The actual + rate may be determined by printing the I2C object. + """ + +class I2CTarget: + """ + Construct and return a new I2CTarget object using the following parameters: + + - *id* identifies a particular I2C peripheral. Allowed values depend on the + particular port/board. Some ports have a default in which case this parameter + can be omitted. + - *addr* is the I2C address of the target. + - *addrsize* is the number of bits in the I2C target address. Valid values + are 7 and 10. + - *mem* is an object with the buffer protocol that is writable. If not + specified then there is no backing memory and data must be read/written + using the :meth:`I2CTarget.readinto` and :meth:`I2CTarget.write` methods. + - *mem_addrsize* is the number of bits in the memory address. Valid values + are 0, 8, 16, 24 and 32. + - *scl* is a pin object specifying the pin to use for SCL. + - *sda* is a pin object specifying the pin to use for SDA. + + Note that some ports/boards will have default values of *scl* and *sda* + that can be changed in this constructor. Others will have fixed values + of *scl* and *sda* that cannot be changed. + """ + + IRQ_END_READ: Final[int] = 16 + IRQ_ADDR_MATCH_WRITE: Final[int] = 2 + IRQ_END_WRITE: Final[int] = 32 + IRQ_READ_REQ: Final[int] = 4 + IRQ_ADDR_MATCH_READ: Final[int] = 1 + IRQ_WRITE_REQ: Final[int] = 8 + def deinit(self) -> Incomplete: + """ + Deinitialise the I2C target. After this method is called the hardware will no + longer respond to requests on the I2C bus, and no other methods can be called. + """ + ... + + def irq(self, handler=None, trigger=IRQ_END_READ | IRQ_END_WRITE, hard=False) -> Incomplete: + """ + Configure an IRQ *handler* to be called when an event occurs. The possible events are + given by the following constants, which can be or'd together and passed to the *trigger* + argument: + + - ``IRQ_ADDR_MATCH_READ`` indicates that the target was addressed by a + controller for a read transaction. + - ``IRQ_ADDR_MATCH_READ`` indicates that the target was addressed by a + controller for a write transaction. + - ``IRQ_READ_REQ`` indicates that the controller is requesting data, and this + request must be satisfied by calling `I2CTarget.write` with the data to be + passed back to the controller. + - ``IRQ_WRITE_REQ`` indicates that the controller has written data, and the + data must be read by calling `I2CTarget.readinto`. + - ``IRQ_END_READ`` indicates that the controller has finished a read transaction. + - ``IRQ_END_WRITE`` indicates that the controller has finished a write transaction. + + Not all triggers are available on all ports. If a port has the constant then that + event is available. + + Note the following restrictions: + + - ``IRQ_ADDR_MATCH_READ``, ``IRQ_ADDR_MATCH_READ``, ``IRQ_READ_REQ`` and + ``IRQ_WRITE_REQ`` must be handled by a hard IRQ callback (with the *hard* argument + set to ``True``). This is because these events have very strict timing requirements + and must usually be satisfied synchronously with the hardware event. + + - ``IRQ_END_READ`` and ``IRQ_END_WRITE`` may be handled by either a soft or hard + IRQ callback (although note that all events must be registered with the same handler, + so if any events need a hard callback then all events must be hard). + + - If a memory buffer has been supplied in the constructor then ``IRQ_END_WRITE`` + is not emitted for the transaction that writes the memory address. This is to + allow ``IRQ_END_READ`` and ``IRQ_END_WRITE`` to function correctly as soft IRQ + callbacks, where the IRQ handler may be called quite some time after the actual + hardware event. + """ + ... + + def write(self, buf) -> int: + """ + Write out the bytes from the given buffer, to be passed to the I2C controller + after it sends a read request. Returns the number of bytes written. Most ports + only accept one byte at a time to this method. + """ + ... + + def readinto(self, buf) -> int: + """ + Read into the given buffer any pending bytes written by the I2C controller. + Returns the number of bytes read. + """ + ... + + def __init__(self, id, addr, *, addrsize=7, mem=None, mem_addrsize=8, scl=None, sda=None) -> None: ... + +class SoftSPI(SPI): + """ + Construct a new software SPI object. Additional parameters must be + given, usually at least *sck*, *mosi* and *miso*, and these are used + to initialise the bus. See `SPI.init` for a description of the parameters. + """ + + LSB: Final[int] = 0 + MSB: Final[int] = 1 + def deinit(self, *args, **kwargs) -> Incomplete: ... + def init(self, *args, **kwargs) -> Incomplete: ... + def write_readinto(self, *args, **kwargs) -> Incomplete: ... + def read(self, *args, **kwargs) -> Incomplete: ... + def write(self, *args, **kwargs) -> Incomplete: ... + def readinto(self, *args, **kwargs) -> Incomplete: ... + def __init__( + self, + baudrate=500000, + *, + polarity=0, + phase=0, + bits=8, + firstbit=MSB, + sck: PinLike | None = None, + mosi: PinLike | None = None, + miso: PinLike | None = None, + ) -> None: ... + +class Timer: + """ + Hardware timers deal with timing of periods and events. Timers are perhaps + the most flexible and heterogeneous kind of hardware in MCUs and SoCs, + differently greatly from a model to a model. MicroPython's Timer class + defines a baseline operation of executing a callback with a given period + (or once after some delay), and allow specific boards to define more + non-standard behaviour (which thus won't be portable to other boards). + + See discussion of :ref:`important constraints ` on + Timer callbacks. + + .. note:: + + Memory can't be allocated inside irq handlers (an interrupt) and so + exceptions raised within a handler don't give much information. See + :func:`micropython.alloc_emergency_exception_buf` for how to get around this + limitation. + + If you are using a WiPy board please refer to :ref:`machine.TimerWiPy ` + instead of this class. + """ + + PERIODIC: Final[int] = 1 + ONE_SHOT: Final[int] = 0 + + @overload + def init( + self, + *, + mode: int = PERIODIC, + period: int | None = None, + callback: Callable[[Timer], None] | None = None, + ) -> None: ... + @overload + def init( + self, + *, + mode: int = PERIODIC, + freq: int | None = None, + callback: Callable[[Timer], None] | None = None, + ) -> None: ... + @overload + def init( + self, + *, + mode: int = PERIODIC, + tick_hz: int | None = None, + callback: Callable[[Timer], None] | None = None, + ) -> None: + """ + Initialise the timer. Example:: + + def mycallback(t): + pass + + # periodic at 1kHz + tim.init(mode=Timer.PERIODIC, freq=1000, callback=mycallback) + + # periodic with 100ms period + tim.init(period=100, callback=mycallback) + + # one shot firing after 1000ms + tim.init(mode=Timer.ONE_SHOT, period=1000, callback=mycallback) + + Keyword arguments: + + - ``mode`` can be one of: + + - ``Timer.ONE_SHOT`` - The timer runs once until the configured + period of the channel expires. + - ``Timer.PERIODIC`` - The timer runs periodically at the configured + frequency of the channel. + + - ``freq`` - The timer frequency, in units of Hz. The upper bound of + the frequency is dependent on the port. When both the ``freq`` and + ``period`` arguments are given, ``freq`` has a higher priority and + ``period`` is ignored. + + - ``period`` - The timer period, in milliseconds. + + - ``callback`` - The callable to call upon expiration of the timer period. + The callback must take one argument, which is passed the Timer object. + The ``callback`` argument shall be specified. Otherwise an exception + will occur upon timer expiration: + ``TypeError: 'NoneType' object isn't callable`` + """ + ... + + def deinit(self) -> None: + """ + Deinitialises the timer. Stops the timer, and disables the timer peripheral. + """ + ... + + @overload + def __init__(self, id: int, /): + """ + Construct a new timer object of the given ``id``. ``id`` of -1 constructs a + virtual timer (if supported by a board). + ``id`` shall not be passed as a keyword argument. + + See ``init`` for parameters of initialisation. + """ + + @overload + def __init__( + self, + id: int, + /, + *, + mode: int = PERIODIC, + period: int | None = None, + callback: Callable[[Timer], None] | None = None, + ): + """ + Construct a new timer object of the given ``id``. ``id`` of -1 constructs a + virtual timer (if supported by a board). + ``id`` shall not be passed as a keyword argument. + + See ``init`` for parameters of initialisation. + """ + + @overload + def __init__( + self, + id: int, + /, + *, + mode: int = PERIODIC, + freq: int | None = None, + callback: Callable[[Timer], None] | None = None, + ): + """ + Construct a new timer object of the given ``id``. ``id`` of -1 constructs a + virtual timer (if supported by a board). + ``id`` shall not be passed as a keyword argument. + + See ``init`` for parameters of initialisation. + """ + + @overload + def __init__( + self, + id: int, + /, + *, + mode: int = PERIODIC, + tick_hz: int | None = None, + callback: Callable[[Timer], None] | None = None, + ): + """ + Construct a new timer object of the given ``id``. ``id`` of -1 constructs a + virtual timer (if supported by a board). + ``id`` shall not be passed as a keyword argument. + + See ``init`` for parameters of initialisation. + """ + +class UART: + """ + UART implements the standard UART/USART duplex serial communications protocol. At + the physical level it consists of 2 lines: RX and TX. The unit of communication + is a character (not to be confused with a string character) which can be 8 or 9 + bits wide. + + UART objects can be created and initialised using:: + + from machine import UART + + uart = UART(1, 9600) # init with given baudrate + uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters + + Supported parameters differ on a board: + + Pyboard: Bits can be 7, 8 or 9. Stop can be 1 or 2. With *parity=None*, + only 8 and 9 bits are supported. With parity enabled, only 7 and 8 bits + are supported. + + WiPy/CC3200: Bits can be 5, 6, 7, 8. Stop can be 1 or 2. + + A UART object acts like a `stream` object and reading and writing is done + using the standard stream methods:: + + uart.read(10) # read 10 characters, returns a bytes object + uart.read() # read all available characters + uart.readline() # read a line + uart.readinto(buf) # read and store into the given buffer + uart.write('abc') # write the 3 characters + """ + + INV_TX: Final[int] = 1 + RTS: Final[int] = 2 + INV_RX: Final[int] = 2 + IRQ_TXIDLE: Final[int] = 32 + IRQ_BREAK: Final[int] = 512 + IRQ_RXIDLE: Final[int] = 64 + CTS: Final[int] = 1 + IRQ_RX: Incomplete + IDLE: int = ... + def irq( + self, + handler: Callable[[UART], None] | None = None, + trigger: int = 0, + hard: bool = False, + /, + ) -> _IRQ: + """ + Configure an interrupt handler to be called when a UART event occurs. + + The arguments are: + + - *handler* is an optional function to be called when the interrupt event + triggers. The handler must take exactly one argument which is the + ``UART`` instance. + + - *trigger* configures the event(s) which can generate an interrupt. + Possible values are a mask of one or more of the following: + + - ``UART.IRQ_RXIDLE`` interrupt after receiving at least one character + and then the RX line goes idle. + - ``UART.IRQ_RX`` interrupt after each received character. + - ``UART.IRQ_TXIDLE`` interrupt after or while the last character(s) of + a message are or have been sent. + - ``UART.IRQ_BREAK`` interrupt when a break state is detected at RX + + - *hard* if true a hardware interrupt is used. This reduces the delay + between the pin change and the handler being called. Hard interrupt + handlers may not allocate memory; see :ref:`isr_rules`. + + Returns an irq object. + + Due to limitations of the hardware not all trigger events are available on all ports. + """ + ... + + def sendbreak(self) -> None: + """ + Send a break condition on the bus. This drives the bus low for a duration + longer than required for a normal transmission of a character. + """ + ... + + def deinit(self) -> None: + """ + Turn off the UART bus. + + .. note:: + You will not be able to call ``init()`` on the object after ``deinit()``. + A new instance needs to be created in that case. + """ + ... + + @overload + def init( + self, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + tx: PinLike | None = None, + rx: PinLike | None = None, + txbuf: int | None = None, + rxbuf: int | None = None, + timeout: int | None = None, + timeout_char: int | None = None, + invert: int | None = None, + ) -> None: + """ + Initialise the UART bus with the given parameters: + + - *baudrate* is the clock rate. + - *bits* is the number of bits per character, 7, 8 or 9. + - *parity* is the parity, ``None``, 0 (even) or 1 (odd). + - *stop* is the number of stop bits, 1 or 2. + + Additional keyword-only parameters that may be supported by a port are: + + - *tx* specifies the TX pin to use. + - *rx* specifies the RX pin to use. + - *rts* specifies the RTS (output) pin to use for hardware receive flow control. + - *cts* specifies the CTS (input) pin to use for hardware transmit flow control. + - *txbuf* specifies the length in characters of the TX buffer. + - *rxbuf* specifies the length in characters of the RX buffer. + - *timeout* specifies the time to wait for the first character (in ms). + - *timeout_char* specifies the time to wait between characters (in ms). + - *invert* specifies which lines to invert. + + - ``0`` will not invert lines (idle state of both lines is logic high). + - ``UART.INV_TX`` will invert TX line (idle state of TX line now logic low). + - ``UART.INV_RX`` will invert RX line (idle state of RX line now logic low). + - ``UART.INV_TX | UART.INV_RX`` will invert both lines (idle state at logic low). + + - *flow* specifies which hardware flow control signals to use. The value + is a bitmask. + + - ``0`` will ignore hardware flow control signals. + - ``UART.RTS`` will enable receive flow control by using the RTS output pin to + signal if the receive FIFO has sufficient space to accept more data. + - ``UART.CTS`` will enable transmit flow control by pausing transmission when the + CTS input pin signals that the receiver is running low on buffer space. + - ``UART.RTS | UART.CTS`` will enable both, for full hardware flow control. + + On the WiPy only the following keyword-only parameter is supported: + + - *pins* is a 4 or 2 item list indicating the TX, RX, RTS and CTS pins (in that order). + Any of the pins can be None if one wants the UART to operate with limited functionality. + If the RTS pin is given the RX pin must be given as well. The same applies to CTS. + When no pins are given, then the default set of TX and RX pins is taken, and hardware + flow control will be disabled. If *pins* is ``None``, no pin assignment will be made. + + .. note:: + It is possible to call ``init()`` multiple times on the same object in + order to reconfigure UART on the fly. That allows using single UART + peripheral to serve different devices attached to different GPIO pins. + Only one device can be served at a time in that case. + Also do not call ``deinit()`` as it will prevent calling ``init()`` + again. + """ + + @overload + def init( + self, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + pins: tuple[PinLike, PinLike] | None = None, + ) -> None: + """ + Initialise the UART bus with the given parameters: + + - *baudrate* is the clock rate. + - *bits* is the number of bits per character, 7, 8 or 9. + - *parity* is the parity, ``None``, 0 (even) or 1 (odd). + - *stop* is the number of stop bits, 1 or 2. + + Additional keyword-only parameters that may be supported by a port are: + + - *tx* specifies the TX pin to use. + - *rx* specifies the RX pin to use. + - *rts* specifies the RTS (output) pin to use for hardware receive flow control. + - *cts* specifies the CTS (input) pin to use for hardware transmit flow control. + - *txbuf* specifies the length in characters of the TX buffer. + - *rxbuf* specifies the length in characters of the RX buffer. + - *timeout* specifies the time to wait for the first character (in ms). + - *timeout_char* specifies the time to wait between characters (in ms). + - *invert* specifies which lines to invert. + + - ``0`` will not invert lines (idle state of both lines is logic high). + - ``UART.INV_TX`` will invert TX line (idle state of TX line now logic low). + - ``UART.INV_RX`` will invert RX line (idle state of RX line now logic low). + - ``UART.INV_TX | UART.INV_RX`` will invert both lines (idle state at logic low). + + - *flow* specifies which hardware flow control signals to use. The value + is a bitmask. + + - ``0`` will ignore hardware flow control signals. + - ``UART.RTS`` will enable receive flow control by using the RTS output pin to + signal if the receive FIFO has sufficient space to accept more data. + - ``UART.CTS`` will enable transmit flow control by pausing transmission when the + CTS input pin signals that the receiver is running low on buffer space. + - ``UART.RTS | UART.CTS`` will enable both, for full hardware flow control. + + On the WiPy only the following keyword-only parameter is supported: + + - *pins* is a 4 or 2 item list indicating the TX, RX, RTS and CTS pins (in that order). + Any of the pins can be None if one wants the UART to operate with limited functionality. + If the RTS pin is given the RX pin must be given as well. The same applies to CTS. + When no pins are given, then the default set of TX and RX pins is taken, and hardware + flow control will be disabled. If *pins* is ``None``, no pin assignment will be made. + + .. note:: + It is possible to call ``init()`` multiple times on the same object in + order to reconfigure UART on the fly. That allows using single UART + peripheral to serve different devices attached to different GPIO pins. + Only one device can be served at a time in that case. + Also do not call ``deinit()`` as it will prevent calling ``init()`` + again. + """ + + @overload + def init( + self, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + pins: tuple[PinLike, PinLike, PinLike, PinLike] | None = None, + ) -> None: + """ + Initialise the UART bus with the given parameters: + + - *baudrate* is the clock rate. + - *bits* is the number of bits per character, 7, 8 or 9. + - *parity* is the parity, ``None``, 0 (even) or 1 (odd). + - *stop* is the number of stop bits, 1 or 2. + + Additional keyword-only parameters that may be supported by a port are: + + - *tx* specifies the TX pin to use. + - *rx* specifies the RX pin to use. + - *rts* specifies the RTS (output) pin to use for hardware receive flow control. + - *cts* specifies the CTS (input) pin to use for hardware transmit flow control. + - *txbuf* specifies the length in characters of the TX buffer. + - *rxbuf* specifies the length in characters of the RX buffer. + - *timeout* specifies the time to wait for the first character (in ms). + - *timeout_char* specifies the time to wait between characters (in ms). + - *invert* specifies which lines to invert. + + - ``0`` will not invert lines (idle state of both lines is logic high). + - ``UART.INV_TX`` will invert TX line (idle state of TX line now logic low). + - ``UART.INV_RX`` will invert RX line (idle state of RX line now logic low). + - ``UART.INV_TX | UART.INV_RX`` will invert both lines (idle state at logic low). + + - *flow* specifies which hardware flow control signals to use. The value + is a bitmask. + + - ``0`` will ignore hardware flow control signals. + - ``UART.RTS`` will enable receive flow control by using the RTS output pin to + signal if the receive FIFO has sufficient space to accept more data. + - ``UART.CTS`` will enable transmit flow control by pausing transmission when the + CTS input pin signals that the receiver is running low on buffer space. + - ``UART.RTS | UART.CTS`` will enable both, for full hardware flow control. + + On the WiPy only the following keyword-only parameter is supported: + + - *pins* is a 4 or 2 item list indicating the TX, RX, RTS and CTS pins (in that order). + Any of the pins can be None if one wants the UART to operate with limited functionality. + If the RTS pin is given the RX pin must be given as well. The same applies to CTS. + When no pins are given, then the default set of TX and RX pins is taken, and hardware + flow control will be disabled. If *pins* is ``None``, no pin assignment will be made. + + .. note:: + It is possible to call ``init()`` multiple times on the same object in + order to reconfigure UART on the fly. That allows using single UART + peripheral to serve different devices attached to different GPIO pins. + Only one device can be served at a time in that case. + Also do not call ``deinit()`` as it will prevent calling ``init()`` + again. + """ + + def flush(self) -> Incomplete: + """ + Waits until all data has been sent. In case of a timeout, an exception is raised. The timeout + duration depends on the tx buffer size and the baud rate. Unless flow control is enabled, a timeout + should not occur. + + .. note:: + + For the esp8266 and nrf ports the call returns while the last byte is sent. + If required, a one character wait time has to be added in the calling script. + + Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, renesas-ra + """ + ... + + def txdone(self) -> bool: + """ + Tells whether all data has been sent or no data transfer is happening. In this case, + it returns ``True``. If a data transmission is ongoing it returns ``False``. + + .. note:: + + For the esp8266 and nrf ports the call may return ``True`` even if the last byte + of a transfer is still being sent. If required, a one character wait time has to be + added in the calling script. + + Availability: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ports, renesas-ra + """ + ... + + @overload + def read(self) -> bytes | None: + """ + Read characters. If ``nbytes`` is specified then read at most that many bytes, + otherwise read as much data as possible. It may return sooner if a timeout + is reached. The timeout is configurable in the constructor. + + Return value: a bytes object containing the bytes read in. Returns ``None`` + on timeout. + """ + + @overload + def read(self, nbytes: int, /) -> bytes | None: + """ + Read characters. If ``nbytes`` is specified then read at most that many bytes, + otherwise read as much data as possible. It may return sooner if a timeout + is reached. The timeout is configurable in the constructor. + + Return value: a bytes object containing the bytes read in. Returns ``None`` + on timeout. + """ + + def any(self) -> int: + """ + Returns an integer counting the number of characters that can be read without + blocking. It will return 0 if there are no characters available and a positive + number if there are characters. The method may return 1 even if there is more + than one character available for reading. + + For more sophisticated querying of available characters use select.poll:: + + poll = select.poll() + poll.register(uart, select.POLLIN) + poll.poll(timeout) + """ + ... + + def write(self, buf: AnyReadableBuf, /) -> Union[int, None]: + """ + Write the buffer of bytes to the bus. + + Return value: number of bytes written or ``None`` on timeout. + """ + ... + + @overload + def readinto(self, buf: AnyWritableBuf, /) -> int | None: + """ + Read bytes into the ``buf``. If ``nbytes`` is specified then read at most + that many bytes. Otherwise, read at most ``len(buf)`` bytes. It may return sooner if a timeout + is reached. The timeout is configurable in the constructor. + + Return value: number of bytes read and stored into ``buf`` or ``None`` on + timeout. + """ + + @overload + def readinto(self, buf: AnyWritableBuf, nbytes: int, /) -> int | None: + """ + Read bytes into the ``buf``. If ``nbytes`` is specified then read at most + that many bytes. Otherwise, read at most ``len(buf)`` bytes. It may return sooner if a timeout + is reached. The timeout is configurable in the constructor. + + Return value: number of bytes read and stored into ``buf`` or ``None`` on + timeout. + """ + + def readline(self) -> Union[str, None]: + """ + Read a line, ending in a newline character. It may return sooner if a timeout + is reached. The timeout is configurable in the constructor. + + Return value: the line read or ``None`` on timeout. + """ + ... + + @overload + def __init__( + self, + id: ID_T, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + tx: PinLike | None = None, + rx: PinLike | None = None, + txbuf: int | None = None, + rxbuf: int | None = None, + timeout: int | None = None, + timeout_char: int | None = None, + invert: int | None = None, + ): + """ + Construct a UART object of the given id. + """ + + @overload + def __init__( + self, + id: ID_T, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + pins: tuple[PinLike, PinLike] | None = None, + ): + """ + Construct a UART object of the given id from a tuple of two pins. + """ + + @overload + def __init__( + self, + id: ID_T, + /, + baudrate: int = 9600, + bits: int = 8, + parity: int | None = None, + stop: int = 1, + *, + pins: tuple[PinLike, PinLike, PinLike, PinLike] | None = None, + ): + """ + Construct a UART object of the given id from a tuple of four pins. + """ + +class USBDevice: + """ + Construct a USBDevice object. + + ``Note:`` This object is a singleton, each call to this constructor + returns the same object reference. + """ + + BUILTIN_NONE: Incomplete + BUILTIN_DEFAULT: Incomplete + BUILTIN_CDC: Incomplete + BUILTIN_MSC: Incomplete + BUILTIN_CDC_MSC: int + def submit_xfer(self, ep, buffer, /) -> bool: + """ + Submit a USB transfer on endpoint number ``ep``. ``buffer`` must be + an object implementing the buffer interface, with read access for + ``IN`` endpoints and write access for ``OUT`` endpoints. + + ``Note:`` ``ep`` cannot be the control Endpoint number 0. Control + transfers are built up through successive executions of + ``control_xfer_cb``, see above. + + Returns ``True`` if successful, ``False`` if the transfer could not + be queued (as USB device is not configured by host, or because + another transfer is queued on this endpoint.) + + When the USB host completes the transfer, the ``xfer_cb`` callback + is called (see above). + + Raises ``OSError`` with reason ``MP_EINVAL`` If the USB device is not + active. + """ + ... + + def config( + self, + desc_dev, + desc_cfg, + desc_strs=None, + open_itf_cb=None, + reset_cb=None, + control_xfer_cb=None, + xfer_cb=None, + ) -> None: + """ + Configures the ``USBDevice`` singleton object with the USB runtime device + state and callback functions: + + - ``desc_dev`` - A bytes-like object containing + the new USB device descriptor. + + - ``desc_cfg`` - A bytes-like object containing the + new USB configuration descriptor. + + - ``desc_strs`` - Optional object holding strings or bytes objects + containing USB string descriptor values. Can be a list, a dict, or any + object which supports subscript indexing with integer keys (USB string + descriptor index). + + Strings are an optional USB feature, and this parameter can be unset + (default) if no strings are referenced in the device and configuration + descriptors, or if only built-in strings should be used. + + Apart from index 0, all the string values should be plain ASCII. Index 0 + is the special "languages" USB descriptor, represented as a bytes object + with a custom format defined in the USB standard. ``None`` can be + returned at index 0 in order to use a default "English" language + descriptor. + + To fall back to providing a built-in string value for a given index, a + subscript lookup can return ``None``, raise ``KeyError``, or raise + ``IndexError``. + + - ``open_itf_cb`` - This callback is called once for each interface + or Interface Association Descriptor in response to a Set + Configuration request from the USB Host (the final stage before + the USB device is available to the host). + + The callback takes a single argument, which is a memoryview of the + interface or IAD descriptor that the host is accepting (including + all associated descriptors). It is a view into the same + ``desc_cfg`` object that was provided as a separate + argument to this function. The memoryview is only valid until the + callback function returns. + + - ``reset_cb`` - This callback is called when the USB host performs + a bus reset. The callback takes no arguments. Any in-progress + transfers will never complete. The USB host will most likely + proceed to re-enumerate the USB device by calling the descriptor + callbacks and then ``open_itf_cb()``. + + - ``control_xfer_cb`` - This callback is called one or more times + for each USB control transfer (device Endpoint 0). It takes two + arguments. + + The first argument is the control transfer stage. It is one of: + + - ``1`` for SETUP stage. + - ``2`` for DATA stage. + - ``3`` for ACK stage. + + Second argument is a memoryview to read the USB control request + data for this stage. The memoryview is only valid until the + callback function returns. Data in this memoryview will be the same + across each of the three stages of a single transfer. + + A successful transfer consists of this callback being called in sequence + for the three stages. Generally speaking, if a device wants to do + something in response to a control request then it's best to wait until + the ACK stage to confirm the host controller completed the transfer as + expected. + + The callback should return one of the following values: + + - ``False`` to stall the endpoint and reject the transfer. It won't + proceed to any remaining stages. + - ``True`` to continue the transfer to the next stage. + - A buffer object can be returned at the SETUP stage when the transfer + will send or receive additional data. Typically this is the case when + the ``wLength`` field in the request has a non-zero value. This should + be a writable buffer for an ``OUT`` direction transfer, or a readable + buffer with data for an ``IN`` direction transfer. + + - ``xfer_cb`` - This callback is called whenever a non-control + transfer submitted by calling :func:`USBDevice.submit_xfer` completes. + + The callback has three arguments: + + 1. The Endpoint number for the completed transfer. + 2. Result value: ``True`` if the transfer succeeded, ``False`` + otherwise. + 3. Number of bytes successfully transferred. In the case of a + "short" transfer, The result is ``True`` and ``xferred_bytes`` + will be smaller than the length of the buffer submitted for the + transfer. + + ``Note:`` If a bus reset occurs (see :func:`USBDevice.reset`), + ``xfer_cb`` is not called for any transfers that have not + already completed. + """ + ... + + def remote_wakeup(self) -> bool: + """ + Wake up host if we are in suspend mode and the REMOTE_WAKEUP feature + is enabled by the host. This has to be enabled in the USB attributes, + and on the host. Returns ``True`` if remote wakeup was enabled and + active and the host was woken up. + """ + ... + + def stall(self, ep, stall: bool | None = None, /) -> bool: + """ + Calling this function gets or sets the STALL state of a device endpoint. + + ``ep`` is the number of the endpoint. + + If the optional ``stall`` parameter is set, this is a boolean flag + for the STALL state. + + The return value is the current stall state of the endpoint (before + any change made by this function). + + An endpoint that is set to STALL may remain stalled until this + function is called again, or STALL may be cleared automatically by + the USB host. + + Raises ``OSError`` with reason ``MP_EINVAL`` If the USB device is not + active. + """ + ... + + def active(self, value: Any | None = None, /) -> bool: + """ + Returns the current active state of this runtime USB device as a + boolean. The runtime USB device is "active" when it is available to + interact with the host, it doesn't mean that a USB Host is actually + present. + + If the optional ``value`` argument is set to a truthy value, then + the USB device will be activated. + + If the optional ``value`` argument is set to a falsey value, then + the USB device is deactivated. While the USB device is deactivated, + it will not be detected by the USB Host. + + To simulate a disconnect and a reconnect of the USB device, call + ``active(False)`` followed by ``active(True)``. This may be + necessary if the runtime device configuration has changed, so that + the host sees the new device. + """ + ... + + class BUILTIN_CDC: + ep_max: int = 3 + itf_max: int = 2 + str_max: int = 5 + desc_dev: bytes = b"\x12\x01\x00\x02\xef\x02\x01@\x8a.\x05\x00\x00\x01\x01\x02\x03\x01" + desc_cfg: bytes = ( + b"\t\x02K\x00\x02\x01\x00\x80}\x08\x0b\x00\x02\x02\x02\x00\x00\t\x04\x00\x00\x01\x02\x02\x00\x04\x05$\x00 \x01\x05$\x01\x00\x01\x04$\x02\x06\x05$\x06\x00\x01\x07\x05\x81\x03\x08\x00\x10\t\x04\x01\x00\x02\n\x00\x00\x00\x07\x05\x02\x02@\x00\x00\x07\x05\x82\x02@\x00\x00" + ) + def __init__(self, *argv, **kwargs) -> None: ... + + class BUILTIN_NONE: + ep_max: int = 0 + itf_max: int = 0 + str_max: int = 1 + desc_dev: bytes = b"\x12\x01\x00\x02\xef\x02\x01@\x8a.\x05\x00\x00\x01\x01\x02\x03\x01" + desc_cfg: bytes = b"" + def __init__(self, *argv, **kwargs) -> None: ... + + class BUILTIN_DEFAULT: + ep_max: int = 3 + itf_max: int = 2 + str_max: int = 5 + desc_dev: bytes = b"\x12\x01\x00\x02\xef\x02\x01@\x8a.\x05\x00\x00\x01\x01\x02\x03\x01" + desc_cfg: bytes = ( + b"\t\x02K\x00\x02\x01\x00\x80}\x08\x0b\x00\x02\x02\x02\x00\x00\t\x04\x00\x00\x01\x02\x02\x00\x04\x05$\x00 \x01\x05$\x01\x00\x01\x04$\x02\x06\x05$\x06\x00\x01\x07\x05\x81\x03\x08\x00\x10\t\x04\x01\x00\x02\n\x00\x00\x00\x07\x05\x02\x02@\x00\x00\x07\x05\x82\x02@\x00\x00" + ) + def __init__(self, *argv, **kwargs) -> None: ... + + def __init__(self) -> None: ... + +class Pin: + """ + A pin object is used to control I/O pins (also known as GPIO - general-purpose + input/output). Pin objects are commonly associated with a physical pin that can + drive an output voltage and read input voltages. The pin class has methods to set the mode of + the pin (IN, OUT, etc) and methods to get and set the digital logic level. + For analog control of a pin, see the :class:`ADC` class. + + A pin object is constructed by using an identifier which unambiguously + specifies a certain I/O pin. The allowed forms of the identifier and the + physical pin that the identifier maps to are port-specific. Possibilities + for the identifier are an integer, a string or a tuple with port and pin + number. + + Usage Model:: + + from machine import Pin + + # create an output pin on pin #0 + p0 = Pin(0, Pin.OUT) + + # set the value low then high + p0.value(0) + p0.value(1) + + # create an input pin on pin #2, with a pull up resistor + p2 = Pin(2, Pin.IN, Pin.PULL_UP) + + # read and print the pin value + print(p2.value()) + + # reconfigure pin #0 in input mode with a pull down resistor + p0.init(p0.IN, p0.PULL_DOWN) + + # configure an irq callback + p0.irq(lambda p:print(p)) + """ + + ALT_SPI: Final[int] = 1 + IN: Final[int] = 0 + ALT_USB: Final[int] = 9 + ALT_UART: Final[int] = 2 + IRQ_FALLING: Final[int] = 4 + OUT: Final[int] = 1 + OPEN_DRAIN: Final[int] = 2 + IRQ_RISING: Final[int] = 8 + PULL_DOWN: Final[int] = 2 + ALT_SIO: Final[int] = 5 + ALT_GPCK: Final[int] = 8 + ALT: Final[int] = 3 + PULL_UP: Final[int] = 1 + ALT_I2C: Final[int] = 3 + ALT_PWM: Final[int] = 4 + ALT_PIO1: Final[int] = 7 + ALT_PIO0: Final[int] = 6 + ALT_OPEN_DRAIN: Incomplete + ANALOG: Incomplete + PULL_HOLD: Incomplete + DRIVE_0: int + DRIVE_1: int + DRIVE_2: int + IRQ_LOW_LEVEL: Incomplete + IRQ_HIGH_LEVEL: Incomplete + def low(self) -> None: + """ + Set pin to "0" output level. + + Availability: mimxrt, nrf, renesas-ra, rp2, samd, stm32 ports. + """ + ... + + def irq( + self, + /, + handler: Callable[[Pin], None] | None = None, + trigger: int = (IRQ_FALLING | IRQ_RISING), + *, + priority: int = 1, + wake: int | None = None, + hard: bool = False, + ) -> Callable[..., Incomplete]: + """ + Configure an interrupt handler to be called when the trigger source of the + pin is active. If the pin mode is ``Pin.IN`` then the trigger source is + the external value on the pin. If the pin mode is ``Pin.OUT`` then the + trigger source is the output buffer of the pin. Otherwise, if the pin mode + is ``Pin.OPEN_DRAIN`` then the trigger source is the output buffer for + state '0' and the external pin value for state '1'. + + The arguments are: + + - ``handler`` is an optional function to be called when the interrupt + triggers. The handler must take exactly one argument which is the + ``Pin`` instance. + + - ``trigger`` configures the event which can generate an interrupt. + Possible values are: + + - ``Pin.IRQ_FALLING`` interrupt on falling edge. + - ``Pin.IRQ_RISING`` interrupt on rising edge. + - ``Pin.IRQ_LOW_LEVEL`` interrupt on low level. + - ``Pin.IRQ_HIGH_LEVEL`` interrupt on high level. + + These values can be OR'ed together to trigger on multiple events. + + - ``priority`` sets the priority level of the interrupt. The values it + can take are port-specific, but higher values always represent higher + priorities. + + - ``wake`` selects the power mode in which this interrupt can wake up the + system. It can be ``machine.IDLE``, ``machine.SLEEP`` or ``machine.DEEPSLEEP``. + These values can also be OR'ed together to make a pin generate interrupts in + more than one power mode. + + - ``hard`` if true a hardware interrupt is used. This reduces the delay + between the pin change and the handler being called. Hard interrupt + handlers may not allocate memory; see :ref:`isr_rules`. + Not all ports support this argument. + + This method returns a callback object. + + The following methods are not part of the core Pin API and only implemented on certain ports. + """ + ... + + def toggle(self) -> Incomplete: + """ + Toggle output pin from "0" to "1" or vice-versa. + + Availability: cc3200, esp32, esp8266, mimxrt, rp2, samd ports. + """ + ... + + def off(self) -> None: + """ + Set pin to "0" output level. + """ + ... + + def on(self) -> None: + """ + Set pin to "1" output level. + """ + ... + + def init( + self, + mode: int = -1, + pull: int = -1, + *, + value: Any = None, + drive: int | None = None, + alt: int | None = None, + ) -> None: + """ + Re-initialise the pin using the given parameters. Only those arguments that + are specified will be set. The rest of the pin peripheral state will remain + unchanged. See the constructor documentation for details of the arguments. + + Returns ``None``. + """ + ... + + @overload + def value(self) -> int: + """ + This method allows to set and get the value of the pin, depending on whether + the argument ``x`` is supplied or not. + + If the argument is omitted then this method gets the digital logic level of + the pin, returning 0 or 1 corresponding to low and high voltage signals + respectively. The behaviour of this method depends on the mode of the pin: + + - ``Pin.IN`` - The method returns the actual input value currently present + on the pin. + - ``Pin.OUT`` - The behaviour and return value of the method is undefined. + - ``Pin.OPEN_DRAIN`` - If the pin is in state '0' then the behaviour and + return value of the method is undefined. Otherwise, if the pin is in + state '1', the method returns the actual input value currently present + on the pin. + + If the argument is supplied then this method sets the digital logic level of + the pin. The argument ``x`` can be anything that converts to a boolean. + If it converts to ``True``, the pin is set to state '1', otherwise it is set + to state '0'. The behaviour of this method depends on the mode of the pin: + + - ``Pin.IN`` - The value is stored in the output buffer for the pin. The + pin state does not change, it remains in the high-impedance state. The + stored value will become active on the pin as soon as it is changed to + ``Pin.OUT`` or ``Pin.OPEN_DRAIN`` mode. + - ``Pin.OUT`` - The output buffer is set to the given value immediately. + - ``Pin.OPEN_DRAIN`` - If the value is '0' the pin is set to a low voltage + state. Otherwise the pin is set to high-impedance state. + + When setting the value this method returns ``None``. + """ + + @overload + def value(self, x: Any, /) -> None: + """ + This method allows to set and get the value of the pin, depending on whether + the argument ``x`` is supplied or not. + + If the argument is omitted then this method gets the digital logic level of + the pin, returning 0 or 1 corresponding to low and high voltage signals + respectively. The behaviour of this method depends on the mode of the pin: + + - ``Pin.IN`` - The method returns the actual input value currently present + on the pin. + - ``Pin.OUT`` - The behaviour and return value of the method is undefined. + - ``Pin.OPEN_DRAIN`` - If the pin is in state '0' then the behaviour and + return value of the method is undefined. Otherwise, if the pin is in + state '1', the method returns the actual input value currently present + on the pin. + + If the argument is supplied then this method sets the digital logic level of + the pin. The argument ``x`` can be anything that converts to a boolean. + If it converts to ``True``, the pin is set to state '1', otherwise it is set + to state '0'. The behaviour of this method depends on the mode of the pin: + + - ``Pin.IN`` - The value is stored in the output buffer for the pin. The + pin state does not change, it remains in the high-impedance state. The + stored value will become active on the pin as soon as it is changed to + ``Pin.OUT`` or ``Pin.OPEN_DRAIN`` mode. + - ``Pin.OUT`` - The output buffer is set to the given value immediately. + - ``Pin.OPEN_DRAIN`` - If the value is '0' the pin is set to a low voltage + state. Otherwise the pin is set to high-impedance state. + + When setting the value this method returns ``None``. + """ + + def high(self) -> None: + """ + Set pin to "1" output level. + + Availability: mimxrt, nrf, renesas-ra, rp2, samd, stm32 ports. + """ + ... + + class cpu: + GPIO26: Pin ## = Pin(GPIO26, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO25: Pin ## = Pin(GPIO25, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO27: Pin ## = Pin(GPIO27, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO28: Pin ## = Pin(GPIO28, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO22: Pin ## = Pin(GPIO22, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO24: Pin ## = Pin(GPIO24, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO23: Pin ## = Pin(GPIO23, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO9: Pin ## = Pin(GPIO9, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO7: Pin ## = Pin(GPIO7, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO6: Pin ## = Pin(GPIO6, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO8: Pin ## = Pin(GPIO8, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO29: Pin ## = Pin(GPIO29, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO3: Pin ## = Pin(GPIO3, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO5: Pin ## = Pin(GPIO5, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO4: Pin ## = Pin(GPIO4, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO12: Pin ## = Pin(GPIO12, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO11: Pin ## = Pin(GPIO11, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO13: Pin ## = Pin(GPIO13, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO14: Pin ## = Pin(GPIO14, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO0: Pin ## = Pin(GPIO0, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO10: Pin ## = Pin(GPIO10, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO1: Pin ## = Pin(GPIO1, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO21: Pin ## = Pin(GPIO21, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO2: Pin ## = Pin(GPIO2, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO19: Pin ## = Pin(GPIO19, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO20: Pin ## = Pin(GPIO20, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO15: Pin ## = Pin(GPIO15, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO16: Pin ## = Pin(GPIO16, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO18: Pin ## = Pin(GPIO18, mode=ALT, pull=PULL_DOWN, alt=31) + GPIO17: Pin ## = Pin(GPIO17, mode=ALT, pull=PULL_DOWN, alt=31) + def __init__(self, *argv, **kwargs) -> None: ... + + class board: + GP27: Pin ## = Pin(GPIO27, mode=ALT, pull=PULL_DOWN, alt=31) + GP26: Pin ## = Pin(GPIO26, mode=ALT, pull=PULL_DOWN, alt=31) + GP28: Pin ## = Pin(GPIO28, mode=ALT, pull=PULL_DOWN, alt=31) + LED: Pin ## = Pin(GPIO25, mode=ALT, pull=PULL_DOWN, alt=31) + GP21: Pin ## = Pin(GPIO21, mode=ALT, pull=PULL_DOWN, alt=31) + GP25: Pin ## = Pin(GPIO25, mode=ALT, pull=PULL_DOWN, alt=31) + GP22: Pin ## = Pin(GPIO22, mode=ALT, pull=PULL_DOWN, alt=31) + GP8: Pin ## = Pin(GPIO8, mode=ALT, pull=PULL_DOWN, alt=31) + GP7: Pin ## = Pin(GPIO7, mode=ALT, pull=PULL_DOWN, alt=31) + GP9: Pin ## = Pin(GPIO9, mode=ALT, pull=PULL_DOWN, alt=31) + GP3: Pin ## = Pin(GPIO3, mode=ALT, pull=PULL_DOWN, alt=31) + GP4: Pin ## = Pin(GPIO4, mode=ALT, pull=PULL_DOWN, alt=31) + GP6: Pin ## = Pin(GPIO6, mode=ALT, pull=PULL_DOWN, alt=31) + GP5: Pin ## = Pin(GPIO5, mode=ALT, pull=PULL_DOWN, alt=31) + GP12: Pin ## = Pin(GPIO12, mode=ALT, pull=PULL_DOWN, alt=31) + GP11: Pin ## = Pin(GPIO11, mode=ALT, pull=PULL_DOWN, alt=31) + GP13: Pin ## = Pin(GPIO13, mode=ALT, pull=PULL_DOWN, alt=31) + GP20: Pin ## = Pin(GPIO20, mode=ALT, pull=PULL_DOWN, alt=31) + GP0: Pin ## = Pin(GPIO0, mode=ALT, pull=PULL_DOWN, alt=31) + GP10: Pin ## = Pin(GPIO10, mode=ALT, pull=PULL_DOWN, alt=31) + GP1: Pin ## = Pin(GPIO1, mode=ALT, pull=PULL_DOWN, alt=31) + GP19: Pin ## = Pin(GPIO19, mode=ALT, pull=PULL_DOWN, alt=31) + GP18: Pin ## = Pin(GPIO18, mode=ALT, pull=PULL_DOWN, alt=31) + GP2: Pin ## = Pin(GPIO2, mode=ALT, pull=PULL_DOWN, alt=31) + GP14: Pin ## = Pin(GPIO14, mode=ALT, pull=PULL_DOWN, alt=31) + GP15: Pin ## = Pin(GPIO15, mode=ALT, pull=PULL_DOWN, alt=31) + GP17: Pin ## = Pin(GPIO17, mode=ALT, pull=PULL_DOWN, alt=31) + GP16: Pin ## = Pin(GPIO16, mode=ALT, pull=PULL_DOWN, alt=31) + def __init__(self, *argv, **kwargs) -> None: ... + + def __init__( + self, + id: Any, + /, + mode: int = -1, + pull: int = -1, + *, + value: Any = None, + drive: int | None = None, + alt: int | None = None, + ) -> None: + """ + Access the pin peripheral (GPIO pin) associated with the given ``id``. If + additional arguments are given in the constructor then they are used to initialise + the pin. Any settings that are not specified will remain in their previous state. + + The arguments are: + + - ``id`` is mandatory and can be an arbitrary object. Among possible value + types are: int (an internal Pin identifier), str (a Pin name), and tuple + (pair of [port, pin]). + + - ``mode`` specifies the pin mode, which can be one of: + + - ``Pin.IN`` - Pin is configured for input. If viewed as an output the pin + is in high-impedance state. + + - ``Pin.OUT`` - Pin is configured for (normal) output. + + - ``Pin.OPEN_DRAIN`` - Pin is configured for open-drain output. Open-drain + output works in the following way: if the output value is set to 0 the pin + is active at a low level; if the output value is 1 the pin is in a high-impedance + state. Not all ports implement this mode, or some might only on certain pins. + + - ``Pin.ALT`` - Pin is configured to perform an alternative function, which is + port specific. For a pin configured in such a way any other Pin methods + (except :meth:`Pin.init`) are not applicable (calling them will lead to undefined, + or a hardware-specific, result). Not all ports implement this mode. + + - ``Pin.ALT_OPEN_DRAIN`` - The Same as ``Pin.ALT``, but the pin is configured as + open-drain. Not all ports implement this mode. + + - ``Pin.ANALOG`` - Pin is configured for analog input, see the :class:`ADC` class. + + - ``pull`` specifies if the pin has a (weak) pull resistor attached, and can be + one of: + + - ``None`` - No pull up or down resistor. + - ``Pin.PULL_UP`` - Pull up resistor enabled. + - ``Pin.PULL_DOWN`` - Pull down resistor enabled. + + - ``value`` is valid only for Pin.OUT and Pin.OPEN_DRAIN modes and specifies initial + output pin value if given, otherwise the state of the pin peripheral remains + unchanged. + + - ``drive`` specifies the output power of the pin and can be one of: ``Pin.LOW_POWER``, + ``Pin.MED_POWER`` or ``Pin.HIGH_POWER``. The actual current driving capabilities + are port dependent. Not all ports implement this argument. + + - ``alt`` specifies an alternate function for the pin and the values it can take are + port dependent. This argument is valid only for ``Pin.ALT`` and ``Pin.ALT_OPEN_DRAIN`` + modes. It may be used when a pin supports more than one alternate function. If only + one pin alternate function is supported the this argument is not required. Not all + ports implement this argument. + + As specified above, the Pin class allows to set an alternate function for a particular + pin, but it does not specify any further operations on such a pin. Pins configured in + alternate-function mode are usually not used as GPIO but are instead driven by other + hardware peripherals. The only operation supported on such a pin is re-initialising, + by calling the constructor or :meth:`Pin.init` method. If a pin that is configured in + alternate-function mode is re-initialised with ``Pin.IN``, ``Pin.OUT``, or + ``Pin.OPEN_DRAIN``, the alternate function will be removed from the pin. + """ + + @overload + def __call__(self) -> int: + """ + Pin objects are callable. The call method provides a (fast) shortcut to set + and get the value of the pin. It is equivalent to Pin.value([x]). + See :meth:`Pin.value` for more details. + """ + + @overload + def __call__(self, x: Any, /) -> None: + """ + Pin objects are callable. The call method provides a (fast) shortcut to set + and get the value of the pin. It is equivalent to Pin.value([x]). + See :meth:`Pin.value` for more details. + """ + + @overload + def mode(self) -> int: + """ + Get or set the pin mode. + See the constructor documentation for details of the ``mode`` argument. + + Availability: cc3200, stm32 ports. + """ + + @overload + def mode(self, mode: int, /) -> None: + """ + Get or set the pin mode. + See the constructor documentation for details of the ``mode`` argument. + + Availability: cc3200, stm32 ports. + """ + + @overload + def pull(self) -> int: + """ + Get or set the pin pull state. + See the constructor documentation for details of the ``pull`` argument. + + Availability: cc3200, stm32 ports. + """ + + @overload + def pull(self, pull: int, /) -> None: + """ + Get or set the pin pull state. + See the constructor documentation for details of the ``pull`` argument. + + Availability: cc3200, stm32 ports. + """ + + @overload + def drive(self, drive: int, /) -> None: + """ + Get or set the pin drive strength. + See the constructor documentation for details of the ``drive`` argument. + + Availability: cc3200 port. + """ + ... + + @overload + def drive(self, /) -> int: + """ + Get or set the pin drive strength. + See the constructor documentation for details of the ``drive`` argument. + + Availability: cc3200 port. + """ + +class SoftI2C(I2C): + """ + Construct a new software I2C object. The parameters are: + + - *scl* should be a pin object specifying the pin to use for SCL. + - *sda* should be a pin object specifying the pin to use for SDA. + - *freq* should be an integer which sets the maximum frequency + for SCL. + - *timeout* is the maximum time in microseconds to wait for clock + stretching (SCL held low by another device on the bus), after + which an ``OSError(ETIMEDOUT)`` exception is raised. + """ + + def readfrom_mem_into(self, *args, **kwargs) -> Incomplete: ... + def readfrom_into(self, *args, **kwargs) -> Incomplete: ... + def readfrom_mem(self, *args, **kwargs) -> Incomplete: ... + def writeto_mem(self, *args, **kwargs) -> Incomplete: ... + def scan(self, *args, **kwargs) -> Incomplete: ... + def writeto(self, *args, **kwargs) -> Incomplete: ... + def writevto(self, *args, **kwargs) -> Incomplete: ... + def start(self, *args, **kwargs) -> Incomplete: ... + def readfrom(self, *args, **kwargs) -> Incomplete: ... + def readinto(self, *args, **kwargs) -> Incomplete: ... + def init(self, *args, **kwargs) -> Incomplete: ... + def stop(self, *args, **kwargs) -> Incomplete: ... + def write(self, *args, **kwargs) -> Incomplete: ... + def __init__(self, scl, sda, *, freq=400000, timeout=50000) -> None: ... + +class RTC: + """ + The RTC is an independent clock that keeps track of the date + and time. + + Example usage:: + + rtc = machine.RTC() + rtc.datetime((2020, 1, 21, 2, 10, 32, 36, 0)) + print(rtc.datetime()) + + + + The documentation for RTC is in a poor state;1 + """ + + ALARM0: Incomplete + def datetime(self, datetimetuple: Any | None = None) -> Tuple: + """ + Get or set the date and time of the RTC. + + With no arguments, this method returns an 8-tuple with the current + date and time. With 1 argument (being an 8-tuple) it sets the date + and time. + + The 8-tuple has the following format: + + (year, month, day, weekday, hours, minutes, seconds, subseconds) + + The meaning of the ``subseconds`` field is hardware dependent. + """ + ... + + @overload + def __init__(self, id: int = 0): + """ + Create an RTC object. See init for parameters of initialization. + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int, int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int, int, int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def __init__(self, id: int = 0, /, *, datetime: tuple[int, int, int, int, int, int, int, int]): + """ + Create an RTC object. See init for parameters of initialization. + + The documentation for RTC is in a poor state; better to experiment and use `dir`! + """ + + @overload + def init(self) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int, int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int, int, int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def init(self, datetime: tuple[int, int, int, int, int, int, int, int], /) -> None: + """ + Initialise the RTC. Datetime is a tuple of the form: + + ``(year, month, day, hour, minute, second, microsecond, tzinfo)`` + + All eight arguments must be present. The ``microsecond`` and ``tzinfo`` + values are currently ignored but might be used in the future. + + Availability: CC3200, ESP32, MIMXRT, SAMD. The rtc.init() method on + the stm32 and renesas-ra ports just (re-)starts the RTC and does not + accept arguments. + """ + + @overload + def alarm(self, id: int, time: int, /, *, repeat: bool = False) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int, int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int, int, int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + + @overload + def alarm(self, id: int, time: tuple[int, int, int, int, int, int, int, int], /) -> None: + """ + Set the RTC alarm. Time might be either a millisecond value to program the alarm to + current time + time_in_ms in the future, or a datetimetuple. If the time passed is in + milliseconds, repeat can be set to ``True`` to make the alarm periodic. + """ + +class SPI: + """ + SPI is a synchronous serial protocol that is driven by a controller. At the + physical level, a bus consists of 3 lines: SCK, MOSI, MISO. Multiple devices + can share the same bus. Each device should have a separate, 4th signal, + CS (Chip Select), to select a particular device on a bus with which + communication takes place. Management of a CS signal should happen in + user code (via machine.Pin class). + + Both hardware and software SPI implementations exist via the + :ref:`machine.SPI ` and `machine.SoftSPI` classes. Hardware SPI uses underlying + hardware support of the system to perform the reads/writes and is usually + efficient and fast but may have restrictions on which pins can be used. + Software SPI is implemented by bit-banging and can be used on any pin but + is not as efficient. These classes have the same methods available and + differ primarily in the way they are constructed. + + Example usage:: + + from machine import SPI, Pin + + spi = SPI(0, baudrate=400000) # Create SPI peripheral 0 at frequency of 400kHz. + # Depending on the use case, extra parameters may be required + # to select the bus characteristics and/or pins to use. + cs = Pin(4, mode=Pin.OUT, value=1) # Create chip-select on pin 4. + + try: + cs(0) # Select peripheral. + spi.write(b"12345678") # Write 8 bytes, and don't care about received data. + finally: + cs(1) # Deselect peripheral. + + try: + cs(0) # Select peripheral. + rxdata = spi.read(8, 0x42) # Read 8 bytes while writing 0x42 for each byte. + finally: + cs(1) # Deselect peripheral. + + rxdata = bytearray(8) + try: + cs(0) # Select peripheral. + spi.readinto(rxdata, 0x42) # Read 8 bytes inplace while writing 0x42 for each byte. + finally: + cs(1) # Deselect peripheral. + + txdata = b"12345678" + rxdata = bytearray(len(txdata)) + try: + cs(0) # Select peripheral. + spi.write_readinto(txdata, rxdata) # Simultaneously write and read bytes. + finally: + cs(1) # Deselect peripheral. + """ + + LSB: Final[int] = 0 + MSB: Final[int] = 1 + CONTROLLER: Incomplete + def deinit(self) -> None: + """ + Turn off the SPI bus. + """ + ... + + @overload + def init( + self, + baudrate: int = 1_000_000, + *, + polarity: int = 0, + phase: int = 0, + bits: int = 8, + firstbit: int = MSB, + sck: PinLike | None = None, + mosi: PinLike | None = None, + miso: PinLike | None = None, + ) -> None: + """ + Initialise the SPI bus with the given parameters: + + - ``baudrate`` is the SCK clock rate. + - ``polarity`` can be 0 or 1, and is the level the idle clock line sits at. + - ``phase`` can be 0 or 1 to sample data on the first or second clock edge + respectively. + - ``bits`` is the width in bits of each transfer. Only 8 is guaranteed to be supported by all hardware. + - ``firstbit`` can be ``SPI.MSB`` or ``SPI.LSB``. + - ``sck``, ``mosi``, ``miso`` are pins (machine.Pin) objects to use for bus signals. For most + hardware SPI blocks (as selected by ``id`` parameter to the constructor), pins are fixed + and cannot be changed. In some cases, hardware blocks allow 2-3 alternative pin sets for + a hardware SPI block. Arbitrary pin assignments are possible only for a bitbanging SPI driver + (``id`` = -1). + - ``pins`` - WiPy port doesn't ``sck``, ``mosi``, ``miso`` arguments, and instead allows to + specify them as a tuple of ``pins`` parameter. + + In the case of hardware SPI the actual clock frequency may be lower than the + requested baudrate. This is dependent on the platform hardware. The actual + rate may be determined by printing the SPI object. + """ + + @overload + def init( + self, + baudrate: int = 1_000_000, + *, + polarity: int = 0, + phase: int = 0, + bits: int = 8, + firstbit: int = MSB, + pins: tuple[PinLike, PinLike, PinLike] | None = None, + ) -> None: + """ + Initialise the SPI bus with the given parameters: + + - ``baudrate`` is the SCK clock rate. + - ``polarity`` can be 0 or 1, and is the level the idle clock line sits at. + - ``phase`` can be 0 or 1 to sample data on the first or second clock edge + respectively. + - ``bits`` is the width in bits of each transfer. Only 8 is guaranteed to be supported by all hardware. + - ``firstbit`` can be ``SPI.MSB`` or ``SPI.LSB``. + - ``sck``, ``mosi``, ``miso`` are pins (machine.Pin) objects to use for bus signals. For most + hardware SPI blocks (as selected by ``id`` parameter to the constructor), pins are fixed + and cannot be changed. In some cases, hardware blocks allow 2-3 alternative pin sets for + a hardware SPI block. Arbitrary pin assignments are possible only for a bitbanging SPI driver + (``id`` = -1). + - ``pins`` - WiPy port doesn't ``sck``, ``mosi``, ``miso`` arguments, and instead allows to + specify them as a tuple of ``pins`` parameter. + + In the case of hardware SPI the actual clock frequency may be lower than the + requested baudrate. This is dependent on the platform hardware. The actual + rate may be determined by printing the SPI object. + """ + + def write_readinto(self, write_buf: AnyReadableBuf, read_buf: AnyWritableBuf, /) -> int: + """ + Write the bytes from ``write_buf`` while reading into ``read_buf``. The + buffers can be the same or different, but both buffers must have the + same length. + Returns ``None``. + + Note: on WiPy this function returns the number of bytes written. + """ + ... + + def read(self, nbytes: int, write: int = 0x00, /) -> bytes: + """ + Read a number of bytes specified by ``nbytes`` while continuously writing + the single byte given by ``write``. + Returns a ``bytes`` object with the data that was read. + """ + ... + + def write(self, buf: AnyReadableBuf, /) -> int: + """ + Write the bytes contained in ``buf``. + Returns ``None``. + + Note: on WiPy this function returns the number of bytes written. + """ + ... + + def readinto(self, buf: AnyWritableBuf, write: int = 0x00, /) -> int: + """ + Read into the buffer specified by ``buf`` while continuously writing the + single byte given by ``write``. + Returns ``None``. + + Note: on WiPy this function returns the number of bytes read. + """ + ... + + @overload + def __init__(self, id: int, /): + """ + Construct an SPI object on the given bus, *id*. Values of *id* depend + on a particular port and its hardware. Values 0, 1, etc. are commonly used + to select hardware SPI block #0, #1, etc. + + With no additional parameters, the SPI object is created but not + initialised (it has the settings from the last initialisation of + the bus, if any). If extra arguments are given, the bus is initialised. + See ``init`` for parameters of initialisation. + """ + + @overload + def __init__( + self, + id: int, + /, + baudrate: int = 1_000_000, + *, + polarity: int = 0, + phase: int = 0, + bits: int = 8, + firstbit: int = MSB, + sck: PinLike | None = None, + mosi: PinLike | None = None, + miso: PinLike | None = None, + ): + """ + Construct an SPI object on the given bus, *id*. Values of *id* depend + on a particular port and its hardware. Values 0, 1, etc. are commonly used + to select hardware SPI block #0, #1, etc. + + With no additional parameters, the SPI object is created but not + initialised (it has the settings from the last initialisation of + the bus, if any). If extra arguments are given, the bus is initialised. + See ``init`` for parameters of initialisation. + """ + + @overload + def __init__( + self, + id: int, + /, + baudrate: int = 1_000_000, + *, + polarity: int = 0, + phase: int = 0, + bits: int = 8, + firstbit: int = MSB, + pins: tuple[PinLike, PinLike, PinLike] | None = None, + ): + """ + Construct an SPI object on the given bus, *id*. Values of *id* depend + on a particular port and its hardware. Values 0, 1, etc. are commonly used + to select hardware SPI block #0, #1, etc. + + With no additional parameters, the SPI object is created but not + initialised (it has the settings from the last initialisation of + the bus, if any). If extra arguments are given, the bus is initialised. + See ``init`` for parameters of initialisation. + """ + +class Signal(Pin): + """ + The Signal class is a simple extension of the `Pin` class. Unlike Pin, which + can be only in "absolute" 0 and 1 states, a Signal can be in "asserted" + (on) or "deasserted" (off) states, while being inverted (active-low) or + not. In other words, it adds logical inversion support to Pin functionality. + While this may seem a simple addition, it is exactly what is needed to + support wide array of simple digital devices in a way portable across + different boards, which is one of the major MicroPython goals. Regardless + of whether different users have an active-high or active-low LED, a normally + open or normally closed relay - you can develop a single, nicely looking + application which works with each of them, and capture hardware + configuration differences in few lines in the config file of your app. + + Example:: + + from machine import Pin, Signal + + # Suppose you have an active-high LED on pin 0 + led1_pin = Pin(0, Pin.OUT) + # ... and active-low LED on pin 1 + led2_pin = Pin(1, Pin.OUT) + + # Now to light up both of them using Pin class, you'll need to set + # them to different values + led1_pin.value(1) + led2_pin.value(0) + + # Signal class allows to abstract away active-high/active-low + # difference + led1 = Signal(led1_pin, invert=False) + led2 = Signal(led2_pin, invert=True) + + # Now lighting up them looks the same + led1.value(1) + led2.value(1) + + # Even better: + led1.on() + led2.on() + + Following is the guide when Signal vs Pin should be used: + + * Use Signal: If you want to control a simple on/off (including software + PWM!) devices like LEDs, multi-segment indicators, relays, buzzers, or + read simple binary sensors, like normally open or normally closed buttons, + pulled high or low, Reed switches, moisture/flame detectors, etc. etc. + Summing up, if you have a real physical device/sensor requiring GPIO + access, you likely should use a Signal. + + * Use Pin: If you implement a higher-level protocol or bus to communicate + with more complex devices. + + The split between Pin and Signal come from the use cases above and the + architecture of MicroPython: Pin offers the lowest overhead, which may + be important when bit-banging protocols. But Signal adds additional + flexibility on top of Pin, at the cost of minor overhead (much smaller + than if you implemented active-high vs active-low device differences in + Python manually!). Also, Pin is a low-level object which needs to be + implemented for each support board, while Signal is a high-level object + which comes for free once Pin is implemented. + + If in doubt, give the Signal a try! Once again, it is offered to save + developers from the need to handle unexciting differences like active-low + vs active-high signals, and allow other users to share and enjoy your + application, instead of being frustrated by the fact that it doesn't + work for them simply because their LEDs or relays are wired in a slightly + different way. + """ + + def off(self) -> None: + """ + Deactivate signal. + """ + ... + + def on(self) -> None: + """ + Activate signal. + """ + ... + + @overload + def value(self) -> int: + """ + This method allows to set and get the value of the signal, depending on whether + the argument ``x`` is supplied or not. + + If the argument is omitted then this method gets the signal level, 1 meaning + signal is asserted (active) and 0 - signal inactive. + + If the argument is supplied then this method sets the signal level. The + argument ``x`` can be anything that converts to a boolean. If it converts + to ``True``, the signal is active, otherwise it is inactive. + + Correspondence between signal being active and actual logic level on the + underlying pin depends on whether signal is inverted (active-low) or not. + For non-inverted signal, active status corresponds to logical 1, inactive - + to logical 0. For inverted/active-low signal, active status corresponds + to logical 0, while inactive - to logical 1. + """ + + @overload + def value(self, x: Any, /) -> None: + """ + This method allows to set and get the value of the signal, depending on whether + the argument ``x`` is supplied or not. + + If the argument is omitted then this method gets the signal level, 1 meaning + signal is asserted (active) and 0 - signal inactive. + + If the argument is supplied then this method sets the signal level. The + argument ``x`` can be anything that converts to a boolean. If it converts + to ``True``, the signal is active, otherwise it is inactive. + + Correspondence between signal being active and actual logic level on the + underlying pin depends on whether signal is inverted (active-low) or not. + For non-inverted signal, active status corresponds to logical 1, inactive - + to logical 0. For inverted/active-low signal, active status corresponds + to logical 0, while inactive - to logical 1. + """ + + @overload + def __init__(self, pin_obj: PinLike, invert: bool = False, /): + """ + Create a Signal object. There're two ways to create it: + + * By wrapping existing Pin object - universal method which works for + any board. + * By passing required Pin parameters directly to Signal constructor, + skipping the need to create intermediate Pin object. Available on + many, but not all boards. + + The arguments are: + + - ``pin_obj`` is existing Pin object. + + - ``pin_arguments`` are the same arguments as can be passed to Pin constructor. + + - ``invert`` - if True, the signal will be inverted (active low). + """ + + @overload + def __init__( + self, + id: PinLike, + /, + mode: int = -1, + pull: int = -1, + *, + value: Any = None, + drive: int | None = None, + alt: int | None = None, + invert: bool = False, + ): + """ + Create a Signal object. There're two ways to create it: + + * By wrapping existing Pin object - universal method which works for + any board. + * By passing required Pin parameters directly to Signal constructor, + skipping the need to create intermediate Pin object. Available on + many, but not all boards. + + The arguments are: + + - ``pin_obj`` is existing Pin object. + + - ``pin_arguments`` are the same arguments as can be passed to Pin constructor. + + - ``invert`` - if True, the signal will be inverted (active low). + """ + +class ADCBlock: + @overload + def connect(self, channel: int, **kwargs) -> ADC: ... + @overload + def connect(self, source: PinLike, **kwargs) -> ADC: ... + @overload + def connect(self, channel: int, source: PinLike, **kwargs) -> ADC: + """ + Connect up a channel on the ADC peripheral so it is ready for sampling, + and return an :ref:`ADC ` object that represents that connection. + + The *channel* argument must be an integer, and *source* must be an object + (for example a :ref:`Pin `) which can be connected up for sampling. + + If only *channel* is given then it is configured for sampling. + + If only *source* is given then that object is connected to a default + channel ready for sampling. + + If both *channel* and *source* are given then they are connected together + and made ready for sampling. + + Any additional keyword arguments are used to configure the returned ADC object, + via its :meth:`init ` method. + """ + ... + +class SDCard: + @overload + def readblocks(self, block_num: int, buf: bytearray) -> bool: + """ + The first form reads aligned, multiples of blocks. + Starting at the block given by the index *block_num*, read blocks from + the device into *buf* (an array of bytes). + The number of blocks to read is given by the length of *buf*, + which will be a multiple of the block size. + """ + + @overload + def readblocks(self, block_num: int, buf: bytearray, offset: int) -> bool: + """ + The second form allows reading at arbitrary locations within a block, + and arbitrary lengths. + Starting at block index *block_num*, and byte offset within that block + of *offset*, read bytes from the device into *buf* (an array of bytes). + The number of bytes to read is given by the length of *buf*. + """ + + @overload + def writeblocks(self, block_num: int, buf: bytes | bytearray, /) -> None: + """ + The first form writes aligned, multiples of blocks, and requires that the + blocks that are written to be first erased (if necessary) by this method. + Starting at the block given by the index *block_num*, write blocks from + *buf* (an array of bytes) to the device. + The number of blocks to write is given by the length of *buf*, + which will be a multiple of the block size. + """ + + @overload + def writeblocks(self, block_num: int, buf: bytes | bytearray, offset: int, /) -> None: + """ + The second form allows writing at arbitrary locations within a block, + and arbitrary lengths. Only the bytes being written should be changed, + and the caller of this method must ensure that the relevant blocks are + erased via a prior ``ioctl`` call. + Starting at block index *block_num*, and byte offset within that block + of *offset*, write bytes from *buf* (an array of bytes) to the device. + The number of bytes to write is given by the length of *buf*. + + Note that implementations must never implicitly erase blocks if the offset + argument is specified, even if it is zero. + """ diff --git a/.venv/lib/python3.12/site-packages/math.pyi b/.venv/lib/python3.12/site-packages/math.pyi new file mode 100644 index 0000000..61208d5 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/math.pyi @@ -0,0 +1,267 @@ +""" +Mathematical functions. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/math.html + +CPython module: :mod:`python:math` https://docs.python.org/3/library/math.html . + +The ``math`` module provides some basic mathematical functions for +working with floating-point numbers. + +*Note:* On the pyboard, floating-point numbers have 32-bit precision. + +Availability: not available on WiPy. Floating point support required +for this module. + +--- +Module: 'math' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from typing import SupportsFloat, Tuple +from typing_extensions import Awaitable, TypeAlias, TypeVar + +inf: float = inf +nan: float = nan +pi: float = 3.1415928 +e: float = 2.7182818 +tau: float = 6.2831856 + +def ldexp(x: SupportsFloat, exp: int, /) -> float: + """ + Return ``x * (2**exp)``. + """ + ... + +def lgamma(x: SupportsFloat, /) -> float: + """ + Return the natural logarithm of the gamma function of ``x``. + """ + ... + +def trunc(x: SupportsFloat, /) -> int: + """ + Return an integer, being ``x`` rounded towards 0. + """ + ... + +def isclose(*args, **kwargs) -> Incomplete: ... +def gamma(x: SupportsFloat, /) -> float: + """ + Return the gamma function of ``x``. + """ + ... + +def isnan(x: SupportsFloat, /) -> bool: + """ + Return ``True`` if ``x`` is not-a-number + """ + ... + +def isfinite(x: SupportsFloat, /) -> bool: + """ + Return ``True`` if ``x`` is finite. + """ + ... + +def isinf(x: SupportsFloat, /) -> bool: + """ + Return ``True`` if ``x`` is infinite. + """ + ... + +def sqrt(x: SupportsFloat, /) -> float: + """ + Return the square root of ``x``. + """ + ... + +def sinh(x: SupportsFloat, /) -> float: + """ + Return the hyperbolic sine of ``x``. + """ + ... + +def log(x: SupportsFloat, /) -> float: + """ + With one argument, return the natural logarithm of *x*. + + With two arguments, return the logarithm of *x* to the given *base*. + """ + ... + +def tan(x: SupportsFloat, /) -> float: + """ + Return the tangent of ``x``. + """ + ... + +def tanh(x: SupportsFloat, /) -> float: + """ + Return the hyperbolic tangent of ``x``. + """ + ... + +def log2(x: SupportsFloat, /) -> float: + """ + Return the base-2 logarithm of ``x``. + """ + ... + +def log10(x: SupportsFloat, /) -> float: + """ + Return the base-10 logarithm of ``x``. + """ + ... + +def sin(x: SupportsFloat, /) -> float: + """ + Return the sine of ``x``. + """ + ... + +def modf(x: SupportsFloat, /) -> Tuple: + """ + Return a tuple of two floats, being the fractional and integral parts of + ``x``. Both return values have the same sign as ``x``. + """ + ... + +def radians(x: SupportsFloat, /) -> float: + """ + Return degrees ``x`` converted to radians. + """ + ... + +def atanh(x: SupportsFloat, /) -> float: + """ + Return the inverse hyperbolic tangent of ``x``. + """ + ... + +def atan2(y: SupportsFloat, x: SupportsFloat, /) -> float: + """ + Return the principal value of the inverse tangent of ``y/x``. + """ + ... + +def atan(x: SupportsFloat, /) -> float: + """ + Return the inverse tangent of ``x``. + """ + ... + +def ceil(x: SupportsFloat, /) -> int: + """ + Return an integer, being ``x`` rounded towards positive infinity. + """ + ... + +def copysign(x: SupportsFloat, y: SupportsFloat, /) -> float: + """ + Return ``x`` with the sign of ``y``. + """ + ... + +def frexp(x: SupportsFloat, /) -> tuple[float, int]: + """ + Decomposes a floating-point number into its mantissa and exponent. + The returned value is the tuple ``(m, e)`` such that ``x == m * 2**e`` + exactly. If ``x == 0`` then the function returns ``(0.0, 0)``, otherwise + the relation ``0.5 <= abs(m) < 1`` holds. + """ + ... + +def acos(x: SupportsFloat, /) -> float: + """ + Return the inverse cosine of ``x``. + """ + ... + +def pow(x: SupportsFloat, y: SupportsFloat, /) -> float: + """ + Returns ``x`` to the power of ``y``. + """ + ... + +def asinh(x: SupportsFloat, /) -> float: + """ + Return the inverse hyperbolic sine of ``x``. + """ + ... + +def acosh(x: SupportsFloat, /) -> float: + """ + Return the inverse hyperbolic cosine of ``x``. + """ + ... + +def asin(x: SupportsFloat, /) -> float: + """ + Return the inverse sine of ``x``. + """ + ... + +def factorial(*args, **kwargs) -> Incomplete: ... +def fabs(x: SupportsFloat, /) -> float: + """ + Return the absolute value of ``x``. + """ + ... + +def expm1(x: SupportsFloat, /) -> float: + """ + Return ``exp(x) - 1``. + """ + ... + +def floor(x: SupportsFloat, /) -> int: + """ + Return an integer, being ``x`` rounded towards negative infinity. + """ + ... + +def fmod(x: SupportsFloat, y: SupportsFloat, /) -> float: + """ + Return the remainder of ``x/y``. + """ + ... + +def cos(x: SupportsFloat, /) -> float: + """ + Return the cosine of ``x``. + """ + ... + +def degrees(x: SupportsFloat, /) -> float: + """ + Return radians ``x`` converted to degrees. + """ + ... + +def cosh(x: SupportsFloat, /) -> float: + """ + Return the hyperbolic cosine of ``x``. + """ + ... + +def exp(x: SupportsFloat, /) -> float: + """ + Return the exponential of ``x``. + """ + ... + +def erf(x: SupportsFloat, /) -> float: + """ + Return the error function of ``x``. + """ + ... + +def erfc(x: SupportsFloat, /) -> float: + """ + Return the complementary error function of ``x``. + """ + ... diff --git a/.venv/lib/python3.12/site-packages/micropython.pyi b/.venv/lib/python3.12/site-packages/micropython.pyi new file mode 100644 index 0000000..9c00696 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython.pyi @@ -0,0 +1,350 @@ +""" +Access and control MicroPython internals. + +MicroPython module: https://docs.micropython.org/en/v1.26.0/library/micropython.html + +--- +Module: 'micropython' on micropython-v1.26.0-rp2-RPI_PICO +""" + +# MCU: {'mpy': 'v6.3', 'build': '', 'ver': '1.26.0', 'arch': 'armv6m', 'version': '1.26.0', 'port': 'rp2', 'board': 'RPI_PICO', 'family': 'micropython', 'board_id': 'RPI_PICO', 'variant': '', 'cpu': 'RP2040'} +# Stubber: v1.26.0 +from __future__ import annotations +from _typeshed import Incomplete +from _mpy_shed import mp_available +from typing import Any, Callable, Optional, Tuple, overload +from typing_extensions import Awaitable, ParamSpec, TypeAlias, TypeVar + +_T = TypeVar("_T") +_F = TypeVar("_F", bound=Callable[..., Any]) +Const_T = TypeVar("Const_T", int, float, str, bytes, Tuple) +_Param = ParamSpec("_Param") +_Ret = TypeVar("_Ret") + +@overload +def opt_level() -> int: + """ + If *level* is given then this function sets the optimisation level for subsequent + compilation of scripts, and returns ``None``. Otherwise it returns the current + optimisation level. + + The optimisation level controls the following compilation features: + + - Assertions: at level 0 assertion statements are enabled and compiled into the + bytecode; at levels 1 and higher assertions are not compiled. + - Built-in ``__debug__`` variable: at level 0 this variable expands to ``True``; + at levels 1 and higher it expands to ``False``. + - Source-code line numbers: at levels 0, 1 and 2 source-code line number are + stored along with the bytecode so that exceptions can report the line number + they occurred at; at levels 3 and higher line numbers are not stored. + + The default optimisation level is usually level 0. + """ + +@overload +def opt_level(level: int, /) -> None: + """ + If *level* is given then this function sets the optimisation level for subsequent + compilation of scripts, and returns ``None``. Otherwise it returns the current + optimisation level. + + The optimisation level controls the following compilation features: + + - Assertions: at level 0 assertion statements are enabled and compiled into the + bytecode; at levels 1 and higher assertions are not compiled. + - Built-in ``__debug__`` variable: at level 0 this variable expands to ``True``; + at levels 1 and higher it expands to ``False``. + - Source-code line numbers: at levels 0, 1 and 2 source-code line number are + stored along with the bytecode so that exceptions can report the line number + they occurred at; at levels 3 and higher line numbers are not stored. + + The default optimisation level is usually level 0. + """ + +@overload +def mem_info() -> None: + """ + Print information about currently used memory. If the *verbose* argument + is given then extra information is printed. + + The information that is printed is implementation dependent, but currently + includes the amount of stack and heap used. In verbose mode it prints out + the entire heap indicating which blocks are used and which are free. + """ + +@overload +def mem_info(verbose: Any, /) -> None: + """ + Print information about currently used memory. If the *verbose* argument + is given then extra information is printed. + + The information that is printed is implementation dependent, but currently + includes the amount of stack and heap used. In verbose mode it prints out + the entire heap indicating which blocks are used and which are free. + """ + +def kbd_intr(chr: int) -> None: + """ + Set the character that will raise a `KeyboardInterrupt` exception. By + default this is set to 3 during script execution, corresponding to Ctrl-C. + Passing -1 to this function will disable capture of Ctrl-C, and passing 3 + will restore it. + + This function can be used to prevent the capturing of Ctrl-C on the + incoming stream of characters that is usually used for the REPL, in case + that stream is used for other purposes. + """ + ... + +@overload +def qstr_info() -> None: + """ + Print information about currently interned strings. If the *verbose* + argument is given then extra information is printed. + + The information that is printed is implementation dependent, but currently + includes the number of interned strings and the amount of RAM they use. In + verbose mode it prints out the names of all RAM-interned strings. + """ + +@overload +def qstr_info(verbose: bool, /) -> None: + """ + Print information about currently interned strings. If the *verbose* + argument is given then extra information is printed. + + The information that is printed is implementation dependent, but currently + includes the number of interned strings and the amount of RAM they use. In + verbose mode it prints out the names of all RAM-interned strings. + """ + +def schedule(func: Callable[[_T], None], arg: _T, /) -> None: + """ + Schedule the function *func* to be executed "very soon". The function + is passed the value *arg* as its single argument. "Very soon" means that + the MicroPython runtime will do its best to execute the function at the + earliest possible time, given that it is also trying to be efficient, and + that the following conditions hold: + + - A scheduled function will never preempt another scheduled function. + - Scheduled functions are always executed "between opcodes" which means + that all fundamental Python operations (such as appending to a list) + are guaranteed to be atomic. + - A given port may define "critical regions" within which scheduled + functions will never be executed. Functions may be scheduled within + a critical region but they will not be executed until that region + is exited. An example of a critical region is a preempting interrupt + handler (an IRQ). + + A use for this function is to schedule a callback from a preempting IRQ. + Such an IRQ puts restrictions on the code that runs in the IRQ (for example + the heap may be locked) and scheduling a function to call later will lift + those restrictions. + + On multi-threaded ports, the scheduled function's behaviour depends on + whether the Global Interpreter Lock (GIL) is enabled for the specific port: + + - If GIL is enabled, the function can preempt any thread and run in its + context. + - If GIL is disabled, the function will only preempt the main thread and run + in its context. + + Note: If `schedule()` is called from a preempting IRQ, when memory + allocation is not allowed and the callback to be passed to `schedule()` is + a bound method, passing this directly will fail. This is because creating a + reference to a bound method causes memory allocation. A solution is to + create a reference to the method in the class constructor and to pass that + reference to `schedule()`. This is discussed in detail here + :ref:`reference documentation ` under "Creation of Python + objects". + + There is a finite queue to hold the scheduled functions and `schedule()` + will raise a `RuntimeError` if the queue is full. + """ + ... + +def stack_use() -> int: + """ + Return an integer representing the current amount of stack that is being + used. The absolute value of this is not particularly useful, rather it + should be used to compute differences in stack usage at different points. + """ + ... + +def heap_unlock() -> int: + """ + Lock or unlock the heap. When locked no memory allocation can occur and a + `MemoryError` will be raised if any heap allocation is attempted. + `heap_locked()` returns a true value if the heap is currently locked. + + These functions can be nested, ie `heap_lock()` can be called multiple times + in a row and the lock-depth will increase, and then `heap_unlock()` must be + called the same number of times to make the heap available again. + + Both `heap_unlock()` and `heap_locked()` return the current lock depth + (after unlocking for the former) as a non-negative integer, with 0 meaning + the heap is not locked. + + If the REPL becomes active with the heap locked then it will be forcefully + unlocked. + + Note: `heap_locked()` is not enabled on most ports by default, + requires ``MICROPY_PY_MICROPYTHON_HEAP_LOCKED``. + """ + +def const(expr: Const_T, /) -> Const_T: + """ + Used to declare that the expression is a constant so that the compiler can + optimise it. The use of this function should be as follows:: + + from micropython import const + + CONST_X = const(123) + CONST_Y = const(2 * CONST_X + 1) + + Constants declared this way are still accessible as global variables from + outside the module they are declared in. On the other hand, if a constant + begins with an underscore then it is hidden, it is not available as a global + variable, and does not take up any memory during execution. + + This `const` function is recognised directly by the MicroPython parser and is + provided as part of the :mod:`micropython` module mainly so that scripts can be + written which run under both CPython and MicroPython, by following the above + pattern. + """ + ... + +def heap_lock() -> int: + """ + Lock or unlock the heap. When locked no memory allocation can occur and a + `MemoryError` will be raised if any heap allocation is attempted. + `heap_locked()` returns a true value if the heap is currently locked. + + These functions can be nested, ie `heap_lock()` can be called multiple times + in a row and the lock-depth will increase, and then `heap_unlock()` must be + called the same number of times to make the heap available again. + + Both `heap_unlock()` and `heap_locked()` return the current lock depth + (after unlocking for the former) as a non-negative integer, with 0 meaning + the heap is not locked. + + If the REPL becomes active with the heap locked then it will be forcefully + unlocked. + + Note: `heap_locked()` is not enabled on most ports by default, + requires ``MICROPY_PY_MICROPYTHON_HEAP_LOCKED``. + """ + +def alloc_emergency_exception_buf(size: int, /) -> None: + """ + Allocate *size* bytes of RAM for the emergency exception buffer (a good + size is around 100 bytes). The buffer is used to create exceptions in cases + when normal RAM allocation would fail (eg within an interrupt handler) and + therefore give useful traceback information in these situations. + + A good way to use this function is to put it at the start of your main script + (eg ``boot.py`` or ``main.py``) and then the emergency exception buffer will be active + for all the code following it. + """ + ... + +class RingIO: + def readinto(self, buf, nbytes: Optional[Any] = None) -> int: + """ + Read available bytes into the provided ``buf``. If ``nbytes`` is + specified then read at most that many bytes. Otherwise, read at + most ``len(buf)`` bytes. + + Return value: Integer count of the number of bytes read into ``buf``. + """ + ... + + def write(self, buf) -> int: + """ + Non-blocking write of bytes from ``buf`` into the ringbuffer, limited + by the available space in the ringbuffer. + + Return value: Integer count of bytes written. + """ + ... + + def readline(self, nbytes: Optional[Any] = None) -> bytes: + """ + Read a line, ending in a newline character or return if one exists in + the buffer, else return available bytes in buffer. If ``nbytes`` is + specified then read at most that many bytes. + + Return value: a bytes object containing the line read. + """ + ... + + def any(self) -> int: + """ + Returns an integer counting the number of characters that can be read. + """ + ... + + def read(self, nbytes: Optional[Any] = None) -> bytes: + """ + Read available characters. This is a non-blocking function. If ``nbytes`` + is specified then read at most that many bytes, otherwise read as much + data as possible. + + Return value: a bytes object containing the bytes read. Will be + zero-length bytes object if no data is available. + """ + ... + + def close(self) -> Incomplete: + """ + No-op provided as part of standard `stream` interface. Has no effect + on data in the ringbuffer. + """ + ... + + def __init__(self, size) -> None: ... + +# decorators +@mp_available() # force merge +def viper(_func: Callable[_Param, _Ret], /) -> Callable[_Param, _Ret]: + """ + The Viper code emitter is not fully compliant. It supports special Viper native data types in pursuit of performance. + Integer processing is non-compliant because it uses machine words: arithmetic on 32 bit hardware is performed modulo 2**32. + Like the Native emitter Viper produces machine instructions but further optimisations are performed, substantially increasing + performance especially for integer arithmetic and bit manipulations. + See: https://docs.micropython.org/en/latest/reference/speed_python.html?highlight=viper#the-native-code-emitter + """ + ... + +@mp_available() # force merge +def native(_func: Callable[_Param, _Ret], /) -> Callable[_Param, _Ret]: + """ + This causes the MicroPython compiler to emit native CPU opcodes rather than bytecode. + It covers the bulk of the MicroPython functionality, so most functions will require no adaptation. + See: https://docs.micropython.org/en/latest/reference/speed_python.html#the-native-code-emitter + """ + ... + +@mp_available(macro="MICROPY_EMIT_INLINE_THUMB") # force merge +def asm_thumb(_func: Callable[_Param, _Ret], /) -> Callable[_Param, _Ret]: + """ + This decorator is used to mark a function as containing inline assembler code. + The assembler code is written is a subset of the ARM Thumb-2 instruction set, and is executed on the target CPU. + + Availability: Only on specific boards where MICROPY_EMIT_INLINE_THUMB is defined. + See: https://docs.micropython.org/en/latest/reference/asm_thumb2_index.html + """ + ... + +@mp_available(port="esp8266") # force merge +def asm_xtensa(_func: Callable[_Param, _Ret], /) -> Callable[_Param, _Ret]: + """ + This decorator is used to mark a function as containing inline assembler code for the esp8266. + The assembler code is written in the Xtensa instruction set, and is executed on the target CPU. + + Availability: Only on eps8266 boards. + """ + ... + # See : + # - https://github.com/orgs/micropython/discussions/12965 + # - https://github.com/micropython/micropython/pull/16731 diff --git a/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/INSTALLER b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/LICENSE.md b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/LICENSE.md new file mode 100644 index 0000000..72b7b16 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022 Jos Verlinde + +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.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/METADATA b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/METADATA new file mode 100644 index 0000000..17a7d41 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/METADATA @@ -0,0 +1,64 @@ +Metadata-Version: 2.3 +Name: micropython-rp2-stubs +Version: 1.26.0.post1 +Summary: MicroPython stubs +License: MIT +Author: Jos Verlinde +Author-email: josverl@users.noreply.github.com +Classifier: Typing :: Stubs Only +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: MicroPython +Classifier: Operating System :: OS Independent +Classifier: Topic :: Text Editors :: Integrated Development Environments (IDE) +Classifier: Topic :: Software Development :: Documentation +Classifier: Topic :: Software Development :: Embedded Systems +Classifier: Topic :: Software Development :: Testing +Classifier: Natural Language :: English +Requires-Dist: micropython-stdlib-stubs (>=1.26.0,<1.27.0) +Project-URL: Documentation, https://micropython-stubs.readthedocs.io/ +Project-URL: Homepage, https://github.com/josverl/micropython-stubs#micropython-stubs +Project-URL: Repository, https://github.com/josverl/micropython-stubs +Description-Content-Type: text/markdown + +# micropython-rp2-stubs + + +This is a stub-only package for MicroPython. +It is intended to be installed in a projects virtual environment to allow static type checkers and intellisense features to be used while writing Micropython code. + +The version of this package is alligned the the version of the MicroPython firmware. + - Major, Minor and Patch levels are alligned to the same version as the firmware. + - The post release level is used to publish new releases of the stubs. + +For `Micropython 1.17` the stubs are published as `1.17.post1` ... `1.17.post2` +for `Micropython 1.18` the stubs are published as `1.18.post1` ... `1.18.post2` + +To install the latest stubs: +`pip install -I micropython--stubs` where port is the port of the MicroPython firmware. + +To install the stubs for an older version, such as MicroPython 1.17: +`pip install micropython-stm32-stubs==1.17.*` which will install the last post release of the stubs for MicroPython 1.17. + + +As the creation of the stubs, and merging of the different types is still going though improvements, the stub packages are marked as Beta. +To upgrade stubs to the latest stubs for a specific version use `pip install micropython-stm32-stubs==1.17.* --upgrade` + +If you have suggestions or find any issues with the stubs, please report them in the [MicroPython-stubs Discussions](https://github.com/Josverl/micropython-stubs/discussions) + +For an overview of Micropython Stubs please see: https://micropython-stubs.readthedocs.io/en/main/ + * List of all stubs : https://micropython-stubs.readthedocs.io/en/main/firmware_grp.html + + + +Included stubs: +* Merged stubs from `stubs/micropython-v1_26_0-rp2-RPI_PICO-merged` +* Frozen stubs from `stubs/micropython-v1_26_0-frozen/rp2/GENERIC` +* Core stubs from `stubs/micropython-core` + + +origin | Family | Port | Board | Version +-------|--------|------|-------|-------- + diff --git a/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/RECORD b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/RECORD new file mode 100644 index 0000000..19fafcd --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/RECORD @@ -0,0 +1,58 @@ +__builtins__.pyi,sha256=P0dwpsSqizQRPmaI6J275kc7G35m38YjafDPz4SEdKI,1097 +_boot.pyi,sha256=0e1lrk87JxZMowULLiOAz7leOmzBkvFCabOD4i-djzY,70 +_boot_fat.pyi,sha256=5SN-IunMd7ESRkWUm4XH1DLoX8F2_R0gm-p_dvC4i-4,54 +_onewire.pyi,sha256=Aoqj9t5Zo48w2nwqKFF3bKUjvDFKGM0TBcRhcMDoMQE,663 +_thread.pyi,sha256=qruh97SKzvBuIMEP6g-pEOwEw_X18yhcNpnvmQMznCw,1318 +binascii.pyi,sha256=Js4mvTBtShAqzpkr53R_OS94gZnxyr5EvSavOiLZScg,2121 +cmath.pyi,sha256=W7LjCb4tdmlZVxtU3_E49ae_CLumfotRT36AItkySMA,2110 +cryptolib.pyi,sha256=fyYS0lSiMjhSQCN6FEHB10llwxyrghxvk8LucmF1tto,6734 +deflate.pyi,sha256=4GYBP3Ce-Trro2pMGFwNTeBM_sCux681xE3J1fGVYKA,3746 +dht.pyi,sha256=zamvhZo46pXwloiPKKlldLlMYmb7waNyZE1aeUnz-vA,344 +ds18x20.pyi,sha256=aHK7R9hREAFdOgPBd5dx8-MPBORBUvwHWNDDSVULl-Q,423 +errno.pyi,sha256=8036ME2KKlPQhWRvp-GYue4P7vYrMHKIM4UTemfgSkA,1448 +framebuf.pyi,sha256=DWoxiTKnEjO0_0nrK0SuLOvFSrnNdLSsAoQiqOoaBDw,9265 +gc.pyi,sha256=Dg_YTQxCHCGzNWFyBD0LtVvz4q1EpDpD3Khvuxxz70g,4279 +hashlib.pyi,sha256=JASAsPp2aT0JvqOz9eE44AulQ63PKKVgPsx4WPPJDKM,3665 +heapq.pyi,sha256=zVdjTbcM-IpP6FXBhDPhlbxb3Q0yfbu6-lkGvOxoBmk,1433 +machine.pyi,sha256=3ZcwR0rvop3NAjhBxDMfsDb1w95J6oIGXfozOoDGN2g,129722 +math.pyi,sha256=u6AllM7vjnJdLS45X5xGJHfeH0FJXS6ypCJznS5defQ,6041 +micropython.pyi,sha256=oyWt_RtD_SfZfSgwUmrxJobn_VTGjHU3ZqmvedPh7FM,14996 +micropython_rp2_stubs-1.26.0.post1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +micropython_rp2_stubs-1.26.0.post1.dist-info/LICENSE.md,sha256=EerY3Evf4ZqwZBZMGIokOHR70txtsAlS_GGHuxmxUJY,1092 +micropython_rp2_stubs-1.26.0.post1.dist-info/METADATA,sha256=TgVmz4GDRvkH6jpyzXhgRQ98fOCpJc9S6uHnpdTNbhs,3033 +micropython_rp2_stubs-1.26.0.post1.dist-info/RECORD,, +micropython_rp2_stubs-1.26.0.post1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +micropython_rp2_stubs-1.26.0.post1.dist-info/WHEEL,sha256=5druYqcII7zHXzX7qmN0TH895Jg3yuTtfjMgJIVBrKE,92 +neopixel.pyi,sha256=FdRUbjJVKfF98ojrMeBrFsw6Sm9AY6ES9HM6NmYvxa0,2607 +onewire.pyi,sha256=UboaaLJILaciyu73yPK4sF7B-humChu0LOWtEUM6ktk,619 +platform.pyi,sha256=2BjgGrD2-65FgM-_ypN2pPqXkTM8EGnmBgP9WATwUls,1829 +random.pyi,sha256=X040iEdWm4DM1bGhRYrNz4Pxmkn3pjPmYCF1OfCEIvs,4030 +rp2/__init__.pyi,sha256=gHedoolqLnlAUpaAjYFGb-dz5eZ0foeSwPwMs2PlA7U,42977 +rp2/asm_pio.pyi,sha256=-JsGzHyzi8dsRP3QNHyvm-6at6VUJzwEDj-Yaq-Z0mc,23085 +select.pyi,sha256=XT6lIWsV6LjvCWAx2sSUQcNyTokFlWlzj-385eZIV00,4695 +time.pyi,sha256=MgdDX9YL8fosE8AKbRd8mMrgsWvBt1sk6h9wtZeCQz0,14007 +uarray.pyi,sha256=_vDoA-BKjQMQIwjaCAV1nll5vAEL2T-xgrQiDm5xVdE,73 +uasyncio.pyi,sha256=jeB0u_5xMQ2V5xyJ6YzCNrCdjy4_O_28uRd3qCRbuhI,77 +ubinascii.pyi,sha256=TJgiLXvErAY6Md4T6yyuBNMJZ57o0IqBbmwrKi42DVA,79 +ubluetooth.pyi,sha256=qx8fxO2JRh4LcUimgzbDAG-O2g1N-U_WOPz36sE1ZRs,81 +ucollections.pyi,sha256=JlFgl88kORBqQ_XreUQVVUmI2jwKnOgOCIl-GhuBv6Q,460 +ucryptolib.pyi,sha256=ZFBml3gtn0iraWDms2FPcrZPjGWXJCLgxPR6zR1ey80,598 +uctypes.pyi,sha256=7MQ1ku0y4yWQ316kBiExgJl8gHoaw7L-zTTPWMBqsbI,3803 +uerrno.pyi,sha256=O8b_ZlyhYouSdtOm7p53FTymfarjAKAupHOx1brBq3s,73 +uhashlib.pyi,sha256=4l0OybeRxckunXbeFW748giv6giTcOkeZg5ZLFX4s7Q,782 +uheapq.pyi,sha256=vzpZiyC3LfaTphjTfKWTATjRoD7XVGUy3kr2C242v6M,558 +uio.pyi,sha256=dWmUZ-iYMZu4KKOqspZ5ZXj3jv9K6dCOojK7_nlihUk,67 +ujson.pyi,sha256=pggiInEKs9lBzun6IvWh8m9iQr6cadxBUYgyp8dugQk,71 +umachine.pyi,sha256=NpuoOYQYmWHwFuUCk3jAvPRyRg4S6WqoR1ddVKsLre0,77 +uos.pyi,sha256=00KOdXyvwpFYd_DhOpOkDC6qI0-F9tCOxvyIo00dsL8,67 +uplatform.pyi,sha256=mKYGUtsWRzkXT-nhG5XPR32jJ1IbJNSMmYodaAvZaJc,79 +urandom.pyi,sha256=BAm-lBWsPMYYFukHYb1-CQElDGconl4n51MWoQmGbO4,755 +ure.pyi,sha256=MIvrONKD5LKa9fwXMllrbDm_lzkqGWLwpreoCHMJBSc,596 +uselect.pyi,sha256=i3wd5YYMhhhN0oROk4fMPYkwFPjunp8C09_3dPLQdVM,75 +usocket.pyi,sha256=ih8oT6AEAf9mslyw7AksnAmkUWbT4uyhV4Y_HFLPE6Q,75 +ussl.pyi,sha256=4gPHz7LcHDQS4oA3uFgH0yfeoTUslSk72qgqDqSN9BA,69 +ustruct.pyi,sha256=szRH88vBKutJsEKsfkzRYn8nYQP4j8POjBMHPbIedws,75 +usys.pyi,sha256=HRfWC305rZ4OKTBu_1UmPpDNNS1uKMy8DuFrfHV-4G4,69 +utime.pyi,sha256=bf-Oee8krzlA5AkXG_hrNgkijrmD9eNXEpUWLjt8o6s,71 +uzlib.pyi,sha256=TaBEcTT07wPvtMX6Vtkz2KLnfGSqmnq6lVPtp9Wh3yc,71 +vfs.pyi,sha256=vrMyC_Y_gt3mvxOwQuH2o0sI4Ccu5Kme3ydPTsWzi7s,10897 diff --git a/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/REQUESTED b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/WHEEL b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/WHEEL new file mode 100644 index 0000000..a1641b7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_rp2_stubs-1.26.0.post1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: poetry-core 2.1.3 +Root-Is-Purelib: true +Tag: py2.py3-none-any diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/INSTALLER b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/METADATA b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/METADATA new file mode 100644 index 0000000..225aced --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/METADATA @@ -0,0 +1,86 @@ +Metadata-Version: 2.4 +Name: micropython-stdlib-stubs +Version: 1.26.0.post3 +Summary: Micropython stdlib is a reduced and augmented copy of typeshed's stdlib for use by MicroPython stub packages +Project-URL: homepage, https://github.com/josverl/micropython-stubs#micropython-stubs +Project-URL: documentation, https://micropython-stubs.readthedocs.io/ +Project-URL: repository, https://github.com/josverl/micropython-stubs +Author-email: Jos Verlinde +License-Expression: MIT +License-File: LICENSE.md +License-File: LICENSE_typeshed +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: Implementation :: MicroPython +Classifier: Topic :: Software Development :: Build Tools +Classifier: Topic :: Text Editors :: Integrated Development Environments (IDE) +Classifier: Typing :: Stubs Only +Requires-Python: >=3.7 +Description-Content-Type: text/markdown + +# micropython-stdlib-stubs +A limited size copy of typesheds stdlib directory. +https://github.com/python/typeshed/tree/main/stdlib + +This is used as a dependency in the micropython-*-stub packages to allow overriding of some of the stdlib modules with MicroPython specific implementations. + +MicroPython specific updates to: +- collections + +If you have suggestions or find any issues with the stubs, please report them in the [MicroPython-stubs Discussions](https://github.com/Josverl/micropython-stubs/discussions) + +For an overview of Micropython Stubs please see: https://micropython-stubs.readthedocs.io/en/main/ + * List of all stubs : https://micropython-stubs.readthedocs.io/en/main/firmware_grp.html + +## Building + +This is a short description of the steps taken to create or update the stubs for the micropython-stdlib-stubs distribution. +this package is built using `uv build` and published using `uv publish`. + +## There are two possible reasons to rebuild + 1. Rebuild in order to update from the reference-stubs or ducument-stubs. This will use the same typeshed stubs, and infuse or enrich them with new information from MicroPython. + 2. Rebuild in order to update to a newer version of theof the typeshedrepo.for this you will need to manually advance the typeset repo to a newer version. Perhaps the newest versionand then rerun the update script it might be that due to the changes in the base 5 stubs that you'll need to make updates to the updatescript in order to accommodate for that. + +*Steps* + - clone the typeshed repository + ```bash + cd repos + git clone https://github.com/python/typeshed.git + cd typeshed + git checkout + ``` +- update the version in pyproject toml to the new version ( .postnn) + +- from the publish/micropython-stdlib-stubs directory + - run `python build.py` + +- update and publish the micropython-stdlib-stubs package + ```bash + uv publish + ``` + +- commit the changes to the micropython-stdlib-stubs repository + +## asyncio notes +## asyncio +- no _asyncio.pyi stubs to avoid conflict with stdlib re-use + +- Generators + are not values - but are always callables, or coroutines + so rewrite + `open_connection: Generator ## = ` + to + `async def open_connection () -> Callable[..., Awaitable[Tuple[StreamReader, StreamWriter]]]` + or similar + + +## Publish to PyPi + +Publish using `uv publish`. + + + + diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/RECORD b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/RECORD new file mode 100644 index 0000000..21a1b37 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/RECORD @@ -0,0 +1,83 @@ +_mpy_shed/IRQs.pyi,sha256=hCqQDClcgx77uDiho57KFrS9HYVvD0zh0Smcs09KIgk,808 +_mpy_shed/__init__.pyi,sha256=821KoaqheWqvdKcrZjT9wX9USu8usFvptCJkZbmZsW4,3753 +_mpy_shed/__pycache__/mp_implementation.cpython-312.pyc,, +_mpy_shed/_collections_abc.pyi,sha256=qthswhc_-15h8F74Fb9Bu-aKXcgwdiKNaikkPnNeMvs,3241 +_mpy_shed/blockdevice.pyi,sha256=oT5r8wKFBQcds6uGt4V6voRZnYUg2HaDXEbpt8UwWXc,10065 +_mpy_shed/buffer_mp.pyi,sha256=P7SGDfT8i0St5mhj9HwH_6J6WoP2Hq9Zhsh4k6Pf2Bs,450 +_mpy_shed/collections/__init__.pyi,sha256=DKGew2BelWHgR31vYu4UCMpGOPF1DJpoZIXcvJN6th4,24476 +_mpy_shed/collections/abc.pyi,sha256=zgovA8n11pYi3KyJJJeHveG0G3KpnvsljqQ5QirtDpk,85 +_mpy_shed/io_modes.pyi,sha256=JiP86MvsJpGFCIIxhkYvcI8xvgdKKPoA_nMKo8dDkIc,1762 +_mpy_shed/io_mp.pyi,sha256=paBaW8dgurf4SF6ZAT4O8yzc_XxI9u6WIwYL5SHIrUk,1954 +_mpy_shed/mp_available.pyi,sha256=JDAwXLHVWG4eaCzhaL-MuG1QUJWud2O68WhRlAwYOiM,868 +_mpy_shed/mp_implementation.py,sha256=Lvx6d7p16eVdIhUCEPISyBQo1MmoRsdyPXKa351TZJs,1057 +_mpy_shed/neopixelbase.pyi,sha256=fHfGkJCrn1JoWu2_sgSIHu7igdqfLxHjOc15lUaBFeQ,621 +_mpy_shed/pathlike.pyi,sha256=kW6M9m1ekNlohS2GxrWUHfu1WOJcr4yAACueFKXgUhg,684 +_mpy_shed/subscriptable.pyi,sha256=nKVNhNjinrzFYaR0DqE7cEyN3jqJsvhxTnswzRGmdAY,644 +_mpy_shed/time_mp.pyi,sha256=aHVWS8uJJIHEWqawx2IwT5zUNauv9b4LRdi1Sph5s9I,658 +micropython_stdlib_stubs-1.26.0.post3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +micropython_stdlib_stubs-1.26.0.post3.dist-info/METADATA,sha256=FxCF4g1NHo5lnX-LG2Z3W8tsOI-1G8FDPAm9JUVly5U,3518 +micropython_stdlib_stubs-1.26.0.post3.dist-info/RECORD,, +micropython_stdlib_stubs-1.26.0.post3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +micropython_stdlib_stubs-1.26.0.post3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE.md,sha256=XnIlPftszZeoPSWf1jwR9a1w2zp3zOL_-oC0qRi-gbE,13067 +micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE_typeshed,sha256=E8ceCWKDbYhQdivaD2I0_yEwNIcfpmtsQpYlSdc1F6Q,12894 +stdlib/VERSIONS,sha256=mM3ASvFIjLqG4GJyqeZt6hRAEr8B5reRT7dCmtbYYDw,5995 +stdlib/__future__.pyi,sha256=qIwWDmjaw3XCiulKYoKBQB_eJjLxweesUKwBdpkgQkU,915 +stdlib/_ast.pyi,sha256=Hp9iS4qcJfo4KlueBTaYkR9IfdelifXU3bBhnAe_tmw,3466 +stdlib/_codecs.pyi,sha256=dWiEtxcI9QnZYo0tGkMS14ksIK8Nn1jQvoHznsDRf20,6919 +stdlib/_collections_abc.pyi,sha256=tAxXudfHJqSZco-VYEA3KdeHisUgq5iGleLPkylU0-8,2778 +stdlib/_decimal.pyi,sha256=CGJcsPJpGBn_uIAse-6mJCtssMMcHsWiJGTnZdTVOI8,2105 +stdlib/_typeshed/README.md,sha256=upGLmqNVRlXIE70i0vGA969dc26GVqU9Gs5cHEzb8Ys,1043 +stdlib/_typeshed/__init__.pyi,sha256=W67NAhSV3NF1R4na73c966olOqM3NHheEu3Z-8PlRO0,12563 +stdlib/_typeshed/dbapi.pyi,sha256=DbFvZC7aeSFuw_hopshe-nz6OL_btPB06zIoJ8O-9tA,1636 +stdlib/_typeshed/importlib.pyi,sha256=iSR1SQrIgH39dZwu1o0M0qk8ZsxRUkn4DtG2_K5tO4o,727 +stdlib/_typeshed/wsgi.pyi,sha256=6sb45JIA9DuSd1hYwxt2418TU6E4tVFiIfflHKMnpnE,1614 +stdlib/_typeshed/xml.pyi,sha256=W4c9PcHw737FUoezcPAkfRuoMB--7Up7uKlZ0ShNIG0,499 +stdlib/abc.pyi,sha256=oli4JypsePdvKt1xAB0sqDFbX1aUYddNRzj2BP65M-w,1987 +stdlib/array.pyi,sha256=CqeQucdU-czxtV4634Q-sUeQ_relrCnXQxJ86lAMGZg,24658 +stdlib/asyncio/__init__.pyi,sha256=aJXL2LflxMaFW91K3mH1L4RakIV4bR_ZuHMnDn51eRg,1337 +stdlib/asyncio/base_events.pyi,sha256=av8dDqKw4UttfGfla1x780I2Q6kVrNcQ59DlHea5a0k,19986 +stdlib/asyncio/base_futures.pyi,sha256=64lMK_8YEQQoxRnN-2OAQzKnEx9F9VVQ4GKIQKeqFxE,749 +stdlib/asyncio/base_tasks.pyi,sha256=PYv3qwMz2WIqDs3GGdLTaJfiJBTuUwIK0PUEKHIl9Uc,413 +stdlib/asyncio/constants.pyi,sha256=aQWt89UfXp0rZM29OQDAGGlGzieOr6dAQ6nlSS5gjAU,576 +stdlib/asyncio/coroutines.pyi,sha256=ndCXCDSwGk4ZLKmlNCW59cbfxwc2cExSYyrkpV63TDM,1062 +stdlib/asyncio/events.pyi,sha256=BPITbGyq8A1SbwxsdTkLYzANtPOQ95R5qVK5ExptrAc,25189 +stdlib/asyncio/exceptions.pyi,sha256=sSiIocmo4Zgxt7_n-7ms-FthtJTCmEC4dbNuN0R11Pc,1142 +stdlib/asyncio/format_helpers.pyi,sha256=ur-vKOrzAmO4JvC4YmbVuQhTDi8giSx0ym7_Uu91nxw,1334 +stdlib/asyncio/futures.pyi,sha256=kSqape-NQOeANur5Z9e6lJMNj4rTgDtsRv5C8C4skLU,653 +stdlib/asyncio/locks.pyi,sha256=2a1PhjkhMpTRmCS49kkF0r7YGwocFL6Gio3s8oGGMBo,4391 +stdlib/asyncio/log.pyi,sha256=--UJmDmbuqm1EdrcBW5c94k3pzoNwlZKjsqn-ckSpPA,42 +stdlib/asyncio/micropython.pyi,sha256=yKAHRdTaLJXYCPPJTWf6r9k7YiW11heX01YIDzW4nhg,1153 +stdlib/asyncio/mixins.pyi,sha256=M8E77-G6AYPE2HyZEua5Rht1DP5-URJ2rBDPSmkiclA,224 +stdlib/asyncio/proactor_events.pyi,sha256=zQnjKl-JdZqz6p4L-VySG6rDjb0_DF0r87twIdaWsvM,2596 +stdlib/asyncio/protocols.pyi,sha256=3ooDCGHhxxYPcM5o20stbqOPNd-RBbiIDNk4ungvJqU,1665 +stdlib/asyncio/queues.pyi,sha256=M71sCrWslDdIlWEZQ4Uk9p2TbZmv-GHWAJtGLFTYA_o,1918 +stdlib/asyncio/readme.md,sha256=CmUrpswtK8eLayHzofxLEDDwPYryiyVlK3G2t2y9C6o,357 +stdlib/asyncio/runners.pyi,sha256=DO4xjsc9DNqIqnNg_HdrBbweDWfZrHguZH8DDZKB9Mo,1205 +stdlib/asyncio/selector_events.pyi,sha256=-40IJS-J9MsqcwKb9SkSsO-5-679O_7ocPwOZQZ44yA,231 +stdlib/asyncio/sslproto.pyi,sha256=rqtzXumHJODjJt0YsYzA9BVk_16lEKFydp4Lo_EOFtE,6615 +stdlib/asyncio/staggered.pyi,sha256=Qwgygm1Wd5ydD1Q9Iwu1lCq5uHRl0q_p5wca_HD7ask,351 +stdlib/asyncio/streams.pyi,sha256=x-l1vbdqy8bPq6i0B8X4mzF4jfkkdIl-UHopz_hrCVM,6785 +stdlib/asyncio/tasks.pyi,sha256=tEtbuaBujf8PZN4GYCIl2ZyOBr-QeQ22I5KEQJa1Fdo,17702 +stdlib/asyncio/threads.pyi,sha256=MEYiLgK_Q1coLUEaPtNQdmOWOMnGaofaSV_vshKvyQE,275 +stdlib/asyncio/timeouts.pyi,sha256=5LCrJFI5pNOFfQWPPTbljcMrAIbvYG8AzuTf5-QAt1g,672 +stdlib/asyncio/transports.pyi,sha256=eFNxnqiwNWvstKzb5aMGbIvWxaIAdNX5msIOWqZfxvo,2087 +stdlib/asyncio/trsock.pyi,sha256=hbdvHTSOHTInMcYxuj32WkQ2nbvcDdmcXooQxjvddYg,4714 +stdlib/builtins.pyi,sha256=TR7v_4KLL5OhAzD8dmYI0y7gY-IJDhPVEIvDAXqsvkA,91758 +stdlib/collections/__init__.pyi,sha256=a6HGdIW4RrokNu1TGz9U52B20u6jxcMpu_bxC0OeaxA,27912 +stdlib/collections/abc.pyi,sha256=kBiZAN0VPf8qpkInbjqKZRRe0PXrZ7jxNmCGs4o5UOc,79 +stdlib/enum.pyi,sha256=x5vIwgtEe_VLYdCC30GwurkMHOBzrNF31QXaUrEIi5w,12074 +stdlib/io.pyi,sha256=cprNnue_TSUsS9-SSKYTjX_1y2rhTp_3Bp1LwxMWQj8,46125 +stdlib/json/__init__.pyi,sha256=RSCtGbMWkNbZdsQ2DoXRW1p8SesGlpfz3e1FwlOtfHc,10005 +stdlib/os/__init__.pyi,sha256=YWq8bkIvatKsakZi8NgbqpkRgUrwk873pPPhYFKZDIU,58598 +stdlib/re.pyi,sha256=M25Rpd8KC_5Aw5heVggCVmbxuxAb28c3fu0Pjt8cssM,11784 +stdlib/sre_compile.pyi,sha256=xhzSJueTiaUdn2OeQbQ7xPqDEWEitDfRA9n76sIUm94,304 +stdlib/sre_constants.pyi,sha256=Z7OUqL_OUe75kpGXw0tHCG4CN62AoY-5FyrSlXFuQOs,3794 +stdlib/sre_parse.pyi,sha256=9PT58-Q2oMDqtejzbWG2D5-UiBo8mQnptiAevjW7ZyQ,3790 +stdlib/ssl.pyi,sha256=lfADY9On5yncg5VvRo604wAmJM8mA9LMSndAlDcMayw,25657 +stdlib/struct.pyi,sha256=Pvce2bp43lUS1vG9xCV4EypjJqH6_WokPudxrTSJrIA,5579 +stdlib/sys/__init__.pyi,sha256=4ntB01895ZnSYU4pQymzSrEpizm5mp9-rrDpACQ-U50,28576 +stdlib/types.pyi,sha256=H_o9m3Le36mQWUCTtW061R5TMFP3EnqLSvupvWJ6jmg,21898 +stdlib/typing.pyi,sha256=DE2DSoBLttgjFWp-27b8krO5RNkxZ3xUwMTwRRtHWtY,39273 +stdlib/typing_extensions.pyi,sha256=AQILGFIJ8YG-c7QnIDncfFLHA3wVC72Ng-c80HSJ16Q,16296 +stubs/mypy-extensions/mypy_extensions.pyi,sha256=LIU5CWrCyJ6G8xqMM_P3fztnO2y177WwSk0HXk_l-4M,9102 diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/REQUESTED b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/WHEEL b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE.md b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE.md new file mode 100644 index 0000000..cd4ef68 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE.md @@ -0,0 +1,239 @@ +MIT License + +Copyright (c) 2023 Jos Verlinde + +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. + +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +Parts of this package are licenced are licensed under different licenses , reproduced below. +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +The "typeshed" project is licensed under the terms of the Apache license, as +reproduced below. + += = = = = + +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. + + END OF TERMS AND CONDITIONS + + += = = = = + +Parts of typeshed are licensed under different licenses (like the MIT +license), reproduced below. + += = = = = + +The MIT License + +Copyright (c) 2015 Jukka Lehtosalo and contributors + +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.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE_typeshed b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE_typeshed new file mode 100644 index 0000000..2ed01b9 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/micropython_stdlib_stubs-1.26.0.post3.dist-info/licenses/LICENSE_typeshed @@ -0,0 +1,237 @@ +The "typeshed" project is licensed under the terms of the Apache license, as +reproduced below. + += = = = = + +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. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + += = = = = + +Parts of typeshed are licensed under different licenses (like the MIT +license), reproduced below. + += = = = = + +The MIT License + +Copyright (c) 2015 Jukka Lehtosalo and contributors + +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.12/site-packages/mpremote-1.26.1.dist-info/INSTALLER b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/METADATA b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/METADATA new file mode 100644 index 0000000..3d7145a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/METADATA @@ -0,0 +1,105 @@ +Metadata-Version: 2.4 +Name: mpremote +Version: 1.26.1 +Summary: Tool for interacting remotely with MicroPython devices +Project-URL: Homepage, https://github.com/micropython/micropython +Author-email: Damien George +License: MIT +License-File: LICENSE +Keywords: hardware,micropython +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Embedded Systems +Classifier: Topic :: System :: Hardware +Requires-Python: >=3.4 +Requires-Dist: importlib-metadata>=1.4; python_version < '3.8' +Requires-Dist: platformdirs>=4.3.7 +Requires-Dist: pyserial>=3.3 +Description-Content-Type: text/markdown + +# mpremote -- MicroPython remote control + +This CLI tool provides an integrated set of utilities to remotely interact with +and automate a MicroPython device over a serial connection. + +The simplest way to use this tool is: + + mpremote + +This will automatically connect to a USB serial port and provide an interactive REPL. + +The full list of supported commands are: + + mpremote connect -- connect to given device + device may be: list, auto, id:x, port:x + or any valid device name/path + mpremote disconnect -- disconnect current device + mpremote mount -- mount local directory on device + mpremote eval -- evaluate and print the string + mpremote exec -- execute the string + mpremote run -- run the given local script + mpremote fs -- execute filesystem commands on the device + command may be: cat, ls, cp, rm, mkdir, rmdir, sha256sum + use ":" as a prefix to specify a file on the device + mpremote repl -- enter REPL + options: + --capture + --inject-code + --inject-file + mpremote mip install -- Install packages (from micropython-lib or third-party sources) + options: + --target + --index + --no-mpy + mpremote help -- print list of commands and exit + +Multiple commands can be specified and they will be run sequentially. Connection +and disconnection will be done automatically at the start and end of the execution +of the tool, if such commands are not explicitly given. Automatic connection will +search for the first available serial device. If no action is specified then the +REPL will be entered. + +Shortcuts can be defined using the macro system. Built-in shortcuts are: + +- a0, a1, a2, a3: connect to `/dev/ttyACM?` +- u0, u1, u2, u3: connect to `/dev/ttyUSB?` +- c0, c1, c2, c3: connect to `COM?` +- cat, ls, cp, rm, mkdir, rmdir, df: filesystem commands +- reset: reset the device +- bootloader: make the device enter its bootloader + +Any user configuration, including user-defined shortcuts, can be placed in +.config/mpremote/config.py. For example: + + # Custom macro commands + commands = { + "c33": "connect id:334D335C3138", + "bl": "bootloader", + "double x=4": { + "command": "eval x*2", + "help": "multiply by two" + } + } + +Examples: + + mpremote + mpremote a1 + mpremote connect /dev/ttyUSB0 repl + mpremote ls + mpremote a1 ls + mpremote exec "import micropython; micropython.mem_info()" + mpremote eval 1/2 eval 3/4 + mpremote mount . + mpremote mount . exec "import local_script" + mpremote ls + mpremote cat boot.py + mpremote cp :main.py . + mpremote cp main.py : + mpremote cp -r dir/ : + mpremote sha256sum :main.py + mpremote mip install aioble + mpremote mip install github:org/repo@branch + mpremote mip install gitlab:org/repo@branch diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/RECORD b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/RECORD new file mode 100644 index 0000000..653d1f0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/RECORD @@ -0,0 +1,30 @@ +../../../bin/mpremote,sha256=bxRhc--5JOlFN19yFeyBH9VXJIkmYE0TRc6U9CnmTA4,294 +mpremote-1.26.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +mpremote-1.26.1.dist-info/METADATA,sha256=XiPdewkwrkIupLuKevz-YxqgbKpoZgy1aj7CzhavNa8,4271 +mpremote-1.26.1.dist-info/RECORD,, +mpremote-1.26.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +mpremote-1.26.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +mpremote-1.26.1.dist-info/entry_points.txt,sha256=sgvfZwY5hhV3pe7WBKbJX-A3K4rPSalISc2Et9J5488,48 +mpremote-1.26.1.dist-info/licenses/LICENSE,sha256=t5Ak-wggyYkaKWW9RhUOoCxzdThAgY9_-bVQ0fauFuU,1088 +mpremote/__init__.py,sha256=uCMjbbM9nO3VqYqqvGIZIzXy3juW1hHD8b4LrW0mWiQ,438 +mpremote/__main__.py,sha256=4uulmJ59a37e2DlZJwGhd0wmwvK1KHTbeDnhBWqpFtQ,84 +mpremote/__pycache__/__init__.cpython-312.pyc,, +mpremote/__pycache__/__main__.cpython-312.pyc,, +mpremote/__pycache__/commands.cpython-312.pyc,, +mpremote/__pycache__/console.cpython-312.pyc,, +mpremote/__pycache__/main.cpython-312.pyc,, +mpremote/__pycache__/mip.cpython-312.pyc,, +mpremote/__pycache__/mp_errno.cpython-312.pyc,, +mpremote/__pycache__/repl.cpython-312.pyc,, +mpremote/__pycache__/romfs.cpython-312.pyc,, +mpremote/__pycache__/transport.cpython-312.pyc,, +mpremote/__pycache__/transport_serial.cpython-312.pyc,, +mpremote/commands.py,sha256=qMNSaRwLm_HQJhPcIOzZubtqGgAU1Zq2M0z_CdXlRhs,26587 +mpremote/console.py,sha256=doc59IfVkosiqlexQlZrLRsQmtzFb5hrm7q2HabKnMU,5280 +mpremote/main.py,sha256=7JS0_t8fKCwISGX9k4vxojWEGFYqVla9U5A4PPzVF8I,19305 +mpremote/mip.py,sha256=IRQeQ0jkYxvo0EPVCaEHVoP5xSZ8JPT8qDdVBoE-Pko,7380 +mpremote/mp_errno.py,sha256=xlupFzO1KKSe_nN9ogUIUZzJsCJKcsf0TyUyCDG5bvw,1280 +mpremote/repl.py,sha256=-qEslvMdWDfGgbglvIqdT6zgwbtXeK_m_x2pGvODflo,4679 +mpremote/romfs.py,sha256=j-aCEzxWg4kryrRDgO_mETEyg2xpZyxOnpS1mcVDmbU,4966 +mpremote/transport.py,sha256=rTtyBJDYfzTPpLkcAJ30avaql6Ak055ekR513SURza0,7608 +mpremote/transport_serial.py,sha256=Q3jFpmZIUBi1RLDBbU83EjnMD3lcAN2O8696Q-6fNTg,33927 diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/REQUESTED b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/WHEEL b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/entry_points.txt b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/entry_points.txt new file mode 100644 index 0000000..4e023f9 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +mpremote = mpremote.main:main diff --git a/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/licenses/LICENSE b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/licenses/LICENSE new file mode 100644 index 0000000..a9ea6c2 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote-1.26.1.dist-info/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021-2022 Damien P. George + +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.12/site-packages/mpremote/__init__.py b/.venv/lib/python3.12/site-packages/mpremote/__init__.py new file mode 100644 index 0000000..d141623 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote/__init__.py @@ -0,0 +1,12 @@ +try: + from importlib.metadata import version, PackageNotFoundError + + try: + __version__ = version("mpremote") + except PackageNotFoundError: + # Error loading package version (e.g. running from source). + __version__ = "0.0.0-local" +except ImportError: + # importlib.metadata not available (e.g. CPython <3.8 without + # importlib_metadata compatibility package installed). + __version__ = "0.0.0-unknown" diff --git a/.venv/lib/python3.12/site-packages/mpremote/__main__.py b/.venv/lib/python3.12/site-packages/mpremote/__main__.py new file mode 100644 index 0000000..a91ff67 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote/__main__.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python3 + +import sys +from mpremote import main + +sys.exit(main.main()) diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098059b33af52040fb98b58566ed921b106e14c2 GIT binary patch literal 548 zcmY*Vzi-qq6n>7AULf2;tJ^5t^#)GW#RXPWG4MkOQ8BP^LW+}y7Wb+nNWu925X^R{Zz#?-EGd2 zk=&MQA~$+od6A1uX_NBJP%uLiYN*C`gswf6K@`pBL{S;sKP^2S@DWaGA=7;_RDu!1 z`4%n6Z8m19$^?^!Jmj%fv64osG-aA-n&q2J>mtf{tca-TtT00*$%IieWV+AgGeyEN zlVf7_kQsX;ymp=B+^~K&Gn$h#ZzPJicZLa1^A z)cNk-s$AFWersKNv-PFbI|%-K4K5#p<8^C*Sk{!Y304aZaM9_h}i m_HFv}2_cIfknK;1z978!AH#=m7R`2EqNnJ2?*n#qXnp_hSYZeN literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/commands.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/commands.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0e1fae74f9519435fc9615864c695540d4638a9 GIT binary patch literal 34860 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 Wz55vNgh%}_kMh5+Hu2&YRR3=sYv?=x literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/console.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/console.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c035f53ef7bb3843ca090d9308098d3b4aba30b6 GIT binary patch literal 9036 zcmbtZeNY?McHhOYvud!A>#4HUSF*zc+8Bx* z+Ht4Cv5QI40Z;SB_KaKGji+}1Y5iv2^vz2$)9JJ`MGst*9XfHR`N#is2!1okq<_4g zb5|<~q1c_*3;Nx2?>+bX+;h&o`!D(Vc@%`+hW{SA<)oUq$@t2&*I#o__OPt+{exk%gl^i(>2Y1=u+O!~{! zTB<+6F63XP{VuWa0`0H#Z!+Ury2MIxlfG&+rR_ltC9<`YWQR2EXW*ypDd*?Nju`#M zGt|}9G3o+yh8m-Ry9&5D;I{em&QRmDUg9ozhSTx|)03m9_i2@t#qfZPQda%rpLvF& zBcewMg@*gaJznv=7>OMJ8R?4+C^twjJ;}JDJh=| z&4!js>f$AsVOc4yn46fLST1ddmo`9#b;VM2ecxQuY||}n$x@f7sJglR#`c?@8=jc= zYKKLvC>NuA_erxoNxw?EiWGU#%0k)EUl`hwwt0hL|Gnad$t8KpT+-vr2Q z21kxFm&K8iPkl@jmBo?c%pixInt+lZ6ErkKRRL!}D2SP?Srnw()~Sp!<~ZTW_F+Xc z_?&v(bc}r1Uupy_p$w46WsM=n*-h2T<}FM2pi{`3vBMR5emc&*!x`hRO!Mm0B>j0( zPtz3W2cu6yMgI&X=^3H0^cf0)+b-cMN~rE6+*Q?hq`RZt*Q;{vt=+y(h-@^YK zj$8e!jKP`r9c3`*ePmiSQVwT~jlDH(N)(k`|6sQMv%#AqH%1-|K8)Ot#H*SYDi6hr z4t-_%C(Exb@uCi$)sZBsw`jztra9}ZHO_BJY}uO1$)C-S^HnRneVH$h^X2okH{Cbf zcTV38+zvbvp72c)PA&JbKMy5fq<@cNpCJ@E4mb!>j)R>kDEDcfo73c>9tJ_=L25t> z&ywT-&@{fbZ>)GBq)Zg9-!{mqMZRhP(6YG~;2$D?7kR?BX^ViOpof(1I}17M7D4C8 zh+#sRb(1BNbS{lJXc(jhsm#erJD`G_0YfN;#h{`IzhOYQpOn+Q(eeI(EJ~ri@H%Pb z$NEA_aHvnpvN3u#uAICX0A!Z8&E!w#UsvYFXUA`CySwxD&V`a!A8mcq|AcScC;_-< zMDe4A`u!$9NaHlYIbop*2$}&vl|>w(WG*R6!Z4`1>>wC)1JZ-)gVEH7gw42F$peul z8mQw{RucOJ{ctmqD6d~FEX}c6diHi`LT&;8S+O~1My5yRdvBh(ab~{bUeUeoM}>>F zy)hK3eZPaUNj#RylCtmHu;=D@KVhB!M6BS%&M z#hE;Js5mtdF-T~sRBlWH|3jA!2HdI4iAs&YlcmB)g*}ijqvD&QKwZsPr>)C;MVzmg z-}{8$Oh)c=o6&KJ^o@vtfSMNwj6{WVVWh2rzz660!di)hmPXo!uoGb~!fOcF^?i!8 zMGmHf+f2X$guDgdGPPzfa|hN+EL`(i1Yu3p8M!U;(rW`G7XT4p<-*0u~7lK&Ma)SR#}H zmI>v66@m+}QrHAoC2R()7PbIx6>5Z9;T54ys23Upx3KLq{;%-nwHE7?rz$zRaNw)*6KAqsdYZ9C$;{^^rSYxb9z$i zb3U2etJS@wC$+ji*ORR};nj)bI&qW?bnhjS-rKbQ5=rmT(t99HrsH?>B>qc+a|CY^ z>>>CG!ES;d6Z~|YNki>Sjv<;4cp0JL-U5^s$i0R5C2*TCf&vZ)g4rg9$oxd<`i)C@ z^F7dzYzBa%RZ^Q^rX27d?c6Y3)Vvdp?CFBf^DY#~=-+3}_RguhXK$ZMXZafLO{2KjbMuK;u9(YykA?BKhEw&G08-z$Tj>zYOlA?0&_YZ}X>}jdyP~
t*d1dgAoPT@lKPN7~ z0qZ#m16EljG$O)7OIQ>~rQMK2^k-5N5YxOtYw7-BKXSJMz&e6Mb9naf5_mHc%k@q1 z`lhA&Lo3#TnK!53ysj)+D_0o`mU=zQztSVpWF#DepDyifJdJrxq z>-3=E#cQtbo%FK|z8tp?osW2=%y~*`$>7IPX9b;KrpKua&KI@}Pwi~(Th1hnM`8kg zss8D!Et7C$#;F=g$P z!CP5yNHuk|oe7+1IjQm;;&_`RMJ3%qHUx*(i3&P!8$?BSjt8Jno&f++vDjytt~4b; zI6AI$%M|M^3zN3 z6tz<9ntONl-A~S5H>?_%!s-*Wv%$(w*^#L^%_MNR)6it z&D7+Rw36b}wXjqG$1(Lb3>A_=7lH`90$rq))aK{9$PQcdTIo2`oqtJfF#p*>?>%iJ zOln?84n<_8FA{{~-#@O1vT78>U{nw#yhusd3~|W8MF^jhha|j#tlRNM$k<>p$yEU_ z{xb4|4XJ9l=XfA4RqcxfXNISTuZADj#F!P{GLtu*x6GG;pD^!O;y10!dBRr^h2V2r zC45(s4j~*y7(*Zz2x7(2YHPO$)Mi;%3F!^Y12sTtw}}>{5DvgkE(5)CnOZee*p2x7 zBCIk%JtY(e6g;Y!^C8!SG_TQSr1Lb|g0xkm^O3e8Ew0*;F3{*gq>GRqTy-Gr)aYWQ zODJ=}_0rW+q{}qA9O(*;$AxsIMsGs8O5@p#bhSorL3*o3*C1U>6_qCn%kbakNMm8~ z+FmH0I=1#Y&6TYgX|5ch31L4%BVM95t?@Rl-q) zMa1ylJ&f~Syr0SP9D2{$96tW+DQv5Z0DD+yfe&xIA09XJ;W!W*76D6jW^ErH;W7<@m_ zAB~2kkD&iq_{m!Vrl_y&#VbW+bDmkxox0_%uf?~%wz#!%vFPA}^u4tncZA-y6r)q|!Ide*}5OSn@8)Zm*iwRZWs-tMh++f)O5Q(~i|B7C3f z3Uqrhg=|kv4<-Di6y1mjA(zauwlJrbZptAi_!q7i1i32KkzAt=E zRBb)$SX3?;j>@9jsPYkU3?EfQl^yAm-v`Z1zI?Gm`2CBIh6TM4SY(tuxY9w;9y#ss zjvWX_Bfv}8q@M%BXYiA608CN8HByC+In%6Z-h5}z-NxIEiv>Gl+^T^$SFSk9mmT$S zNBuo+(XlJ$T`Ao>cWL(0VrhNs_=?rJY^{k~Yi@ZT)IHpBf5)Q>i`)KS$=Z@|R?aK4 zUHABhw)?inwU3MA4Ts~7H=uU9#=Y7lt0&=bp=bE5)i!f{`uO#?uXX)!^@vXXD5K2& z^$~L`M}5hawpKDn-Eb2-mIA`339XtJ-mpjmiCd+sH6}jpm{aqPJ|kT zSOC?O+ygc5RBxco*K(w@%}e$|x`sSt+l-(_yq%rezLmChcXxFM+I^>5I@`Sg_+Zd- zqOG^BTivSF4xDQ5?tQzZGXQz;{Q!uQ-CeD1Jw5HdV?>RprjuQ8`)uo$P@$-%&Xbx{ ze2gg`bSP0fs_}S>&)eCi@}QZBHk1AW2ZWm?;ciLu$Zt)){b&SMne1=BM_`*!h`@(--IckJ%;rp{e6ft7;cmSHkUCVC&XchI4{}v~P+H z%tWRm^Y7d|d*ke)Z3i?}zh~~IzwtUqDng6re%Td-ca0xkAqPXHp9;^`O`cbZd6}!T>dZ;gJEM6n^rKix# SFkcyHM5D=Dz}=ghrvr#|2qW65JMlExcA8L+ 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/mip.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/mip.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..759d455b0783f1eb262b1040abf981e32d218b38 GIT binary patch literal 9816 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 YkM72Y@W&%~J>HE!>Ga}*xJ>eY0pPuDW&i*H literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/mp_errno.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/mp_errno.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4864c9b37c9d41b6737ef36f9f87c24ddf67a97e GIT binary patch literal 2938 zcmZvd&u`Oa7{^~XNt3im3;o@c^cPTCM(egPV2lAy{HFCtoXBxlsit*lV`xeeXHEb` zfYhEKCy;j7CQaIj!?ZtThpFs96)ux@@?|pPhIZKV*cl%5&EfmLpXc-D^;^e&`fE7c zMc|{({0`ddGn8#knc!=6u1&ucSdfVE0RKoMs~n``1zJAc))aiSSJLG z7fgU@d|>R;yl>$dX-2>- zGR-KMWu}RMIma|(V9qnmF)$aICJN>f(~N_;%rp~Vt}x9cm}^Wk1t!Kc(_loVISwYl zGS4|MtA`C#KWA2x%&N?+W|&olSyh?U8_en&v%1c#e#xwU#jJjPxLP>zWB56@zSKc9 zZl`eA|I#iMPTsjdh=K3bt;4IdrNRt801d9e&7CrFfoyV+W(S4`16!X7U6YvD>P$Zd zwl*_}fvwE!#=zEPhB2^Jnb?)gqZrtQ%zg~)I_4k-b{TUR1G|bjih*6k9K*n_VMZ~q zOPCWFlNeJN*agfDh`F$t$N474ZH#S}0;;S%7vZ}N^R7%5KUbBbgn6%RJ zhjL616Y$0Os+1IA6jlUDwl_*q+)#+eX%@zWkW1pmv0U~hAYGHPh-)IfVXwv! zcU476fr6B6kMa#6i3<`^lERp3kFZd^313jx)EI2&qX|3~o0(O9DT2a9WqNqr6E=$40)3PkYpiV_F zND9qT)jo7A2UqdKp|RWw;Gbd7f>f1KaJ8J;-aw%V*i8glO=r~{Y$3pX4p1QpGx27t z8}4{UNw2`x*;bIo1vyTWu)Zgi*`SIdr#Dm~hBupzn>@XM07Pxx)U ztnu|?aVOv4MeUwe(yL{yQs+~}EkobZD|JIJl{AAl^3~cVJO+)8YH>^F%c!f3`nF!- z?`!$`wr0#1E4Orh;ht8x$CrwmykpNUEG_f3VqKfB=C|(TZ)-KaTs5?^Ue{os_@0KE zA!`tM$mL<=5tm1iBQB32A9Fd1JnnFJv)h_Lo^<^b^7K3Z`Z)3l*Ple5aX8!zTc?m` zT|b9>+U1Xs&$v8~yx=mAyy)^0^0LFY|5@a74&!-0Mn3PZzkqzvhGR`?}INqQwO8tKSh6t?#j=WUwDTs5AjYL*oOZFQd3Ac literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/repl.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/repl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797f93330b28b0476cc418b4921cfc3618aae12e GIT binary patch literal 5566 zcmbstTWl29_0I0>`)PY^uQ9C0PgsN3#=NO<023ZbfF$5hXwYid8RIeQna!O6d#y3W z4H7n`!l{(vD3wCmN&%57d=jaZs1hki{n^Efb{SbJQfXEHL=L7(0zW->ytBI)leFqx z`##RO=iGD8z4tukuO5#RK{>qY>;66E2>qQ5jAF`n<~yNt1#yU@;%JaMMh%*dnJ6+g z#m$5CF&g^j^XQm`qoKBP7N~7WYuGkR0b$sr*?J^Vmg2nT&UapyWMMc=Y2L$_73GA4 zm6tJ=aLk-vk+fF$C+++tnyl`CpGpl7j*E(l1`J6{FatofxZKE7Q-qUkF&3d4dC;g; zwN6slqgpxB8H7y^l(a+Nd}`X9&334mnEbga4o@^ zF5&z+aJJ~2FRPZZUzw04R|3S7TG^{!e*+yNeYwRu6j9*b!Jhz@(b?rjO zw<1JtIOjQoWH0ActufQE>C`fi!ovCVwo-)mEtae9fjWanu~kd-aA_sXsW0M;9_LrB zMWC>o*~ky2%FZ9=$q z)IsPuSCL-lS8_X#!VMdBoOJ+?z(Q|`8bSqb4JF*FMjcACF;)vau*Kk!q<)d-R^$;b zJ8(E`nkTkogFmrdjqlHTtyDw|O_1Jf|%6DN)SJyrP-# z3E2*8bmOMT?;v5r4$?&uso9rL#&|0 z`dO?w6vLouR++~F8`tcZXE`0|9>RjcM`H?(M>)-+k2K4Pq{7RZmlqWtM=?7DvL)gg zEhTtSqY156&JXi39VJT9J}DlThOhN3+NZtMHl=aKv#$1yL(A`qF77 zx*&Uimt$;#kBX8QO<+M(*c0GnyfKO6qlyGXerb?zR|H{zO}6ji&+u_6F$h|0-!H_l1RN9$ zs^W1wW)t!W9^+&*A;hHiL4r;sm3~QVAL3c1pT}*2*eA6|&hX-y_PB7OeF3{JvbM8b zh7)T`u(4C@NnUOrOkjRcQuuaqMv+8PE8`^nyrP4wAV%Yol)#%nRB}7y0NDF;XwHgU zzByByqbldF%DU^)?z*d%PkbNyvdqRbvoYh|l=Cmk`Ww^!#%X`^_zunI&s79c!Pay| zYc5bT_a=qhWpi&(sH%Eu<*(m<5U9Cw@V$fCKu0>zky^X+UZ5veSw%2c#Z=37pjbe+ zrUR`DlWvCY1-6&YxgTi$1D{&ceLIw1b1?PBk?EG7W&%eGl%457=Pf=J=*$Fm&D5-z z60dR7HS6XORoQy;om_pxCsiL;{XRHl{niYSIhwAFP>0GGs zBk2Pv8(NFqHFe0Q#*2X zOsZ*Px^CmGhTGJiBDW9yIg(>KvdpG5v*{LfkJ0>)u-ueicDkJxU;cIP~;AYY`WP@#YgKbaeEP#0W zID-7uAd91F#<%jCDdSr`Q(X%ieLCj=*c16A+>Up<_BNrvP&><^`J$q1Plx%7COhf3 z)$ZAbzO?tWz~HM6%bu;auQm|GSKAzW>&6a}()pT(2Wfd6^ev!1VnM@c-Wny{+`V=nr$ z3G3Lh5)3`D$df7s|33k7pAk#J-ppgGltSF3ng^<%myEL(<3P@C(2kl*)^n(40}lG9 z$Gjytr%Er{TOr~y&g7zP!Zz>&F%N~tt>d;n@Zjg|qZS7$Mky+qu&EY^4a_S2sryF$ z{D9jMF^I7mg+N*6^^kr>_Xzpfj0 zhE>4rkF4yKd8P;4ZQF51!VA4&GL`sEM(G!1M(*e1@sXV`6GujZ1#o3;1y{!CzPX(^ zZ#D+*Sq1>3W64zT90F$g`C*1QJP?LWD5t>-o@8WRmcfsbm57gH8k*$>%`|jk#Pqf} zV)8h#8*au(pdj5VWafgm90?VmuNI+2HnGy@N}eXUjPnVo-Zx!A6Q-q}vsw}cPEcbF z6E8^PN}d4q!_Pj6lIS{hAZ)_RVP(zI7e6ichs_#wLUV&6K@EIV_wKg5Czpw+%(-)T zBeZxmR3i;}*BR-GOEESscSj7bUkES`!#sICRNtLLIlJ$&XTmedX6(V7t2*Us%(;VE zcPQ-+O}&$G*B3_j+{~N>xtr#J4u#El4K%ooR1pFw(*nFG>jGi{;-PqQA>eXy0vCl- zhI7+NG+TZnnrq=?qU4kd1ATWE{Vw1j@YMqtAqKG!JIG`5VlWB+H5-W(*cgwA0yK*r z<>?`UMw3gZSz>WX=EHUzCU}~~C*?&F>)OKIgyTz4=>h9PB(#0Iu1?LC*CgH#_@9tD zufi?)9&|=KvUDg-hcYyy_XBAs>>u~) zgiTk)jD16XCSe@88A^L!%GkF*^j7{-IJYN9yDsb>+kgJxziHZ1Kj(H^>SugR&Rv#s zSLEC)a`hW>wPE;s?6LWsbLGh4zwDlHU-B-xG~}9?;hKC0^^Z(>B9r&}CGFp}8GX6A z`Q;VnXI>#mI?3tIYfxQ)SEv-;sEU+=12&90KBkc1T`wwp(kZ}KD}_%Y;Odrelg9hx zOs7c7TCwyj&P04d{$mN1q!m|wF>vMvhl{3@h_n2T8l{TPW!%(9an|#8mD*MK5M#_g zgp#(fedI$Yxp+POeC!k>^f9amhBTiufcfHt7~~8x1CcyD1g4l-M4UR^n>^SBQDzR~ z(>x&u`?(}Nf#-Sjv%s#9q43-qozZTv7Ca-7$bCqV`G^k0ufaAk`E)W%)O$E=9`PI@ z`4*!HgFKj&kqSr>o)wJeMk;&akSFy>gM)ff#PqRXu(@Z>mz?c7_@8fq>V4`}NRLV2 zbR14-lv1e)_(b&^>IwxZwvz_C_($^)g~=K1dV#ZfKUEZ5|>2RjJ zciPvRviIg(e!Lx4IRHkK7)agHVzO)9FzcDJZgF+UYYo{IWt93e?zVRK+TV=omAPQ0ctf>KmRu6r^DW#7eHw)}1#5gCIfLi9sc0x40MIh)a zkmKwn;z83KahtwG%#j}R1|H(`kSdL4!$Ez#PRabos}G^FM2H05z&Hg{&;m8i2=q8B zFykhHh2>1Jn0eeHaIm0NumH6QR-n9K16n2UKmP={a#S}iz$)(F)=o%1ywr^>%S zA&o?)FQAYtB8i42zxlTwgb%cVH?pDCFna?FX@dn4GK8)DFUf)6O%MqqiBl62?(cs6m);wZY0)c( zLX&}c?|^tqoQlj$i(%P2915aHFcOwgWNJ!8UKE&-u89cE`)5MIh<6${&&Xm2Py5%G5462rH=Q=w~Kz4btM&wj52$KN{x%LlHDl6QIriPI5T^rFc0gw#DV zuX28WC>)ag{^<5nfpr_~?XX!1)QY%AK90vUzlUMJ%e)TwA4LBvU@(Kinf1Zs~_lLg`7;d&8hfiXr#%>-d+A&KWJ zpM!kRF5?xo5~H5x=NlzFtZ(Bka5rEELcjNWP=o6+g~F1EWR=C&Bzb7$0KUrJ3QWz4 zs#y#NBZ4Ss8sm1mQ8jMl{W{w}8w$(O#;uYnX=;GZ(g+ZcR&B#_@8Z!^cfy?Gs!}_X zwgj8A*QP%D*<_BdUGOD+%RS3NT3iu6ol;s3tn$4%z9tn&4kZRRS;Da`_0j#w-<`E8EsQ zM-&jJ*O1Mspp3j$4G`7(M3?IZ&)0fzUhzxM+8QB5y(bh2^6NFhty=L z5c8djVj>9{V}Vw-=o9VR_#Y?;iyaPchac4>-j>C%fOhCSO_3NOAO}?X+U&$u9Wwj% z&e3gK#i4WCVFu}KARrLCb0Lz9EMHUXJJUNA`&$V*$JrLFNo%Tim1|gcI8z7i-%dDm zag-Vm-nb?X0=Sw+0HeHAI=+EuAAoSL6<;y{0OLcN?c)=?!eYAT zG3nPv&qQVr7M9A7oEttl>OVEuH!wJ&DYt%?tPTpKAHAh@%cFu{Q+Av21!f@OX#gh- zq~In(;lNZ#63g(^U}JA0;Z4ImJL{Ibi{3ToF2%Vk>+DFH6J(-yy}o^|exFjmFTv;P zn%3$%l)8@3>6L+}mTcYrgl(O7r1&hq<1w8c%DVR{{Jt*^Jd^+au)-hxid1ZUU%mH@ z?PRWLXL?8hkRHl8T+25Vhi7F#aqLSlU~386n`Ttd8y{@!&(WJ0Su_?yhb9U)MiTRR z+%U`~Ff)VAr3#h-EYZxx3=T3Jm=+~$*M=0$5!^3?%4{Xi?SY;W1|pCl$1gaNjy0}D z;abw>&l{h*GOY){<$my{abPvjjAIijf6gI|gBivF%8vzBR%EPeS}9_Qq0(}}Sg>C+ z{2A7Qg2ED$1>?z2gIkG7EUL01W9ZS!Bz8_^1xzoGkjCox8a$LwWdl+$6!KU!8$ccy zS5$a}Jr~-Ii5nBmI9$4Mj12al8yWBqo%Rj*2TsG+*twBQdH6^8E>wJn81=RS9v7U7 zNFu()t)Yd%?uDV!Wgu{kuGUA#A0A(Gbt|s!tZSdbH6+Zbda#f+XS?ETf84)f{_Jel z+4IHVmmOan%JvQ^&Y|bm73X>EUHJt*$*0Da#uvvQ^K0%?iu=^_j_mf4Z@JMob-kbl zpTo*aB~cv+yVSKnD=vl*1rlS9M4cf%hM2FC0syz50{U1?WzMKiYGJzZrT>DelwDRa z$}Fl;6h;D`Q9j-Gm^6seZ?WvgS}WXG-&mjj{lSqFePgGG^G2tE+7^Q|P2a>97_Hsn zn{?)3*sC-Q2Pw&$4#p78=d-|hq9Gw}iGvnw4SXqcAW6J}N&OAKxIJVX?s&tHI z&R@zlk7pg1S3eBo`07_Q}wfqrXfA`#J z-xxS^thTz5;Mhv7d$aq=(`N@gc~1|18@xIAAyunkV?eEVoK2d&24Soo-QtC@ug^aV zz-sWYH>?ITk3(1KIS{ZKcnUP64`pljB)C#Y<31bCI`?A)bEJN#aIS=T-L^e-<1xEx z+nsA_S!>#(H0@bA_3XVTL)oSuf-~pqmwVS-U5cw~<>Irzlgn8b`2EAUp*AHiMHi!w zyVlx`II(a=G}|g`b!FbDe+F;c`j41_HrLM&^2zC!tF{6 zznc7X@{8uRo-w6oEc5=A?CuZ0<@}n#`aHGx$%qBz_rvSfKOGTfr*NJ3`#+iuOzABM zN3v?en<78&J3l%&pfG1CB%BClKk z*fYn-m{|*zxsrJbuF2RcKn`c@BW{VAV#9&AI3^6KZ(`KZf=B2BF84L4a z^(ZSw%tjIqJ{Bx-Ua-ciVl@F1^BE8 znGR!K$s-rw@uw|(dQr$uK`)&muy)9J*b()SXfq!T^Tb#Hc+KC=QBIhWQxCF0RxW|rshSBMJO?pGbk3r#Z?4-Gl zDE-0Sy-@}ubCizZY7D9;RU%45l569?;oTl(x~FI6$24~n<=lIZx$(D3p=+KRm4nxY zG#8R@s3s|bWKmG5h@_g~9VbKl3VAy@0QsUB1lb=AbJXe}q~QEW49+4c1gX1u4TV%@ z2J&%`V3M#0P^(}8KP2lU$q%_um6;2KWR<~>7!9dZ28jVdHQ|)pEfG?d^sNb4R6;?V zG*o$QIX`6VCPKGWOJOdRh9F$6E`0l^LlT79Di4GFIBf_yL`h|IUxp{sYLq0aHho5D zNAqfx{-GZM@?Jtn@MD2kH3WyG1PZ8}R>xf4m`Llx%s_%trGY15OTc2^T6FY1kFN)l zv+!T~H9!PJ`Znj9&865}%l)f1z+iXA=FVAb?)B&D8#2tc_1eb2X?yhc!?)8HvQ2xl zwcYp5=Bk@t5nXI2yk2XYmd6&4CAjq}$HIl=h1A7tRZD_;VRNL8rYWVi{To~RizYYt z!{)Z+@TQ4y>Gj0$3tLqpkUW?=@UtKN4zg@rX_w;cS`nU&KABwQ59fHt!ccN(nOWs` ziq!LwmySKn8MA$;9whv>D+p5dEe>ZlF3l~@E!|nX zlb%|wKd@f^R;GSmu5I_SdA$`}d$#ol%S^7J`H|(Jw6lSe(R`PuXZk37A?zN|6bj(d5Hv3Z;q1$-<)Aw-&>%IHpOcRhpPW<-+6L7 z`!CzslP#7)wj4XILhSz6@TEPjF}JLgI5~iAfOQ;^6Gazi01D)vuou;eKvjBG#R~DY z0kEZMyW%<|VIfK$-xRD0F9E}W#Ob>N2x$vfgKZl%# z99MDQOvQZ{vRr>U^8cJIf~Z_b0aSYK3#Ot3E&=?;nLEsbDgAejEc{u<;zL7lj;Qy< zY-madg|EA{zW}%~PD%5UEKYa1rN}G_if(`rF(^mS{1Nw0;s~2=v}O>Y2s+|EH>y>D zkN=o~$Ler8cp-qoFzFHZ)dDPCb?c#_I~m}TiAdC10N#R;=^2Kt|IS)>zx!T4B;;9Z#`>c* z>j}kr0um9{p;hMWI%7$+e{yD%V%Tl#u01RL&+5Ny`!bYuoyu?x-&qOB*>Y7G`}tMw z{oJ<3gyn_JzHl^o^!~97)A)zq*ART|OM-%-xYN!xd#7UWTybXYU0)pdha-P?xipo}Ew zhTg;EDkeA*MHhjnw$sxy;On#-)kUu1HI@fDjR}T!4ai?}NA$61NCPR~r|G{*BZ#_m{CBGvueR+b~Pd2}rBx}j0KWxs@1P3Q2$;RBahL4Bw V=tdn@{>rqA_@&uP|1IgI{}nk%U>q<`9M_TE*hx3US&h)W7-1oib1%jy z!t3#P8`yQ%rn?864m*=h_aFb$A;2^lZ)e)? zJJP)pSgiNYoH5@yI`^D&&-u>x_ULs1-N8IOpc5JcYf^|yR3^&Xuww{y@a{iJ> zI4t1j3}-CVt15bbUsQd>K_7G#zj7{k^3_)ZXM-17+s>Q}W4BpEXyA61{}g)1NRssA zKh2I(IE6P~H$?R8_6gB(HY+_gvz4nA!JI>1{oNyb9JyI$tEb3pO$1QbhCIL)=ql7dj)CJL4enOMzuPvbc<^8@A5= zt}c}tHch9Ius4cV(<_lM zjfdkgoyMb4l{V2(pVp~TIvDJWgyT)U__%LS?~ccs2Go$=tJ2_VRsUj=X=h%sy(TyJ(E93mmC}xt?^YUN7Z=61IJd1 zVjG4(tC+g8?1HW_q7pP49Xu!~ZxmlJk9CsLI1Ts(!x0Rkwg!WSGZ^fREB#SyyMn>D z`$N&plg|iy3*7(<(kheehK7dr>L!^N9hnjMaMfnAmV+#Bg(vUkZD*KtaSC_S(IE_z zt6Yb8p1}6XbKASBhS?UwmZHM~*v7x*7l8a32d08ck|4A*CCS4t^Z0qnIU*#r0F5OUkfsEbb%1XX%K|AuU|JLt-lZC92gXdMf6}0MvIyn?V>(-9o-JZ zkb}W+G^A<4poV71=ks09aH$4K{J^n`G1f29Y8Xp5BH4rlUtqYiuMexyDD01;JE2!Y4!n@r26CMuX~YL;d%n9# zzU2j}Zjk`VTpB(%oJxcSsjBrybv!3tykXaLln50y8F&z99a)e7Imk8B@b>MGK|nV~$bBO!c10H}92y7EG5O8}fakn^CvI|zedu>upZF_b~NqdjZlpg)M$aVb`Q`az@#ww;ZE&mX@a<*P62Ghy` zJmdkciHZPJQbeFOr39cL*I`#m6+6@ps2xztiVRPkiW6v&QUuh+pq?AXyWx59pv_-q z$d)}@WdQI}m;ty22H;)W7}3!Jv0^IkPi(`sjJ+S?6;L)RDMFG<0AP!8iiq`)Ad?YW z53aMOSYSxJCJt}|;VJ{f?+mQM*|;Ryn&neK(0z_@g^)Hd zxzIJ_;ct@#h*y(&%Y zu>`BJOAAIL0JkEvu{jzKhoV|bxMPkryjAWOu->LbJIDLH-Y*IbGp}x!C;DenXt81w9KNjnD zYIO!-!1vA1IK!=k^pLe<*8SEaG>zbOQ49S}Lq=d2qBJx}+o8u0RRA%}`!ZW(2q8^3 zTwoVf8j1#0uxJ!T#t@=v%qY%o%k;r^TFahkG)!M)t#GeG4`Yk#q9>uwGlm&&Z#Z+z zOH>qM={cPCDjA&`i;PsIERHrn(a6nfz<4p2z|V3vh|}qw*up>Dc9D&Z~0~Gm*V|XGY0}GS71qikpN3%=XWc1Qo3V_ zaB|B+`JTzvNiAJ|;9kXy>)3A>1?c?WB^wOYAa*8y@myOCxqqns1Sd|{$Zajcbc4I? zurPgCf_7mm^^Y)ZjL2w9EIS2V*`nlyKDi*X5Lkiv1>lOpo0bi&nyDye%{1ErFHE!f zoGr?SAz97lukks}_KSgpY)N&Z2&5U&D@rnb3HI-|(X&t)d|b=m+N>~vB%-h}Fo<5! zFEHVv7og2VN<)3Oe5xJ92-i)Nt&$<^Qem8i8hD*7@*>JcMjkHDx^^shHjK55woKH1 z>i^I``O3Z5e;NMgi>Zdw=^cNN_MDk73<$4*vRbdf|26Do|>+b0M`YMyg>$e(_(@NyYM2|s*A89!!OWA z?PCnehNBs{Ap>jFt6-nBgl83VGM!PFq=CWDvZor^b7thsxM$Y2W!~cj22>&gsvml) zP>`!1Yv_G$lvR*l$Ufl%&bQ7{yJ6JtbJQN|kT4-zhWI3}a0y_B!e4%#0R97JAQM@! zm?2oq5CakN0vsOKdJ#m0am5cmGOWpy9Ye(EV72f#fI|@t%y%Le%%M?deHyHyH3LEM zk>qON$yoDf^MsK0)XsStQl5t4_W6pc@q?qUOoURNx*1nphG)E7{hz=y3F<7*cI+g7 zDen`exP8K^5E0=46OU`qV9^Mdgvh{z7=@KSDdfcC3oFZn-fa!9&=Ffo|1?JoVwL#A zfr#Gii}$IqdUPm$Ur6(Hf!i7A2Ds|m2Q6Rcu`cj%A*Ft2zaM@^x_q&??(00#37war zBjceu8<=aV^V8FCFu%w&oh2di^jgY^t>FxJ_s1>=FwsGmId>a3fAZ9qyJy;8`$pj0uXBq6kzI=pA!iN3v;L#QFF$ZK zKTYE?NE-2OCm+hq!e6hmZ>3cyX5OrLM6%)q| zNz4aW*J(ZnMd32oG-pBBNDG1GjpPfa2(3JWxxx^HYZ@2Z1p!`x05WMa#{t3>XgLow z7fR;PGk%J?&2*N&7YXYJan_>zF0I4Ry4$&hMmI zflWxX{+%KJW4Ws_9F1#gy&s-2Yq1A7L<30BAJI2~7&ZW55Ct-5L|?`3oIi5pL)C`Hqct*0(t1`*9gu4iY8x@Pm_J&om zZFc_{CTV{QOO7!uyJZ*dPj4*>ewCWp?C9qMfH4X)mX`B$%Hgpy6d5* z_F=`&Pr{S+ANNlEV78)V(M>$w#bV+vW0(qkC5;)uPGR^<--{eQ=Xm$ zzXF1~kqp^E6bsD~a!Qx9f-ekqAmjs@C#Zbho~)4yfwlRhNWDL@6?&ckRT{E^vWQ9B zk0diQ!uH19I=jxEtk5iL-H|`6Fy(OMg;|a#l*4h&k*6HC0CSOvO{+9y05xO)G=$}f z6Z}B^W6n>z;1!U=V`9%Bnurlco(9NF0}K(|sSXrk4WY?h&{cGT^I;x zXpl^i&*nqWptCm@Fz8nQpX1~yAWZ5Pyc@@#{rTYVsrgFp@JlG@$Fs0*rt;Y-Jym&h z*46xw3Htb(<2^G~{yWlqX~md4Dv#HGQZb=^yeYM@VNy$N+&^1-0Cec?i3#cb)8l7m zy#6~PNd0`prn}n2bMGfo75+OffeuVun!Gw&acF6c{6BE*FdfG64DQ#{<SvcJZFunIOAfgNc_)N$cMa%j@M=fm65c}X$MFBXDh>Fc$gQ!^F z7cg`A5D-LELf*~on`%#09(v$9{1lchqj$Jb;U#18eqqA>jPTde{_iOhX|KgZ+7G*? zSAaZ;KH0D}ykdQShjRvzp!NB_2uk%TLBX$2SJaH8tanHZLTE2j@YO*`rt=w)XYQ$*r>#h%spBLv3PLL2Mx2W_Ap?+^2h_%(cg

~J?w+UZZpVWs$p5z>+j^7Aa0a%f>ok`JrMlP-OiUQ|ODd#r;PVQ8rbpJmXLvS)0d$t5gbWh;BDNyEfi3oex3R?_2g-N` za%2)Bh_P|C0vOxu{uNBo{vAjr=s#?Mi{`n?6RFA*UslXio=8^)W?g3&oes-|E%K!7 ztne)%Wv>h0Fgm}@KP5u62_4IXFDqXWM0fF`lT=iV9UeVAelhLYJ>%N_-O2`*JQU=^ zUwgcBo|=@WW}>@uDbK;Q=g?QKLyLBp z_S==pZ2ECM7~+T1+}PggC7V#fJl0gX}2V`EEP*q^-{4-s$MR2NG;119;s@1cd2xIsa6EyT18e| zCDQTC(zu|%jGlvv?n81D$s0(XLxPd5Q544ilM&VVZKZxXl%4kf0o%I(y8r+H literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/mpremote/__pycache__/transport_serial.cpython-312.pyc b/.venv/lib/python3.12/site-packages/mpremote/__pycache__/transport_serial.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..065f9d4f09ec971e3adfeaf3624ef1cfd628fa8f GIT binary patch literal 41141 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 total_size: + # Clear progress bar when copy completes + print("\r" + " " * (13 + len(op) + bar_length) + "\r", end="") + else: + bar = size * bar_length // total_size + progress = size * 100 // total_size + print( + "\r ... {} {:3d}% [{}{}]".format(op, progress, "#" * bar, "-" * (bar_length - bar)), + end="", + ) + + +def _remote_path_join(a, *b): + if not a: + a = "./" + result = a.rstrip("/") + for x in b: + result += "/" + x.strip("/") + return result + + +def _remote_path_dirname(a): + a = a.rsplit("/", 1) + if len(a) == 1: + return "" + else: + return a[0] + + +def _remote_path_basename(a): + return a.rsplit("/", 1)[-1] + + +def do_filesystem_cp(state, src, dest, multiple, check_hash=False): + if dest.startswith(":"): + dest_no_slash = dest.rstrip("/" + os.path.sep + (os.path.altsep or "")) + dest_exists = state.transport.fs_exists(dest_no_slash[1:]) + dest_isdir = dest_exists and state.transport.fs_isdir(dest_no_slash[1:]) + + # A trailing / on dest forces it to be a directory. + if dest != dest_no_slash: + if not dest_isdir: + raise CommandError("cp: destination is not a directory") + dest = dest_no_slash + else: + dest_exists = os.path.exists(dest) + dest_isdir = dest_exists and os.path.isdir(dest) + + if multiple: + if not dest_exists: + raise CommandError("cp: destination does not exist") + if not dest_isdir: + raise CommandError("cp: destination is not a directory") + + # Download the contents of source. + try: + if src.startswith(":"): + data = state.transport.fs_readfile(src[1:], progress_callback=show_progress_bar) + filename = _remote_path_basename(src[1:]) + else: + with open(src, "rb") as f: + data = f.read() + filename = os.path.basename(src) + except IsADirectoryError: + raise CommandError("cp: -r not specified; omitting directory") + + # Write back to dest. + if dest.startswith(":"): + # If the destination path is just the directory, then add the source filename. + if dest_isdir: + dest = ":" + _remote_path_join(dest[1:], filename) + + # Skip copy if the destination file is identical. + if check_hash: + try: + remote_hash = state.transport.fs_hashfile(dest[1:], "sha256") + source_hash = hashlib.sha256(data).digest() + # remote_hash will be None if the device doesn't support + # hashlib.sha256 (and therefore won't match). + if remote_hash == source_hash: + print("Up to date:", dest[1:]) + return + except OSError: + pass + + # Write to remote. + state.transport.fs_writefile(dest[1:], data, progress_callback=show_progress_bar) + else: + # If the destination path is just the directory, then add the source filename. + if dest_isdir: + dest = os.path.join(dest, filename) + + # Write to local file. + with open(dest, "wb") as f: + f.write(data) + + +def do_filesystem_recursive_cp(state, src, dest, multiple, check_hash): + # Ignore trailing / on both src and dest. (Unix cp ignores them too) + src = src.rstrip("/" + os.path.sep + (os.path.altsep if os.path.altsep else "")) + dest = dest.rstrip("/" + os.path.sep + (os.path.altsep if os.path.altsep else "")) + + # If the destination directory exists, then we copy into it. Otherwise we + # use the destination as the target. + if dest.startswith(":"): + dest_exists = state.transport.fs_exists(dest[1:]) + else: + dest_exists = os.path.exists(dest) + + # Recursively find all files to copy from a directory. + # `dirs` will be a list of dest split paths. + # `files` will be a list of `(dest split path, src joined path)`. + dirs = [] + files = [] + + # For example, if src=/tmp/foo, with /tmp/foo/x.py and /tmp/foo/a/b/c.py, + # and if the destination directory exists, then we will have: + # dirs = [['foo'], ['foo', 'a'], ['foo', 'a', 'b']] + # files = [(['foo', 'x.py'], '/tmp/foo/x.py'), (['foo', 'a', 'b', 'c.py'], '/tmp/foo/a/b/c.py')] + # If the destination doesn't exist, then we will have: + # dirs = [['a'], ['a', 'b']] + # files = [(['x.py'], '/tmp/foo/x.py'), (['a', 'b', 'c.py'], '/tmp/foo/a/b/c.py')] + + def _list_recursive(base, src_path, dest_path, src_join_fun, src_isdir_fun, src_listdir_fun): + src_path_joined = src_join_fun(base, *src_path) + if src_isdir_fun(src_path_joined): + if dest_path: + dirs.append(dest_path) + for entry in src_listdir_fun(src_path_joined): + _list_recursive( + base, + src_path + [entry], + dest_path + [entry], + src_join_fun, + src_isdir_fun, + src_listdir_fun, + ) + else: + files.append( + ( + dest_path, + src_path_joined, + ) + ) + + if src.startswith(":"): + src_dirname = [_remote_path_basename(src[1:])] + dest_dirname = src_dirname if dest_exists else [] + _list_recursive( + _remote_path_dirname(src[1:]), + src_dirname, + dest_dirname, + src_join_fun=_remote_path_join, + src_isdir_fun=state.transport.fs_isdir, + src_listdir_fun=lambda p: [x.name for x in state.transport.fs_listdir(p)], + ) + else: + src_dirname = [os.path.basename(src)] + dest_dirname = src_dirname if dest_exists else [] + _list_recursive( + os.path.dirname(src), + src_dirname, + dest_dirname, + src_join_fun=os.path.join, + src_isdir_fun=os.path.isdir, + src_listdir_fun=os.listdir, + ) + + # If no directories were encountered then we must have just had a file. + if not dirs: + return do_filesystem_cp(state, src, dest, multiple, check_hash) + + def _mkdir(a, *b): + try: + if a.startswith(":"): + state.transport.fs_mkdir(_remote_path_join(a[1:], *b)) + else: + os.mkdir(os.path.join(a, *b)) + except FileExistsError: + pass + + # Create the destination if necessary. + if not dest_exists: + _mkdir(dest) + + # Create all sub-directories relative to the destination. + for d in dirs: + _mkdir(dest, *d) + + # Copy all files, in sorted order to help it be deterministic. + files.sort() + for dest_path_split, src_path_joined in files: + if src.startswith(":"): + src_path_joined = ":" + src_path_joined + + if dest.startswith(":"): + dest_path_joined = ":" + _remote_path_join(dest[1:], *dest_path_split) + else: + dest_path_joined = os.path.join(dest, *dest_path_split) + + do_filesystem_cp(state, src_path_joined, dest_path_joined, False, check_hash) + + +def do_filesystem_recursive_rm(state, path, args): + if state.transport.fs_isdir(path): + if state.transport.mounted: + r_cwd = state.transport.eval("os.getcwd()") + abs_path = os.path.normpath( + os.path.join(r_cwd, path) if not os.path.isabs(path) else path + ) + if isinstance(state.transport, SerialTransport) and abs_path.startswith( + f"{SerialTransport.fs_hook_mount}/" + ): + raise CommandError( + f"rm -r not permitted on {SerialTransport.fs_hook_mount} directory" + ) + for entry in state.transport.fs_listdir(path): + do_filesystem_recursive_rm(state, _remote_path_join(path, entry.name), args) + if path: + try: + state.transport.fs_rmdir(path) + if args.verbose: + print(f"removed directory: '{path}'") + except OSError as e: + if e.errno != errno.EINVAL: # not vfs mountpoint + raise CommandError( + f"rm -r: cannot remove :{path} {os.strerror(e.errno) if e.errno else ''}" + ) from e + if args.verbose: + print(f"skipped: '{path}' (vfs mountpoint)") + else: + state.transport.fs_rmfile(path) + if args.verbose: + print(f"removed: '{path}'") + + +def human_size(size, decimals=1): + for unit in ["B", "K", "M", "G", "T"]: + if size < 1024.0 or unit == "T": + break + size /= 1024.0 + return f"{size:.{decimals}f}{unit}" if unit != "B" else f"{int(size)}" + + +def do_filesystem_tree(state, path, args): + """Print a tree of the device's filesystem starting at path.""" + connectors = ("├── ", "└── ") + + def _tree_recursive(path, prefix=""): + entries = state.transport.fs_listdir(path) + entries.sort(key=lambda e: e.name) + for i, entry in enumerate(entries): + connector = connectors[1] if i == len(entries) - 1 else connectors[0] + is_dir = entry.st_mode & 0x4000 # Directory + size_str = "" + # most MicroPython filesystems don't support st_size on directories, reduce clutter + if entry.st_size > 0 or not is_dir: + if args.size: + size_str = f"[{entry.st_size:>9}] " + elif args.human: + size_str = f"[{human_size(entry.st_size):>6}] " + print(f"{prefix}{connector}{size_str}{entry.name}") + if is_dir: + _tree_recursive( + _remote_path_join(path, entry.name), + prefix + (" " if i == len(entries) - 1 else "│ "), + ) + + if not path or path == ".": + path = state.transport.exec("import os;print(os.getcwd())").strip().decode("utf-8") + if not (path == "." or state.transport.fs_isdir(path)): + raise CommandError(f"tree: '{path}' is not a directory") + if args.verbose: + print(f":{path} on {state.transport.device_name}") + else: + print(f":{path}") + _tree_recursive(path) + + +def do_filesystem(state, args): + state.ensure_raw_repl() + state.did_action() + + command = args.command[0] + paths = args.path + + if command == "cat": + # Don't do verbose output for `cat` unless explicitly requested. + verbose = args.verbose is True + else: + verbose = args.verbose is not False + + if command == "cp": + # Note: cp requires the user to specify local/remote explicitly via + # leading ':'. + + # The last argument must be the destination. + if len(paths) <= 1: + raise CommandError("cp: missing destination path") + cp_dest = paths[-1] + paths = paths[:-1] + else: + # All other commands implicitly use remote paths. Strip the + # leading ':' if the user included them. + paths = [path[1:] if path.startswith(":") else path for path in paths] + + # ls and tree implicitly lists the cwd. + if command in ("ls", "tree") and not paths: + paths = [""] + + try: + # Handle each path sequentially. + for path in paths: + if verbose: + if command == "cp": + print("{} {} {}".format(command, path, cp_dest)) + else: + print("{} :{}".format(command, path)) + + if command == "cat": + state.transport.fs_printfile(path) + elif command == "ls": + for result in state.transport.fs_listdir(path): + print( + "{:12} {}{}".format( + result.st_size, result.name, "/" if result.st_mode & 0x4000 else "" + ) + ) + elif command == "mkdir": + state.transport.fs_mkdir(path) + elif command == "rm": + if args.recursive: + do_filesystem_recursive_rm(state, path, args) + else: + state.transport.fs_rmfile(path) + elif command == "rmdir": + state.transport.fs_rmdir(path) + elif command == "touch": + state.transport.fs_touchfile(path) + elif command.endswith("sum") and command[-4].isdigit(): + digest = state.transport.fs_hashfile(path, command[:-3]) + print(digest.hex()) + elif command == "cp": + if args.recursive: + do_filesystem_recursive_cp( + state, path, cp_dest, len(paths) > 1, not args.force + ) + else: + do_filesystem_cp(state, path, cp_dest, len(paths) > 1, not args.force) + elif command == "tree": + do_filesystem_tree(state, path, args) + except OSError as er: + raise CommandError("{}: {}: {}.".format(command, er.strerror, os.strerror(er.errno))) + except TransportError as er: + raise CommandError("Error with transport:\n{}".format(er.args[0])) + + +def do_edit(state, args): + state.ensure_raw_repl() + state.did_action() + + if not os.getenv("EDITOR"): + raise CommandError("edit: $EDITOR not set") + for src in args.files: + src = src.lstrip(":") + dest_fd, dest = tempfile.mkstemp(suffix=os.path.basename(src)) + try: + print("edit :%s" % (src,)) + state.transport.fs_touchfile(src) + data = state.transport.fs_readfile(src, progress_callback=show_progress_bar) + with open(dest_fd, "wb") as f: + f.write(data) + if os.system('%s "%s"' % (os.getenv("EDITOR"), dest)) == 0: + with open(dest, "rb") as f: + state.transport.fs_writefile( + src, f.read(), progress_callback=show_progress_bar + ) + finally: + os.unlink(dest) + + +def _do_execbuffer(state, buf, follow): + state.ensure_raw_repl() + state.did_action() + + try: + state.transport.exec_raw_no_follow(buf) + if follow: + ret, ret_err = state.transport.follow(timeout=None, data_consumer=stdout_write_bytes) + if ret_err: + stdout_write_bytes(ret_err) + sys.exit(1) + except TransportError as er: + raise CommandError(er.args[0]) + except KeyboardInterrupt: + sys.exit(1) + + +def do_exec(state, args): + _do_execbuffer(state, args.expr[0], args.follow) + + +def do_eval(state, args): + buf = "print(" + args.expr[0] + ")" + _do_execbuffer(state, buf, True) + + +def do_run(state, args): + filename = args.path[0] + try: + with open(filename, "rb") as f: + buf = f.read() + except OSError: + raise CommandError(f"could not read file '{filename}'") + _do_execbuffer(state, buf, args.follow) + + +def do_mount(state, args): + state.ensure_raw_repl() + path = args.path[0] + state.transport.mount_local(path, unsafe_links=args.unsafe_links) + print(f"Local directory {path} is mounted at /remote") + + +def do_umount(state, path): + state.ensure_raw_repl() + state.transport.umount_local() + + +def do_resume(state, _args=None): + state._auto_soft_reset = False + + +def do_soft_reset(state, _args=None): + state.ensure_raw_repl(soft_reset=True) + state.did_action() + + +def do_rtc(state, args): + state.ensure_raw_repl() + state.did_action() + + state.transport.exec("import machine") + + if args.set: + import datetime + + now = datetime.datetime.now() + timetuple = "({}, {}, {}, {}, {}, {}, {}, {})".format( + now.year, + now.month, + now.day, + now.weekday(), + now.hour, + now.minute, + now.second, + now.microsecond, + ) + state.transport.exec("machine.RTC().datetime({})".format(timetuple)) + else: + print(state.transport.eval("machine.RTC().datetime()")) + + +def _do_romfs_query(state, args): + state.ensure_raw_repl() + state.did_action() + + # Detect the romfs and get its associated device. + state.transport.exec("import vfs") + if not state.transport.eval("hasattr(vfs,'rom_ioctl')"): + print("ROMFS is not enabled on this device") + return + num_rom_partitions = state.transport.eval("vfs.rom_ioctl(1)") + if num_rom_partitions <= 0: + print("No ROMFS partitions available") + return + + for rom_id in range(num_rom_partitions): + state.transport.exec(f"dev=vfs.rom_ioctl(2,{rom_id})") + has_object = state.transport.eval("hasattr(dev,'ioctl')") + if has_object: + rom_block_count = state.transport.eval("dev.ioctl(4,0)") + rom_block_size = state.transport.eval("dev.ioctl(5,0)") + rom_size = rom_block_count * rom_block_size + print( + f"ROMFS{rom_id} partition has size {rom_size} bytes ({rom_block_count} blocks of {rom_block_size} bytes each)" + ) + else: + rom_size = state.transport.eval("len(dev)") + print(f"ROMFS{rom_id} partition has size {rom_size} bytes") + romfs = state.transport.eval("bytes(memoryview(dev)[:12])") + print(f" Raw contents: {romfs.hex(':')} ...") + if not romfs.startswith(b"\xd2\xcd\x31"): + print(" Not a valid ROMFS") + else: + size = 0 + for value in romfs[3:]: + size = (size << 7) | (value & 0x7F) + if not value & 0x80: + break + print(f" ROMFS image size: {size}") + + +def _do_romfs_build(state, args): + state.did_action() + + if args.path is None: + raise CommandError("romfs build: source path not given") + + input_directory = args.path + + if args.output is None: + output_file = input_directory + ".romfs" + else: + output_file = args.output + + romfs = make_romfs(input_directory, mpy_cross=args.mpy) + + print(f"Writing {len(romfs)} bytes to output file {output_file}") + with open(output_file, "wb") as f: + f.write(romfs) + + +def _do_romfs_deploy(state, args): + state.ensure_raw_repl() + state.did_action() + transport = state.transport + + if args.path is None: + raise CommandError("romfs deploy: source path not given") + + rom_id = args.partition + romfs_filename = args.path + + # Read in or create the ROMFS filesystem image. + if os.path.isfile(romfs_filename) and romfs_filename.endswith((".img", ".romfs")): + with open(romfs_filename, "rb") as f: + romfs = f.read() + else: + romfs = make_romfs(romfs_filename, mpy_cross=args.mpy) + print(f"Image size is {len(romfs)} bytes") + + # Detect the ROMFS partition and get its associated device. + state.transport.exec("import vfs") + if not state.transport.eval("hasattr(vfs,'rom_ioctl')"): + raise CommandError("ROMFS is not enabled on this device") + transport.exec(f"dev=vfs.rom_ioctl(2,{rom_id})") + if transport.eval("isinstance(dev,int) and dev<0"): + raise CommandError(f"ROMFS{rom_id} partition not found on device") + has_object = transport.eval("hasattr(dev,'ioctl')") + if has_object: + rom_block_count = transport.eval("dev.ioctl(4,0)") + rom_block_size = transport.eval("dev.ioctl(5,0)") + rom_size = rom_block_count * rom_block_size + print( + f"ROMFS{rom_id} partition has size {rom_size} bytes ({rom_block_count} blocks of {rom_block_size} bytes each)" + ) + else: + rom_size = transport.eval("len(dev)") + print(f"ROMFS{rom_id} partition has size {rom_size} bytes") + + # Check if ROMFS image is valid + if not romfs.startswith(VfsRomWriter.ROMFS_HEADER): + print("Invalid ROMFS image") + sys.exit(1) + + # Check if ROMFS filesystem image will fit in the target partition. + if len(romfs) > rom_size: + print("ROMFS image is too big for the target partition") + sys.exit(1) + + # Prepare ROMFS partition for writing. + print(f"Preparing ROMFS{rom_id} partition for writing") + transport.exec("import vfs\ntry:\n vfs.umount('/rom')\nexcept:\n pass") + chunk_size = 4096 + if has_object: + for offset in range(0, len(romfs), rom_block_size): + transport.exec(f"dev.ioctl(6,{offset // rom_block_size})") + chunk_size = min(chunk_size, rom_block_size) + else: + rom_min_write = transport.eval(f"vfs.rom_ioctl(3,{rom_id},{len(romfs)})") + chunk_size = max(chunk_size, rom_min_write) + + # Detect capabilities of the device to use the fastest method of transfer. + has_bytes_fromhex = transport.eval("hasattr(bytes,'fromhex')") + try: + transport.exec("from binascii import a2b_base64") + has_a2b_base64 = True + except TransportExecError: + has_a2b_base64 = False + try: + transport.exec("from io import BytesIO") + transport.exec("from deflate import DeflateIO,RAW") + has_deflate_io = True + except TransportExecError: + has_deflate_io = False + + # Deploy the ROMFS filesystem image to the device. + for offset in range(0, len(romfs), chunk_size): + romfs_chunk = romfs[offset : offset + chunk_size] + romfs_chunk += bytes(chunk_size - len(romfs_chunk)) + if has_deflate_io: + # Needs: binascii.a2b_base64, io.BytesIO, deflate.DeflateIO. + compressor = zlib.compressobj(wbits=-9) + romfs_chunk_compressed = compressor.compress(romfs_chunk) + romfs_chunk_compressed += compressor.flush() + buf = binascii.b2a_base64(romfs_chunk_compressed).strip() + transport.exec(f"buf=DeflateIO(BytesIO(a2b_base64({buf})),RAW,9).read()") + elif has_a2b_base64: + # Needs: binascii.a2b_base64. + buf = binascii.b2a_base64(romfs_chunk) + transport.exec(f"buf=a2b_base64({buf})") + elif has_bytes_fromhex: + # Needs: bytes.fromhex. + buf = romfs_chunk.hex() + transport.exec(f"buf=bytes.fromhex('{buf}')") + else: + # Needs nothing special. + transport.exec("buf=" + repr(romfs_chunk)) + print(f"\rWriting at offset {offset}", end="") + if has_object: + transport.exec( + f"dev.writeblocks({offset // rom_block_size},buf,{offset % rom_block_size})" + ) + else: + transport.exec(f"vfs.rom_ioctl(4,{rom_id},{offset},buf)") + + # Complete writing. + if not has_object: + transport.eval(f"vfs.rom_ioctl(5,{rom_id})") + + print() + print("ROMFS image deployed") + + +def do_romfs(state, args): + if args.command[0] == "query": + _do_romfs_query(state, args) + elif args.command[0] == "build": + _do_romfs_build(state, args) + elif args.command[0] == "deploy": + _do_romfs_deploy(state, args) + else: + raise CommandError( + f"romfs: '{args.command[0]}' is not a command; pass romfs --help for a list" + ) diff --git a/.venv/lib/python3.12/site-packages/mpremote/console.py b/.venv/lib/python3.12/site-packages/mpremote/console.py new file mode 100644 index 0000000..e34fd9e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote/console.py @@ -0,0 +1,176 @@ +import sys, time + +try: + import select, termios +except ImportError: + termios = None + select = None + import msvcrt, signal + + +class ConsolePosix: + def __init__(self): + self.infd = sys.stdin.fileno() + self.infile = sys.stdin.buffer + self.outfile = sys.stdout.buffer + if hasattr(self.infile, "raw"): + self.infile = self.infile.raw + if hasattr(self.outfile, "raw"): + self.outfile = self.outfile.raw + + self.orig_attr = termios.tcgetattr(self.infd) + + def enter(self): + # attr is: [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] + attr = termios.tcgetattr(self.infd) + attr[0] &= ~( + termios.BRKINT | termios.ICRNL | termios.INPCK | termios.ISTRIP | termios.IXON + ) + attr[1] = 0 + attr[2] = attr[2] & ~(termios.CSIZE | termios.PARENB) | termios.CS8 + attr[3] = 0 + attr[6][termios.VMIN] = 1 + attr[6][termios.VTIME] = 0 + termios.tcsetattr(self.infd, termios.TCSANOW, attr) + + def exit(self): + termios.tcsetattr(self.infd, termios.TCSANOW, self.orig_attr) + + def waitchar(self, pyb_serial): + # TODO pyb_serial might not have fd + select.select([self.infd, pyb_serial.fd], [], []) + + def readchar(self): + res = select.select([self.infd], [], [], 0) + if res[0]: + return self.infile.read(1) + else: + return None + + def write(self, buf): + self.outfile.write(buf) + + +class ConsoleWindows: + KEY_MAP = { + b"H": b"A", # UP + b"P": b"B", # DOWN + b"M": b"C", # RIGHT + b"K": b"D", # LEFT + b"G": b"H", # POS1 + b"O": b"F", # END + b"Q": b"6~", # PGDN + b"I": b"5~", # PGUP + b"s": b"1;5D", # CTRL-LEFT, + b"t": b"1;5C", # CTRL-RIGHT, + b"\x8d": b"1;5A", # CTRL-UP, + b"\x91": b"1;5B", # CTRL-DOWN, + b"w": b"1;5H", # CTRL-POS1 + b"u": b"1;5F", # CTRL-END + b"\x98": b"1;3A", # ALT-UP, + b"\xa0": b"1;3B", # ALT-DOWN, + b"\x9d": b"1;3C", # ALT-RIGHT, + b"\x9b": b"1;3D", # ALT-LEFT, + b"\x97": b"1;3H", # ALT-POS1, + b"\x9f": b"1;3F", # ALT-END, + b"S": b"3~", # DEL, + b"\x93": b"3;5~", # CTRL-DEL + b"R": b"2~", # INS + b"\x92": b"2;5~", # CTRL-INS + b"\x94": b"Z", # Ctrl-Tab = BACKTAB, + } + + def __init__(self): + self.ctrl_c = 0 + + def _sigint_handler(self, signo, frame): + self.ctrl_c += 1 + + def enter(self): + signal.signal(signal.SIGINT, self._sigint_handler) + + def exit(self): + signal.signal(signal.SIGINT, signal.SIG_DFL) + + def inWaiting(self): + return 1 if self.ctrl_c or msvcrt.kbhit() else 0 + + def waitchar(self, pyb_serial): + while not (self.inWaiting() or pyb_serial.inWaiting()): + time.sleep(0.01) + + def readchar(self): + if self.ctrl_c: + self.ctrl_c -= 1 + return b"\x03" + if msvcrt.kbhit(): + ch = msvcrt.getch() + while ch in b"\x00\xe0": # arrow or function key prefix? + if not msvcrt.kbhit(): + return None + ch = msvcrt.getch() # second call returns the actual key code + try: + ch = b"\x1b[" + self.KEY_MAP[ch] + except KeyError: + return None + return ch + + def write(self, buf): + buf = buf.decode() if isinstance(buf, bytes) else buf + sys.stdout.write(buf) + sys.stdout.flush() + # for b in buf: + # if isinstance(b, bytes): + # msvcrt.putch(b) + # else: + # msvcrt.putwch(b) + + +if termios: + Console = ConsolePosix + VT_ENABLED = True +else: + Console = ConsoleWindows + + # Windows VT mode ( >= win10 only) + # https://bugs.python.org/msg291732 + import ctypes, os + from ctypes import wintypes + + kernel32 = ctypes.WinDLL("kernel32", use_last_error=True) + + ERROR_INVALID_PARAMETER = 0x0057 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + + def _check_bool(result, func, args): + if not result: + raise ctypes.WinError(ctypes.get_last_error()) + return args + + LPDWORD = ctypes.POINTER(wintypes.DWORD) + kernel32.GetConsoleMode.errcheck = _check_bool + kernel32.GetConsoleMode.argtypes = (wintypes.HANDLE, LPDWORD) + kernel32.SetConsoleMode.errcheck = _check_bool + kernel32.SetConsoleMode.argtypes = (wintypes.HANDLE, wintypes.DWORD) + + def set_conout_mode(new_mode, mask=0xFFFFFFFF): + # don't assume StandardOutput is a console. + # open CONOUT$ instead + fdout = os.open("CONOUT$", os.O_RDWR) + try: + hout = msvcrt.get_osfhandle(fdout) + old_mode = wintypes.DWORD() + kernel32.GetConsoleMode(hout, ctypes.byref(old_mode)) + mode = (new_mode & mask) | (old_mode.value & ~mask) + kernel32.SetConsoleMode(hout, mode) + return old_mode.value + finally: + os.close(fdout) + + # def enable_vt_mode(): + mode = mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING + try: + set_conout_mode(mode, mask) + VT_ENABLED = True + except WindowsError: + VT_ENABLED = False diff --git a/.venv/lib/python3.12/site-packages/mpremote/main.py b/.venv/lib/python3.12/site-packages/mpremote/main.py new file mode 100644 index 0000000..b31186b --- /dev/null +++ b/.venv/lib/python3.12/site-packages/mpremote/main.py @@ -0,0 +1,636 @@ +""" +MicroPython Remote - Interaction and automation tool for MicroPython +MIT license; Copyright (c) 2019-2022 Damien P. George + +This program provides a set of utilities to interact with and automate a +MicroPython device over a serial connection. Commands supported are: + + mpremote -- auto-detect, connect and enter REPL + mpremote -- connect to given device + mpremote connect -- connect to given device + mpremote disconnect -- disconnect current device + mpremote mount -- mount local directory on device + mpremote eval -- evaluate and print the string + mpremote exec -- execute the string + mpremote run